浮動小数点演算: 問題の結合性
数学的演算に関して言えば、結合性はオペランドの順序が演算に影響しないことを示します。結果。ただし、浮動小数点演算の領域では、結合性が常に成り立つわけではありません。これは、プログラマーが直面する一般的な問題で示されているように、予期しない結果につながる可能性があります。
次の例を考えてみましょう:
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // Output: 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // Output: 1
不可解なことに、1 との比較では、次の順序に応じて異なる結果が生成されます。これに浮動小数点値が加算されます。なぜこのようなことが起こるのでしょうか?
浮動小数点加算の非結合的な性質
この動作の背後にある原因は、浮動小数点演算自体の性質にあります。浮動小数点数は有限のビットを使用して表現されるため、演算の実行時に丸め誤差が発生します。この不正確さは、予想される結合性の法則からの逸脱として現れる可能性があります。
権威ある論文「浮動小数点演算についてすべてのコンピュータ科学者が知っておくべきこと」で説明されているように、次の経験則は次のとおりです。適用:
例:
If x = 1e30, y = -1e30, and z = 1, then: (x + y) + z = 1 x + (y + z) = 0
プログラマへの影響
浮動小数点加算の非結合性を理解する正確なプログラミングには重要です。予期しない結果を避けるために、プログラマは次のガイドラインに従う必要があります:
これらのガイドラインに従うことで、プログラマは、結合性の制限による影響を軽減できます。浮動小数点演算を実行し、正確かつ予測可能なプログラム動作を保証します。
以上が浮動小数点加算が必ずしも結合法則に従わないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。