有没有一种从字符串中读取double
溢出的好方法,即转换"1e500" -> +inf
?
我知道从字符串中读取的方法:
::std::stringstream
- 溢出时返回垃圾;::boost::lexical_cast
- 抛出 bad_lixecal_cast,没有关于正在转换的数字的有价值信息::std::strtod
fromcstdlib
- afaik 它是唯一一个报告溢出的(通过返回HUGE_VAL
并设置errno
为ERANGE
),但使用它很不方便
特别是我需要一种可靠地将字符串转换为数字(double
)的方法,例如
"1e100" -> 1e100
"1e300" -> 1e300
"1e309" -> +inf // handling overflow as ieee-754 'inf'
编辑:
我实际上使用的是最后一种方法,这里是代码:
double stringToDouble(char const *str)
{
double result = ::std::strtod(str, 0);
if (ERANGE == errno)
{
if (HUGE_VAL == result)
{
result = INFINITY;
}
else if (-HUGE_VAL == result)
{
result = -INFINITY;
}
}
return result;
}
我很惊讶stringstream
不能很好地处理溢出。但它实际上返回一些其他double
值(与正在读取的值无关),并且仅通过 stream::fail() 方式报告。
但我仍然在寻找一些 C++ 方式的数字阅读。