C および x86 アセンブリでの浮動小数点丸めの効率的な変更
IEEE 754 浮動小数点数には、最近接、近似などのさまざまな丸めモードが用意されています。ゼロ、正の無限大、負の無限大。丸めモードを変更すると、結果の 10 進表現を正確に制御できるようになります。
C ソリューション
C 標準ライブラリは、fesetround( ) 関数:
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Save the original rounding mode int originalRounding = fegetround(); // Set the desired rounding mode (e.g., to zero) fesetround(FE_TOWARDZERO); // Perform operations with the adjusted rounding mode // Restore the original rounding mode fesetround(originalRounding); return 0; }
x86 アセンブリ解決策
C99 サポートのないプラットフォームの場合、x86 アセンブリを使用して x87 ユニットと SSE 丸めモードの両方を変更できます。
; x87 unit fldcw [new rounding mode] ; e.g., FNINIT to nearest ; SSE ldmxcsr [new rounding mode] ; e.g., MXCSR_RND_NEAREST
Microsoft Visual C
MSVC は、このために非標準の _controlfp() 関数を提供します。目的:
#include <math.h> int main() { // Save the original rounding mode unsigned int originalRounding = _controlfp(0, 0); // Set the desired rounding mode (e.g., to zero) _controlfp(_RC_CHOP, _MCW_RC); // Perform operations with the adjusted rounding mode // Restore the original rounding mode _controlfp(originalRounding, _MCW_RC); return 0; }
丸めモード デコーダ リング
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Zero | FE_TOWARDZERO | _RC_CHOP |
Infinity | FE_UPWARD | _RC_UP |
-Infinity | FE_DOWNWARD | _RC_DOWN |
以上がC および x86 アセンブリで浮動小数点丸めモードを効率的に制御するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。