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

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

Susan Sarandon
リリース: 2024-12-20 02:02:09
オリジナル
415 人が閲覧しました

Why Doesn't Floating-Point Addition Always Follow the Associative Law?

浮動小数点演算: 浮動小数点演算の結合性の探索

プログラミングの領域では、浮動小数点数は作業に不可欠です。連続値を使用します。ただし、浮動小数点演算は、特に結合性に関して、学校で習った数学とは異なる動作をすることがあります。

3 つの浮動小数点値を加算し、1 と比較する例を考えてみましょう。

cout << ((0.7 + 0.2 + 0.1) == 1) << endl; // output is 0
cout << ((0.7 + 0.1 + 0.2) == 1) << endl; // output is 1
ログイン後にコピー

興味深いことに、2 つの式は異なる結果を生成します。この矛盾は、浮動小数点加算が常に結合的であるとは限らないという事実に起因します。つまり、値を追加する順序を変更すると、最終結果が変わる可能性があります。

非結合性の現象は、浮動小数点表現の制限により発生します。浮動小数点数は有限ビット数のバイナリ形式を使用するため、精度が制限されます。その結果、浮動小数点数を使用した計算では、複数の演算にわたって累積する丸め誤差が発生する可能性があります。

上の例では、0.7、0.2、0.1 を加算すると、次数に応じてわずかに異なる中間値が生成されます。操作の。これらのわずかな違いはその後の加算を通じて伝播し、最終的には異なる最終結果につながります。

この概念をさらに理解するために、David Goldberg の独創的な論文「浮動小数点演算についてすべてのコンピュータ科学者が知っておくべきこと」の例を考えてみましょう。

(1e30 + -1e30) + 1 = 1, while 1e30 + (-1e30 + 1) = 0
ログイン後にコピー

この場合、括弧が結果に深く影響します。括弧内で 1e30 と -1e30 を加算すると、丸めによりゼロに近い値になり、その後 1 が加算されます。一方、1e30 と -1e30 1 の結果を加算すると、ゼロ以外の値が生成されます。

したがって、浮動小数点演算を使用する場合は、潜在的な非結合性を認識し、式を操作するときに注意することが重要です。加算やその他の結合演算の繰り返しを伴う。

以上が浮動小数点加算が常に結合法則に従わないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート