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 = dx86 및 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