>백엔드 개발 >C++ >Visual Studio 2010에서 x86과 x64의 부동 소수점 연산이 다른 이유는 무엇입니까?

Visual Studio 2010에서 x86과 x64의 부동 소수점 연산이 다른 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-01 05:04:27256검색

Why does floating-point arithmetic differ between x86 and x64 in Visual Studio 2010?

x86과 x64 사이의 부동 소수점 산술 불일치

Visual Studio 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 및 x64 아키텍처는 두 번째 표현식인 bLarger2를 다르게 처리합니다. x86 빌드에서는 bLarger2가 true로 평가되고, x64 빌드에서는 false로 평가됩니다. 이러한 불일치는 부동 소수점 연산의 표현식(a * c) 계산에 뿌리를 두고 있습니다.

불일치의 근원

불일치의 근원은 서로 다른 점에 있습니다. 두 아키텍처(x86용 x87 및 x64용 SSE)에서 사용되는 부동 소수점 단위입니다. 두 장치의 근본적인 차이점은 정밀도입니다. x87 장치는 기본적으로 단정밀도보다 높은 정밀도(일반적으로 배정밀도)를 사용하는 반면 SSE 장치는 단정밀도에서만 작동합니다.

불일치 해결

불일치가 발생하면 x87 장치의 정밀도를 SSE 장치의 정밀도와 일치하도록 수동으로 구성할 수 있습니다. 이는 다음을 실행하여 32비트 코드에서 달성할 수 있습니다.

_controlfp(_PC_24, _MCW_PC);

정밀도를 단정밀도로 설정하면 bLarger2 표현식의 (a * c) 평가가 x64의 평가와 일치합니다. 빌드하면 bLarger1과 bLarger2가 모두 false로 설정됩니다.

결론

x86과 x64 빌드 간의 부동 소수점 연산 차이는 뚜렷한 정밀도 수준에서 비롯됩니다. x87 및 SSE 부동 소수점 단위. SSE 장치의 정밀도와 일치하도록 x87 장치의 정밀도를 수동으로 제어함으로써 불일치를 제거하여 두 아키텍처 모두에서 표현식의 일관된 평가를 보장할 수 있습니다.

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

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