최적화 활성화 시 부동 소수점 반올림 차이: 컴파일러 버그 또는 최적화 딜레마?
부동 소수점 계산은 특히 다음과 같은 경우에 예상치 못한 동작을 보일 수 있습니다. 컴파일러 최적화가 활성화되었습니다. 다음 코드 조각을 고려하세요.
#include <cstdlib> #include <iostream> #include <cmath> double round(double v, double digit) { double pow = std::pow(10.0, digit); double t = v * pow; double r = std::floor(t + 0.5); return r / pow; } int main() { std::cout << round(4.45, 1) << std::endl; std::cout << round(4.55, 1) << std::endl; }
예상 출력:
4.5 4.6
그러나 이 코드가 최적화(O1 - O3)와 함께 g를 사용하여 컴파일되면 출력은 다음과 같습니다.
4.5 4.5
원인 불일치:
이러한 불일치는 x86 프로세서가 내부적으로 부동 소수점 계산에 80비트 확장 정밀도를 사용한다는 사실에서 비롯됩니다. 그러나 double 변수는 일반적으로 너비가 64비트입니다. 부동 소수점 값이 CPU 레지스터에서 메모리로 저장되면 80비트 정밀도에서 64비트 정밀도로 반올림됩니다. 이 반올림으로 인해 약간의 오류가 발생할 수 있습니다.
최적화 수준의 영향:
다양한 최적화 수준은 부동 소수점 값이 메모리에 저장되는 빈도에 영향을 미칠 수 있습니다. 최적화 수준이 높을수록 이런 일이 더 자주 발생합니다. 결과적으로 반올림 오류가 더욱 두드러집니다.
해결책:
추가 고려 사항:
위 내용은 컴파일러 최적화가 활성화된 경우 부동 소수점 반올림 코드가 다른 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!