对于小于双倍范围的值,启用boost :: lexical_cast会超出范围错误

时间:2016-03-15 10:18:51

标签: c++ boost lexical-cast

boost::lexical_cast会因大于double的最大值而抛出错误。但是对于小于最小值的数字,它会默默地将其设为零。如何在以后的情况下启用超出范围的错误(即,如果数字小于2.22507e-308,那么解析器应该抛出一些错误)?

#include <iostream>
#include <limits>
#include <boost/lexical_cast.hpp>

int main()
{
    std::cout<<boost::lexical_cast<long double>("1.5787658476e-400")<<'\n';
    std::cout<<boost::lexical_cast<double>("1.5787658476e-400")<<'\n';
    std::cout<<std::numeric_limits<double>::min()<<'\n';

    try{
        std::cout<<boost::lexical_cast<double>("1.5787658476e+400")<<'\n';
    } catch(boost::bad_lexical_cast &e)
    {
        std::cout<<e.what()<<'\n';
    }
     std::cout<<std::numeric_limits<double>::max()<<'\n';

    return 0;
}

1 个答案:

答案 0 :(得分:2)

我认为这是预期的行为。

您可以检查号码是否完全往返。但总的来说,十进制表示并不完全对应于二进制表示,因此在一般情况下(任何十进制输入有效),它都会变得棘手并且无法正常运行。

使用十进制数字类型可以实现更好的往返安全性,例如: boost::multiprecision::cpp_dec_float