>  기사  >  백엔드 개발  >  컴파일러 최적화가 활성화된 경우 부동 소수점 계산이 다른 이유는 무엇입니까?

컴파일러 최적화가 활성화된 경우 부동 소수점 계산이 다른 이유는 무엇입니까?

DDD
DDD원래의
2024-11-12 06:48:02250검색

Why do Floating-Point Calculations Differ with Compiler Optimization Enabled?

최적화가 활성화된 다양한 부동 소수점 결과: 컴파일러 동작에 대한 심층 분석

부동 소수점 연산을 사용할 때 다음 사항이 필수적입니다. 컴파일러 최적화로 인해 발생할 수 있는 미묘한 차이를 이해합니다. 제공된 코드 조각에서 볼 수 있듯이 다양한 최적화 수준은 부동 소수점 계산의 정밀도에서 예상치 못한 결과를 낳을 수 있습니다.

조사 및 설명

코드는 반올림을 목표로 합니다. 배정밀도 부동 소수점 값을 지정된 숫자로 변환합니다. 그러나 g 에서 최적화가 활성화되면 결과가 예상 출력에서 ​​벗어납니다. 이 동작은 Intel x86 프로세서가 내부적으로 부동 소수점 계산을 위해 확장된 정밀도(80비트)를 활용한다는 사실에서 비롯됩니다. 이와 대조적으로 배정밀도 변수는 일반적으로 64비트를 차지합니다.

최적화가 비활성화되면(O0) 컴파일러는 부동 소수점 값을 메모리에 저장하여 80비트 정밀도가 유지되도록 합니다. 그러나 최적화가 활성화된 경우(O1-O3) 컴파일러는 레지스터에 값을 유지하여 프로세서의 확장된 정밀도를 활용합니다. 이러한 최적화는 값이 결국 메모리에 다시 저장되고 80비트에서 64비트 정밀도로 변환될 때 반올림 오류로 이어질 수 있습니다.

해결 옵션

완화하려면 이 문제에는 다음 해결 방법이 권장됩니다.

  • -ffloat-store 활용 GCC 옵션: 이 옵션은 컴파일러가 부동 소수점 값을 메모리에 저장하도록 하여 최적화로 인한 정밀도 손실을 방지합니다.
  • long double 유형을 사용합니다. 이 데이터 유형은 80비트를 차지합니다. gcc 플랫폼에서는 80비트와 64비트 간 변환이 필요하지 않습니다. 정밀도.

추가 고려 사항:

  • x86_64 시스템에서 컴파일러는 부동 소수점 연산에 SSE 레지스터를 자동으로 사용하여 확장 정밀도 문제를 방지합니다.
  • GCC는 컴파일러의 처리를 제어하기 위해 -mfpmath 옵션을 제공합니다. 부동 소수점 수학

Visual Studio 2008 관련

Visual에서 /fp:fast 최적화가 활성화된 경우에도 코드가 올바른 결과를 생성한다는 흥미로운 관찰이 있습니다. Studio 2008은 이러한 맥락에서 컴파일러의 신뢰성을 입증합니다. 일반적으로 g 에 -ffloat-store 옵션을 사용하는 것이 권장되지만 Visual Studio 2008은 이 문제를 더 효과적으로 처리하는 것 같습니다.

위 내용은 컴파일러 최적화가 활성화된 경우 부동 소수점 계산이 다른 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.