启用 boost::lexical_cast 以针对小于双范围的值抛出超出范围的错误
Enable boost::lexical_cast to throw out of range error for values smaller than double range
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;
}
我认为这是预期的行为。
您可以检查往返次数是否准确。但一般来说,十进制表示并不完全对应于二进制表示,因此在一般情况下(任何十进制输入都有效),它会很棘手并且不可能正确。
您可以使用十进制数字类型实现更好的往返安全性,例如boost::multiprecision::cpp_dec_float
.
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;
}
我认为这是预期的行为。
您可以检查往返次数是否准确。但一般来说,十进制表示并不完全对应于二进制表示,因此在一般情况下(任何十进制输入都有效),它会很棘手并且不可能正确。
您可以使用十进制数字类型实现更好的往返安全性,例如boost::multiprecision::cpp_dec_float
.