数値計算の領域では、精度の維持と丸め誤差の制御が非常に重要です。 IEEE 754 浮動小数点数は、実数を表現および操作するための標準化されたメカニズムを提供すると同時に、さまざまな精度要件に対応するためのさまざまな丸めモードを提供します。
この質問では、IEEE 754 浮動小数点の丸めモードを変更するための最も効率的なアプローチについて詳しく説明します。 -ポイント番号。主な焦点はポータブル C ソリューションですが、x86 プラットフォーム用のアセンブリ ソリューションも検討されています。
ポータブル C コードの場合、標準ソリューションには
#include <fenv.h> #pragma STDC FENV_ACCESS ON // Store the original rounding mode const int originalRounding = fegetround(); // Establish the desired rounding mode fesetround(FE_TOWARDZERO); // Perform desired operations... // ... // Restore the original mode afterwards fesetround(originalRounding);</p> <h3>アセンブリベースのソリューション:</h3> <p>古いプラットフォームの場合C99 サポートが不足している場合は、アセンブリ ソリューションが必要になる場合があります。このようなシナリオでは、丸めモードの調整には通常、fldcw 命令による x87 ユニットと ldmxcsr 命令による SSE ユニットの両方の制御ビットの変更が含まれます。</p> <h3>MSVC 固有の解決策:</h3> <p>の場合標準ではありませんが便利なオプションである Microsoft Visual C (MSVC) が利用可能です。 _controlfp() 関数を使用して丸めモードを操作できます。</p> <pre class="brush:php;toolbar:false">unsigned int originalRounding = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // Perform desired operations... // ... _controlfp(originalRounding, _MCW_RC);
参考までに、さまざまな丸めモードとそれに対応する C および MSVC の名前を以下に示します。 :
Rounding Mode | C Name | MSVC Name |
---|---|---|
To nearest | FE_TONEAREST | _RC_NEAR |
Toward zero | FE_TOWARDZERO | _RC_CHOP |
To infinity | FE_UPWARD | _RC_UP |
To -infinity | FE_DOWNWARD | _RC_DOWN |
以上がC で IEEE 754 浮動小数点数の丸めモードを効率的に変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。