부동 소수점 반올림 모드 변경
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
'programing' 카테고리의 다른 글
파이썬에서 숫자의 모든 요소를 찾는 가장 효율적인 방법은 무엇입니까? (0) | 2023.06.10 |
---|---|
j이미지 로드 시 콜백 쿼리(이미지가 캐시된 경우에도 마찬가지) (0) | 2023.06.10 |
Firebase Cloud Messaging last collapse_key가 수신되지 않았습니다(요금이 제한됩니까?). (0) | 2023.06.10 |
배열 목록에서 쉼표로 구분된 문자열을 만들려면 어떻게 해야 합니까? (0) | 2023.06.10 |
하나의 활성 세션에서만 ORA-08177을 무작위로 얻습니다. (0) | 2023.06.10 |