浮動小数点演算の結合性
プログラミングの分野では、浮動小数点数は実数値を表すためによく使用されます。ただし、これらの浮動小数点値に対する加算と乗算の基本的な演算は、常に期待どおりに動作するとは限りません。
よく生じる疑問は、浮動小数点の加算と乗算が結合的であるかどうかです。結合性は、オペランドの加算または乗算の順序が最終結果に影響を与えないことを意味します。確かに乗算は浮動小数点数に対して結合的ですが、加算はそうではありません。
この結合性の欠如は、次のコードを観察すると明らかです:
cout << ((0.7 + 0.2 + 0.1) == 1) << endl; //output is 0 cout << ((0.7 + 0.1 + 0.2) == 1) << endl; //output is 1
この不可解な動作は、固有の不正確さから生じます。浮動小数点数の。複数の数値を加算する場合、加算が実行される順序によっては、丸め誤差により結果が若干異なる場合があります。
独創的な論文「浮動小数点演算についてすべてのコンピュータ科学者が知っておくべきこと」では、この問題について次のように説明されています。
「もう 1 つのグレーゾーンは括弧の解釈に関するものです。丸め誤差があるため、代数の結合法則は必ずしも当てはまりません。たとえば、式 (x y) z は、x = 1e30、y = -1e30、z = 1 の場合、x (y z) とはまったく異なる答えになります (前者の場合は 1、後者の場合は 0)。 ). "
したがって、浮動小数点加算の結合性に依存する場合は注意が必要です。オペランドを追加する順序によって結果が微妙に変化し、予期しない動作が発生する可能性があります。
以上が浮動小数点加算は結合的ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。