최적화가 활성화된 다양한 부동 소수점 결과: 컴파일러 동작에 대한 심층 분석
부동 소수점 연산을 사용할 때 다음 사항이 필수적입니다. 컴파일러 최적화로 인해 발생할 수 있는 미묘한 차이를 이해합니다. 제공된 코드 조각에서 볼 수 있듯이 다양한 최적화 수준은 부동 소수점 계산의 정밀도에서 예상치 못한 결과를 낳을 수 있습니다.
조사 및 설명
코드는 반올림을 목표로 합니다. 배정밀도 부동 소수점 값을 지정된 숫자로 변환합니다. 그러나 g 에서 최적화가 활성화되면 결과가 예상 출력에서 벗어납니다. 이 동작은 Intel x86 프로세서가 내부적으로 부동 소수점 계산을 위해 확장된 정밀도(80비트)를 활용한다는 사실에서 비롯됩니다. 이와 대조적으로 배정밀도 변수는 일반적으로 64비트를 차지합니다.
최적화가 비활성화되면(O0) 컴파일러는 부동 소수점 값을 메모리에 저장하여 80비트 정밀도가 유지되도록 합니다. 그러나 최적화가 활성화된 경우(O1-O3) 컴파일러는 레지스터에 값을 유지하여 프로세서의 확장된 정밀도를 활용합니다. 이러한 최적화는 값이 결국 메모리에 다시 저장되고 80비트에서 64비트 정밀도로 변환될 때 반올림 오류로 이어질 수 있습니다.
해결 옵션
완화하려면 이 문제에는 다음 해결 방법이 권장됩니다.
추가 고려 사항:
Visual Studio 2008 관련
Visual에서 /fp:fast 최적화가 활성화된 경우에도 코드가 올바른 결과를 생성한다는 흥미로운 관찰이 있습니다. Studio 2008은 이러한 맥락에서 컴파일러의 신뢰성을 입증합니다. 일반적으로 g 에 -ffloat-store 옵션을 사용하는 것이 권장되지만 Visual Studio 2008은 이 문제를 더 효과적으로 처리하는 것 같습니다.
위 내용은 컴파일러 최적화가 활성화된 경우 부동 소수점 계산이 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!