高效修改C 和x86 彙編中的浮點舍入
IEEE 754 浮點數提供各種舍入模式,例如最接近、零、正無窮大和負無窮大。修改舍入模式可以精確控制結果的小數表示形式。
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中文網其他相關文章!