> 백엔드 개발 > C++ > 본문

C 및 어셈블리에서 부동 소수점 반올림 모드를 효율적으로 조작하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-11-27 04:10:13
원래의
969명이 탐색했습니다.

How Can I Efficiently Manipulate Floating-Point Rounding Modes in C and Assembly?

부동 소수점 반올림 모드 조작: 효율적인 접근 방식

부동 소수점 연산을 향상하려면 반올림 모드를 제어해야 하는 경우가 많습니다. 계산 후 반올림됩니다. 이 기사에서는 휴대용 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿