>  기사  >  백엔드 개발  >  C 및 어셈블리에서 부동 소수점 반올림 동작을 이식 가능하게 조정하려면 어떻게 해야 합니까?

C 및 어셈블리에서 부동 소수점 반올림 동작을 이식 가능하게 조정하려면 어떻게 해야 합니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-24 17:34:16906검색

How Can I Portably Adjust Floating-Point Rounding Behavior in C and Assembly?

부동 소수점 반올림 동작을 이식 가능하게 조정

IEEE 754 반올림 모드를 수정해야 하는 필요성은 다양한 시나리오에서 발생합니다. 이 기사에서는 이식 가능한 C와 x86 어셈블리 언어를 사용하여 이를 달성하는 효율적인 방법을 설명합니다.

C 솔루션

C99는 반올림 모드를 조작하기 위한 포괄적인 솔루션을 제공합니다.

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

int main() {
  // Preserve the initial rounding mode
  const int roundingMode = fegetround();

  // Set the desired rounding mode (towards zero)
  fesetround(FE_TOWARDZERO);

  // Perform floating-point operations...

  // Revert to the original rounding mode
  fesetround(roundingMode);

  return 0;
}

x86 어셈블리 해결 방법

C99를 지원하지 않는 플랫폼에서 x86 어셈블리는 대안을 제공합니다.

x87 부동 소수점 단위: 반올림 모드를 조정하려면 fldcw를 사용하세요.

SSE 장치: ldmxcsr을 사용하여 구성 SIMD 반올림 모드.

MSVC 전용 솔루션

Microsoft Visual C는 비표준 _controlfp() 함수를 제공합니다.

unsigned int roundingMode = _controlfp(0, 0);
_controlfp(_RC_CHOP, _MCW_RC);

// ...

_controlfp(roundingMode, _MCW_RC);

반올림 모드 상수

다음 표는 다음을 제공합니다. 반올림 모드 상수에 대한 참조:

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

위 내용은 C 및 어셈블리에서 부동 소수점 반올림 동작을 이식 가능하게 조정하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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