>백엔드 개발 >C++ >x86 아키텍처와 x64 아키텍처 간에 부동 소수점 연산이 다른 이유는 무엇입니까?

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

Patricia Arquette
Patricia Arquette원래의
2024-11-03 10:05:03984검색

Why Does Floating Point Arithmetic Differ Between x86 and x64 Architectures?

x86과 x64 간의 부동 소수점 산술 차이

x86 및 x64 아키텍처 모두에 대해 MS VS 2010에서 동일한 코드 조각을 실행할 때 (둘 다 64비트 시스템에서 실행됨) 부동 소수점 연산에서 눈에 띄는 차이가 나타났습니다.

다음 코드 조각을 고려하세요.

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 및 x64 빌드 모두에서 bLarger1은 그대로 유지됩니다. false(d는 65.0으로 설정됨) 그러나 x64 빌드에서는 bLarger2가 false인 반면 x86 빌드에서는 true입니다.

bLarger2 = (a * c) < 비. 생성된 코드는 x86에서 평가가 단정밀도보다 높은(일반적으로 배정밀도) x87 단위에서 수행되는 반면, x64에서는 순수 단일 정밀도를 수행하는 x64 단위에서 평가가 수행됨을 보여줍니다. -정밀도 계산.

32비트 장치가 단정밀도로 계산을 수행하도록 하려면 다음 제어 단어를 설정할 수 있습니다.

_controlfp(_PC_24, _MCW_PC);

이렇게 하면 두 부울이 모두 다음으로 설정됩니다. 32비트 프로그램에서는 false입니다.

근본적인 문제는 x87과 SSE 부동 소수점 단위 간의 본질적인 차이에서 비롯됩니다. x87 장치는 단정밀도 유형과 배정밀도 유형 모두에 대해 동일한 명령어를 사용하는 반면, SSE 장치는 각각에 대해 서로 다른 명령어를 사용합니다. 결과적으로, 컴파일러는 SSE 단위의 계산 정밀도에 대해 더 많은 제어권을 행사할 수 있습니다.

전반적으로 x86과 x64 부동 소수점 연산 간의 차이는 각 부동 소수점 단위의 작동 모드에서 발생합니다. 일관된 동작을 보장하려면 32비트 타겟에 대해서도 SSE 명령을 내보내도록 컴파일러를 설득하는 옵션을 탐색하는 것이 좋습니다.

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

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