あなたが尋ねている質問は、あなたが見ている問題とは関係ありません。
使用しているすべてのシステムが、タイプに対して同じ表現double
、つまり64ビットIEEE倍精度である可能性が非常に高くなります。
pow(2, 1000)
(または、より同等に、より明確に、の値pow(2.0, 1000.0)
は2.0 1000です。2の累乗であるため、正確に表すことができますが、大きい数値の相対精度は非常に粗いです。
double
値は通常、10進数で約15桁程度の精度です。
どうやら、printf
Linuxシステムで使用されるのglibc実装は、値の完全な10進表現を出力しようとしますが、他の実装は、15桁程度の有効printf
数字を超える数字の一部またはすべてをゼロに置き換えます。後者はおそらく実装が少し簡単ですが、どちらのアプローチも有効です。
いくつかの異なるシステムでプログラムを実行すると、次の結果が得られます(読みやすくするために行を折りたたんでいます)。
10715086071862673000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000
10715086071862673209484250490600018105614050000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000
10715086071862673209484250490600018105614048117055336074437503883703510511249361
22493198378815695858127594672917553146825187145285692314043598457757469857480393
45677748242309854210746050623711418779541821530464749835819412673987675591655439
46077062914571196477686542167660429831652624386837205668069376
最後はたまたま21000に正確に等しくなります。
印刷する数は非常に大きく、正確に表現できるという点で珍しいものです。glibcは、正確に印刷するために余分な労力を費やしています。しかし、より一般的には、浮動小数点値は不正確になる傾向があり、最初の数桁を超える数字について心配する価値はほとんどありません。
たとえば、を正確に表すpow(2.0, 1000.0) + 1.0
ことはできません。計算しようとすると、おそらくとまったく同じ結果が得られpow(2.0, 1000.0)
ます。