부동 소수점 비교 퍼즐
다음 C 코드를 고려하세요.
직관적으로 출력이 다음과 같을 것이라고 예상할 수 있습니다. "0이 맞습니다." 그러나 놀라운 결과는 '1이 맞았다'이다. 왜 이런 일이 발생합니까?
부동 소수점 비교의 함정
핵심은 C에서 부동 소수점과 배정밀도 숫자의 차이점에 있습니다. 코드에서 변수 a와 b는 32비트 부동 소수점 숫자인 부동 소수점으로 선언됩니다. 그러나 리터럴 0.7과 0.5가 double로 처리되므로 두 비교(a < 0.7 및 b < 0.5)에는 double이 포함됩니다.
비교 중에 float 변수는 double로 승격되어 a가 허용됩니다. 더 높은 범위와 정밀도. 그러나 이 변환은 부동 소수점의 제한된 정밀도로 인해 미묘한 아티팩트를 유발할 수 있습니다. 이 경우 float로서의 0.7은 double로서의 0.7과 정확하게 동일하지 않습니다.
구체적으로, float로서의 0.7은 IEEE 754 표준에서 0x3f000000으로 표시됩니다. double로 승격되면 이 값은 0.7의 정확한 표현이 아닙니다. 대신 0x3f00000000000000(약 0.7000000000000001) 정도로 약간 커집니다.
예상치 못한 결과의 원인
이번 프로모션의 결과로 조건 a < 0.7은 a의 이중 표현이 0.7보다 약간 작기 때문에 참이 됩니다. 이어서, 두 번째 비교 b < 0.5는 b(정확히 double로 표시됨)가 0.5와 같기 때문에 false로 평가됩니다. 따라서 코드는 "1이 옳습니다."를 인쇄합니다.
Solutions
이 문제를 해결하려면 다음 중 하나를 수행할 수 있습니다.
위 내용은 C에서 부동 소수점을 이중 리터럴과 비교하면 예상치 못한 결과가 나타나는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!