double
オーバーフローに関して文字列から読み取る良い方法、つまり convert はあり"1e500" -> +inf
ますか?
私が知っている文字列から読み取る方法:
::std::stringstream
- オーバーフロー時にガベージを返します。::boost::lexical_cast
- 変換中の数値に関する価値のある情報なしで bad_lixecal_cast をスローしました::std::strtod
からcstdlib
- オーバーフローについて報告するのは唯一のものです(に戻っ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++の方法で数値を読み取る方法を探しています。