programing

부동 소수점 반올림 모드 변경

magicmemo 2023. 6. 10. 08:42
반응형

부동 소수점 반올림 모드 변경

IEEE 754 부동 소수점 번호의 반올림 모드*를 변경하는 가장 효율적인 방법은 무엇입니까?휴대용 C 기능도 좋지만, x86 어셈블리를 사용하는 솔루션도 괜찮습니다.

*가장 가까운 방향, 0 방향, 양/음 무한 방향의 표준 반올림 모드를 말합니다.

표준 C 솔루션은 다음과 같습니다.

#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);
// do whatever you need to do ...

// ... and restore the original mode afterwards
fesetround(originalRounding);

C99 지원이 없는 이전 플랫폼에서는 조립에 의존해야 할 수도 있습니다.이 경우 두 x87 장치 모두에 대해 반올림을 설정할 수 있습니다.fldcw지침) 및 SSE(를 통해)ldmxcsr지침)을 참조하십시오.

편집 MSVC에 대한 어셈블리에 의존할 필요가 없습니다.를 사용할 수 있습니다(완전 비표준)._controlfp( )대신:

unsigned int originalRounding = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);
// do something ...
_controlfp(originalRounding, _MCW_RC);

_controllp()에 대한 자세한 내용은 MSDN을 참조하십시오.

그리고 완전성을 위해 반올림 모드에 대한 매크로 이름에 대한 디코더 링:

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 내부에서 어셈블리를 사용할 수 있습니다.

그러나 등록 크기가 64비트인 경우 32비트로 반올림하면 계산 속도가 빨라집니다.그것은 실제로 그것을 더 느리게 만들 것입니다.64비트 계산은 2-32비트가 아닌 64 마이크로프로세서에서 쉽습니다.저는 당신이 정확히 무엇을 성취하기를 원하는지 모르겠습니다.당신의 기준에 따라 성과가 결정된다는 것을 알고 있습니다.

언급URL : https://stackoverflow.com/questions/6867693/change-floating-point-rounding-mode

반응형