최적화로 인한 부동 소수점 불일치: 컴파일러 버그 또는 고유 정밀도
부동 소수점 값을 반올림하기 위해 제공된 코드는 발산을 나타냅니다. 다양한 컴파일러 및 최적화 설정에서의 동작. 이러한 불일치는 최적화 중 부동 소수점 정밀도 처리의 불일치로 인해 발생합니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!