>  기사  >  백엔드 개발  >  x86 아키텍처와 x64 아키텍처 간에 부동 소수점 연산이 다른 결과를 생성하는 이유는 무엇입니까?

x86 아키텍처와 x64 아키텍처 간에 부동 소수점 연산이 다른 결과를 생성하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-03 03:12:29880검색

Why does floating-point arithmetic produce different results between x86 and x64 architectures?

부동 소수점 연산의 불일치: x86 대 x64

부동 소수점 연산과 관련된 코드 조각에서 MS VS 사이에 불일치가 발생합니다. 2010은 x86 및 x64 아키텍처를 대상으로 하는 빌드입니다. 코드는 다음과 같습니다.

float a = 50.0f;
float b = 65.0f;
float c =  1.3f;
float d = a*c;
bool bLarger1 = d < b;
bool bLarger2 = (a*c) < b;

불일치:

  • x86 빌드: 변수 bLarger1이 false입니다(d와 b 모두) 65.0으로 설정됨), bLarger2는 true입니다.
  • x64 Build: bLarger1과 bLarger2는 모두 false입니다.

기본 문제:

이 불일치는 bool bLarger2 = (a*c) < 비;. bool bLarger1 = d < b, 실제로는 곱셈과 비교를 별도로 수행합니다.

부동 소수점 단위의 차이점:

중요한 차이점은 둘이 사용하는 부동 소수점 단위에 있습니다. 아키텍처. x86 아키텍처는 단정밀도(일반적으로 배정밀도)보다 더 높은 정밀도로 계산을 수행하는 x87 부동 소수점 단위를 사용합니다. 이와 대조적으로 x64 아키텍처는 순수 단정밀도 계산을 수행하는 SSE 부동 소수점 단위를 사용합니다.

곱셈에 미치는 영향:

bLarger1 표현식에서, a와 c의 곱셈은 하드웨어 곱셈 명령에 의해 수행됩니다. 이 명령어는 배정밀도 정밀도를 사용하므로 d가 65.0으로 설정됩니다.

그러나 bLarger2 표현식에서는 유형 변환(a*c)으로 인해 곱셈이 명시적으로 단정밀도로 수행됩니다. 결과적으로 (a*c)는 64.999992로 설정됩니다.

x87 정밀 제어:

기본적으로 x87 장치는 배정밀도로 작동합니다. 하지만 _controlfp 함수를 사용하여 단정밀도 계산을 수행하도록 장치를 설득할 수 있습니다.

_controlfp(_PC_24, _MCW_PC);

이 줄을 32비트 코드에 추가하면 bLarger1과 bLarger2가 모두 false로 설정됩니다.

컴파일러 옵션:

최신 버전의 Visual Studio에서는 컴파일러가 32비트 대상에 대해서도 SSE 명령을 내보낼 수 있습니다. 이는 다양한 아키텍처 전반에 걸쳐 부동 소수점 연산의 일관성을 보장합니다.

위 내용은 x86 아키텍처와 x64 아키텍처 간에 부동 소수점 연산이 다른 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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