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 중국어 웹사이트의 기타 관련 기사를 참조하세요!