>백엔드 개발 >C++ >C 및 x86 어셈블리에서 IEEE 754 부동 소수점 반올림 모드를 효율적으로 변경하려면 어떻게 해야 합니까?

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

Barbara Streisand
Barbara Streisand원래의
2024-11-29 14:45:12106검색

How Can I Efficiently Change IEEE 754 Floating Point Rounding Modes in C and x86 Assembly?

IEEE 754 부동 소수점 반올림 모드 조작

부동 소수점 연산에는 실제 수학적 결과에 근접하기 위해 숫자를 반올림하는 경우가 많습니다. IEEE 754 표준은 부동 소수점 숫자의 반올림 방법을 결정하는 여러 가지 반올림 모드를 정의합니다. 이 기사에서는 이식 가능한 C 또는 x86 어셈블리 환경에서 반올림 모드를 변경하는 효율적인 방법을 살펴봅니다.

표준 C 솔루션

이식 가능한 C 코드의 경우 솔루션에는 C99 함수 fesetround(), 반올림 모드를 설정할 수 있습니다. 그러나 수정한 후에는 원래 반올림 모드를 복원해야 합니다.

#include <fenv.h>
#pragma STDC FENV_ACCESS ON

int main() {
    int originalRounding = fegetround();
    fesetround(FE_TOWARDZERO);
    // Perform operations

    fesetround(originalRounding);
    return 0;
}

x86 어셈블리 솔루션

C99를 지원하지 않는 이전 플랫폼에서 작업하는 경우 , 반올림 모드를 조작하려면 x86 어셈블리를 사용해야 할 수도 있습니다. 여기에는 x87 장치(fldcw 명령어 사용) 및 SSE(ldmxcsr 명령어 사용) 모두에서 반올림 모드를 설정하는 작업이 포함됩니다.

MSVC 관련 솔루션

MS의 경우 Visual C(MSVC)에는 어셈블리에 대한 대안이 있습니다. 비표준 _controlfp() 함수를 사용하여 반올림 모드를 변경할 수 있습니다.

unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// Do some operations

_controlfp(originalRounding, _MCW_RC);

반올림 모드 상수

반올림 모드를 지정하려면 다음을 수행해야 합니다. 적절한 매크로 상수를 사용하십시오. 다음은 반올림 모드에 대한 표준 C 및 MSVC 이름에 대한 요약입니다.

Rounding Mode C MSVC
Nearest FE_TONEAREST _RC_NEAR
Toward Zero FE_TOWARDZERO _RC_CHOP
Positive Infinity FE_UPWARD _RC_UP
Negative Infinity FE_DOWNWARD _RC_DOWN

위 내용은 C 및 x86 어셈블리에서 IEEE 754 부동 소수점 반올림 모드를 효율적으로 변경하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.