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

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

Barbara Streisand
Barbara Streisand원래의
2024-12-11 13:02:11769검색

How Can I Efficiently Change the Rounding Mode for IEEE 754 Floating-Point Numbers in C?

IEEE 754 부동 소수점 숫자의 반올림 모드 변경

수치 컴퓨팅 영역에서는 정밀도를 유지하고 반올림 오류를 제어하는 ​​것이 중요합니다. IEEE 754 부동 소수점 숫자는 실수를 표현하고 조작하기 위한 표준화된 메커니즘을 제공하는 동시에 다양한 정밀도 요구 사항을 충족하기 위해 다양한 반올림 모드를 제공합니다.

이 질문은 IEEE 754 부동 소수점의 반올림 모드를 변경하는 가장 효율적인 접근 방식을 탐구합니다. -포인트 번호. x86 플랫폼용 어셈블리 솔루션도 탐색되지만 기본 초점은 이식 가능한 C 솔루션에 있습니다.

C 기반 솔루션:

이식 가능한 C 코드의 경우 표준 솔루션에는 라이브러리를 사용하고 fesetround() 함수를 활용합니다. 이 기능을 사용하면 프로그래머는 원하는 반올림 모드(예: 가장 가까운 방향, 0 방향 또는 양/음의 무한대 방향)를 설정할 수 있습니다.

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

// Store the original rounding mode
const int originalRounding = fegetround();
// Establish the desired rounding mode
fesetround(FE_TOWARDZERO);
// Perform desired operations...
// ...
// Restore the original mode afterwards
fesetround(originalRounding);

어셈블리 기반 솔루션:

이전 플랫폼의 경우 C99 지원이 부족하면 어셈블리 솔루션이 필요할 수 있습니다. 이러한 시나리오에서 반올림 모드를 조정하려면 일반적으로 fldcw 명령을 통해 x87 장치와 ldmxcsr 명령을 통해 SSE 장치 모두에 대한 제어 비트를 수정해야 합니다.

MSVC 관련 솔루션:

의 경우 비표준이지만 편리한 옵션인 Microsoft Visual C(MSVC)를 사용할 수 있습니다. _controlfp() 함수를 활용하여 반올림 모드를 조작할 수 있습니다.

unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// Perform desired operations...
// ...
_controlfp(originalRounding, _MCW_RC);

반올림 모드 디코딩:

참고로 다양한 반올림 모드와 해당 C 및 MSVC 이름이 아래 나열되어 있습니다. :

Rounding Mode C Name MSVC Name
To nearest FE_TONEAREST _RC_NEAR
Toward zero FE_TOWARDZERO _RC_CHOP
To infinity FE_UPWARD _RC_UP
To -infinity FE_DOWNWARD _RC_DOWN

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

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