부동 소수점 반올림 모드 조작: 효율적인 접근 방식
부동 소수점 연산을 향상하려면 반올림 모드를 제어해야 하는 경우가 많습니다. 계산 후 반올림됩니다. 이 기사에서는 휴대용 C 함수와 x86 어셈블리 솔루션 모두에 맞게 반올림 모드를 변경하는 가장 효율적인 기술을 살펴봅니다.
휴대용 C 함수:
C99 표준은 다음을 제공합니다. 반올림 모드를 얻고 설정하기 위한 fegetround() 및 fesetround() 함수. 다음은 사용법을 보여주는 코드 조각입니다.
#include <fenv.h> #pragma STDC FENV_ACCESS ON int main() { // Store the initial rounding mode int originalRounding = fegetround(); // Set the rounding mode to round towards zero fesetround(FE_TOWARDZERO); // Perform calculations and rounding operations // Reset the original rounding mode fesetround(originalRounding); return 0; }
x86 어셈블리 솔루션:
C99 지원이 부족한 플랫폼을 대상으로 하는 경우 x86 어셈블리 지침을 사용하여 반올림 모드를 조작하세요. . 여기에는 x87 장치(fldcw를 통해) 및 SSE(ldmxcsr을 통해)에 대한 설정이 포함됩니다.
MSVC 관련 솔루션:
Microsoft Visual C(MSVC)의 경우, 어셈블리 대신 비표준 _controlfp() 함수 활용 접근 방식.
unsigned int originalRounding = _controlfp(0, 0); _controlfp(_RC_CHOP, _MCW_RC); // Perform calculations and rounding operations _controlfp(originalRounding, _MCW_RC);
반올림 모드 디코더 링:
참고로 다음은 다양한 반올림 모드와 해당 C 및 MSVC 매크로에 대한 디코더 링입니다.
Rounding Mode | C Macro | MSVC Macro |
---|---|---|
Nearest | FE_TONEAREST | _RC_NEAR |
Towards Zero | FE_TOWARDZERO | _RC_CHOP |
Towards Infinity | FE_UPWARD | _RC_UP |
Towards -Infinity | FE_DOWNWARD | _RC_DOWN |
이러한 기술은 부동 소수점 반올림 모드를 제어하는 효율적인 수단을 제공하여 최적화된 계산과 결과입니다.
위 내용은 C 및 어셈블리에서 부동 소수점 반올림 모드를 효율적으로 조작하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!