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

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

Barbara Streisand
풀어 주다: 2024-12-11 13:02:11
원래의
779명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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