5

不必要な詳細に立ち入ることなく、浮動小数点数(x86_64)の演算で、同一の入力に基づいて、結果にわずかな変動が返される可能性はありますか?少しでも違いますか?

私は基本的に混沌としたシステムをシミュレートしており、データの小さな変化が目に見える効果をもたらすことを期待しています。ただし、同じデータを使用すると、プログラムの動作が修正されることを期待していました。これはそうではありません。プログラムを実行するたびに、目に見えるが許容できる違いがあります。

どこかに初期化されていない変数を残したと思っています...

私が使用している言語はC++とPythonです。

答え

ラッセルの答えは正しいです。浮動小数点演算は決定論的です。非決定論は、ダングリングポインタによって引き起こされました。

4

2 に答える 2

5

はい、これは可能です。C ++ FAQからの引用:

一部のインストールでは、x == yであっても、cos(x)!= cos(y)であることがわかります。これはタイプミスではありません。ショックを受けていない場合は、もう一度読んでください。何かの正弦は、同じものの正弦と等しくない場合があります。(または、正弦、接線、対数、またはその他の浮動小数点計算。)

なんで?

[F]浮動小数点の計算と比較は、多くの場合、特殊レジスタを含む特殊ハードウェアによって実行され、それらのレジスタには、多くの場合、doubleよりも多くのビットがあります。つまり、中間浮動小数点の計算にはsizeof(double)よりも多くのビットが含まれることが多く、浮動小数点値がRAMに書き込まれると、切り捨てられることが多く、精度がいくらか失われることがよくあります。

于 2012-07-15T07:04:52.843 に答える
4

トーマスの答えとは対照的に、浮動小数点演算は非決定論的ではありません。それらは非常に微妙ですが、初期化されていないメモリや意図的にランダム化されたデータを使用していない場合、特定のプログラムは同じ入力に対して同じ出力を提供する必要があります。

私の最初の質問は、「同じデータ」とはどういう意味ですか?そのデータはどのようにプログラムに入りますか?

于 2012-07-15T08:03:32.527 に答える