2017-06-24 4 views
0

私の理解では、numeric_limits :: max_digits10は、利用可能な小数点以下の桁数を指定します。しかし、私はこれよりも大きい値に()をてSetPrecisionた場合、それはまだ私にこの最大値を超えたゼロ以外の数字与える:C言語でdouble値の30桁を表示

assert(std::numeric_limits<double>::max_digits10 == 17); 
std::cout << std::setprecision(30) << double(.1) << '\n'; 

をこれがアウト出力します

0.100000000000000005551115123126 

は17を超えての数字ではないです正確であることを信頼されていますか?

ありがとうございました。

+5

必要な読解:[各コンピュータ科学者が浮動小数点演算について知っておくべきこと](0120-17801/806-3568/ncg_goldberg.html) –

+0

倍精度は1.7と定義されていますE +/- 308(15桁)いくつかの数字は308桁まで増やすことができます。しかし、@ ThomasMatthewsが最初に示唆したことを読んでください。 –

+0

'double 'の精度は±10 ^( - 17)のように固定されていないため、数値の値によって異なります。値が大きいほど精度が悪く、数値が小さいほど良い。換言すれば、値の±誤差はその値に対して相対的に決定される。ご覧のとおり、数値xの誤差は約±0.00000000000000005 * x – Pavel

答えて

3

バイナリ固定小数点への二重の仮数(1暗黙を導く)53ビットの変換:

0.00011001100110011001100110011001100110011001100110011010 

これは十進値

30桁

に質問の結果と一致
0.1000000000000000055511151231257827021181583404541015625 

に等しいです

しかし、第54番目のビットとなるものは不明です。これを鳴ったとみなすと可能な値のE、直下上記バイナリ固定小数点数は小数点値を表す

0.000110011001100110011001100110011001100110011001100110001 
0.000110011001100110011001100110011001100110011001100110101 

あろう:

0.099999999999999984734433411404097569175064563751220703125 
0.100000000000000012490009027033011079765856266021728515625 

精度の16又は17桁の数字を意味しています。したがって、精度の30桁は、倍精度数値が最も近い表現ではなく正確な表現であると考える場合にのみ正確です。

関連する問題