>백엔드 개발 >C++ >최적화 중에 부동 소수점 반올림 불일치가 발생하는 이유는 무엇입니까?

최적화 중에 부동 소수점 반올림 불일치가 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-12 21:51:01452검색

Why Do Floating-Point Rounding Discrepancies Occur During Optimization?

최적화로 인한 부동 소수점 불일치: 컴파일러 버그 또는 고유 정밀도

부동 소수점 값을 반올림하기 위해 제공된 코드는 발산을 나타냅니다. 다양한 컴파일러 및 최적화 설정에서의 동작. 이러한 불일치는 최적화 중 부동 소수점 정밀도 처리의 불일치로 인해 발생합니다.

Intel x86 프로세서는 내부적으로 80비트 확장 정밀도를 사용하는 반면 double은 일반적으로 64비트 데이터 유형입니다. 최적화 수준은 부동 소수점 값이 메모리에 저장되는 빈도에 영향을 미쳐 80비트에서 64비트 정밀도로 반올림됩니다.

이를 완화하려면 -ffloat-store gcc 옵션을 사용하여 유지 관리할 수 있습니다. 최적화 수준 전반에 걸쳐 일관된 부동 소수점 결과. 또는 gcc에서 일반적으로 80비트 너비인 long double 유형을 사용하면 80비트와 64비트 정밀도 사이의 반올림 문제를 피할 수 있습니다.

man gcc 문서에 따르면 -ffloat-store 옵션:

Do not store floating point variables in registers, and inhibit
other options that might change whether a floating point value is
taken from a register or memory.

이 옵션은 프로그램이 IEEE 부동 소수점의 정확한 정의를 요구하고 다음에 저장된 중간 계산에 의존하는 시나리오에서 종종 유용합니다.

x86_64 빌드에서 컴파일러는 기본적으로 부동 소수점 및 이중에 SSE 레지스터를 활용하여 확장 정밀도 사용을 제거하고 문제의 문제를 완화합니다. gcc 컴파일러 옵션 -mfpmath가 이 동작을 제어합니다.

위 내용은 최적화 중에 부동 소수점 반올림 불일치가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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