ホームページ >バックエンド開発 >C++ >浮動小数点加算が必ずしも結合法則に従わないのはなぜですか?

浮動小数点加算が必ずしも結合法則に従わないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-14 17:51:10864ブラウズ

Why Does Floating-Point Addition Not Always Follow the Associative Law?

浮動小数点演算: 問題の結合性

数学的演算に関して言えば、結合性はオペランドの順序が演算に影響しないことを示します。結果。ただし、浮動小数点演算の領域では、結合性が常に成り立つわけではありません。これは、プログラマーが直面する一般的な問題で示されているように、予期しない結果につながる可能性があります。

次の例を考えてみましょう:

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。