次のコードは、x86 32ビットマシンでは変数 'e'と 'f'では異なる結果を出力しますが、x86 64ビットマシンでは同じ結果を出力します。どうして?理論的には同じ表現が評価されていますが、技術的にはそうではありません。異なる出力を持つ明らかに同じ数式表現
#include <cstdio>
main()
{
double a,b,c,d,e,f;
a=-8988465674311578540726.0;
b=+8988465674311578540726.0;
c=1925283223.0;
d=4294967296.0;
e=(c/d)*(b-a)+a;
printf("%.80f\n",e);
f=c/d;
f*=(b-a);
f+=a;
printf("%.80f\n",f);
}
注... 32ビットx86コードが 'GCC -m32' で生成することができ、コルドhttps://stackoverflow.com/users/224132/peter-cordes
参照のことも
is boost::random::uniform_real_distribution supposed to be the same across processors?
---更新@PeterおかげユーザMadivad
64 bit output
-930037765265417043968.00000...
-930037765265417043968.00000...
32 bit output
-930037765265416519680.00000...
-930037765265417043968.00000...
「数学的に正しい"出力はこのPythonコードで与えられます
from fractions import Fraction
a=-8988465674311578540726
b=8988465674311578540726
c=1925283223
d=4294967296
print "%.80f" % float(Fraction(c,d)*(b-a)+a)
-930037765265416519680.000...
あなたは何を得ていますか? – Madivad
"次のコードは、32ビットマシンで変数 'e'と 'f'では異なる結果を出力しますが、64ビットマシンでは同じ結果を出力します。 - マシン/マシンクラスの*特定のペアについてはそれを購入しますが、あなたの主張は原則としてサポートすることはできません。 –
@don:私はあなたのRNG質問の解決を終了しました。これは同じ回答です.x87 FPは80ビットの内部精度を持ち、SSE FPは一時的なものでも64ビットの精度を持っています。私はあなたがこれを最初に尋ねたかったと思う:P私はブーストメルセンヌPRNGの整数部分に32時間対64ビットモードで実行すると違いを探して時間を節約することができた。 –