부동 소수점 반올림 동작을 이식 가능하게 조정
IEEE 754 반올림 모드를 수정해야 하는 필요성은 다양한 시나리오에서 발생합니다. 이 기사에서는 이식 가능한 C와 x86 어셈블리 언어를 사용하여 이를 달성하는 효율적인 방법을 설명합니다.
C 솔루션
C99는 반올림 모드를 조작하기 위한 포괄적인 솔루션을 제공합니다.
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Preserve the initial rounding mode const int roundingMode = fegetround(); // Set the desired rounding mode (towards zero) fesetround(FE_TOWARDZERO); // Perform floating-point operations... // Revert to the original rounding mode fesetround(roundingMode); return 0; }
x86 어셈블리 해결 방법
C99를 지원하지 않는 플랫폼에서 x86 어셈블리는 대안을 제공합니다.
x87 부동 소수점 단위: 반올림 모드를 조정하려면 fldcw를 사용하세요.
SSE 장치: ldmxcsr을 사용하여 구성 SIMD 반올림 모드.
MSVC 전용 솔루션
Microsoft Visual C는 비표준 _controlfp() 함수를 제공합니다.
unsigned int roundingMode = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // ... _controlfp(roundingMode, _MCW_RC);
반올림 모드 상수
다음 표는 다음을 제공합니다. 반올림 모드 상수에 대한 참조:
Rounding Mode | C Name | MSVC Name |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Towards Zero | FE_TOWARDZERO | _RC_CHOP |
Positive Infinity | FE_UPWARD | _RC_UP |
Negative Infinity | FE_DOWNWARD | _RC_DOWN |
위 내용은 C 및 어셈블리에서 부동 소수점 반올림 동작을 이식 가능하게 조정하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!