ホームページ > バックエンド開発 > C++ > コンパイラの最適化を有効にすると、浮動小数点丸めコードが異なる結果を生成するのはなぜですか?

コンパイラの最適化を有効にすると、浮動小数点丸めコードが異なる結果を生成するのはなぜですか?

Susan Sarandon
リリース: 2024-11-14 19:39:02
オリジナル
921 人が閲覧しました

Why Does My Floating-Point Rounding Code Produce Different Results with Compiler Optimizations Enabled?

最適化が有効な場合の浮動小数点丸めの不一致: コンパイラのバグまたは最適化のジレンマ?

浮動小数点計算は、特に次の場合に予期しない動作を示すことがよくあります。コンパイラの最適化が有効になっています。次のコード スニペットを考えてみましょう:

#include <cstdlib>
#include <iostream>
#include <cmath>

double round(double v, double digit)
{
    double pow = std::pow(10.0, digit);
    double t = v * pow;
    double r = std::floor(t + 0.5);
    return r / pow;
}

int main()
{
    std::cout << round(4.45, 1) << std::endl;
    std::cout << round(4.55, 1) << std::endl;
}
ログイン後にコピー

期待される出力:

4.5
4.6
ログイン後にコピー

ただし、このコードを g と最適化 (O1 - O3) を使用してコンパイルすると、出力は次のようになります:

4.5
4.5
ログイン後にコピー

不一致の原因:

この不一致は、x86 プロセッサが内部で浮動小数点計算に 80 ビットの拡張精度を使用しているという事実に起因します。ただし、double 変数は通常 64 ビット幅です。浮動小数点値が CPU レジスタからメモリに格納されるとき、浮動小数点値は 80 ビット精度から 64 ビット精度に丸められます。この丸めにより、わずかな誤差が生じる可能性があります。

最適化レベルの影響:

最適化レベルが異なると、浮動小数点値がメモリに保存される頻度に影響を与える可能性があります。最適化レベルが高くなると、この問題がより頻繁に発生します。その結果、丸め誤差がより顕著になります。

解決策:

  1. -ffloat-store GCC オプションを使用します: これこのオプションは、浮動小数点変数をレジスタではなくメモリに格納するようにコンパイラに指示します。これにより、さまざまな最適化レベル間で一貫して丸めが行われるようになります。
  2. long double 型を使用します。 long double は通常、 g 上で 80 ビット幅です。このタイプを使用すると、丸めの問題を完全に回避できます。
  3. 変数ストレージの変更: 丸め誤差を最小限に抑えるために、中間計算結果を変数に保存します。

その他の考慮事項:

  • Intel x86_64 ビルドでは、コンパイラがデフォルトで float と double に SSE レジスタを使用し、拡張精度の必要性がなくなるため、この問題の影響は少なくなります。
  • - mfpmath コンパイラ オプションを使用して、x86_64 ビルドで使用される浮動小数点精度を制御できます。
  • -ffloat-store オプションを常にオンにするかどうかは、特定のアプリケーションとその浮動小数点精度に対する感度によって異なります。重要なアプリケーションの場合、一貫した結果を保証するためにこのオプションを使用することが賢明かもしれません。
  • 潜在的な問題について既存の C コードとライブラリを調査するには時間がかかる場合があります。浮動小数点精度の問題を検出して対処するには、ツールの使用またはテストの実装を検討してください。

以上がコンパイラの最適化を有効にすると、浮動小数点丸めコードが異なる結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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