"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Visual Studio 2010에서 x86과 x64의 부동 소수점 연산이 다른 이유는 무엇입니까?

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

2024년 11월 15일에 게시됨
검색:105

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 

x86 및 x64 아키텍처는 두 번째 표현식인 bLarger2를 다르게 처리합니다. x86 빌드에서는 bLarger2가 true로 평가되는 반면, x64 빌드에서는 false로 평가됩니다. 이러한 차이는 부동 소수점 연산의 표현식(a * c) 계산에 뿌리를 두고 있습니다.

차이 원인

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

불일치 해결

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

_controlfp(_PC_24, _MCW_PC);

정밀도를 단정밀도로 설정하면 (a * c)의 평가가 bLarger2 표현식은 x64 빌드의 표현식과 정렬되어 bLarger1 및 bLarger2가 모두 다음으로 설정됩니다. false.

결론

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

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3