> 백엔드 개발 > C++ > C에서 부동 소수점을 이중 리터럴과 비교하면 예상치 못한 결과가 나타나는 이유는 무엇입니까?

C에서 부동 소수점을 이중 리터럴과 비교하면 예상치 못한 결과가 나타나는 이유는 무엇입니까?

DDD
풀어 주다: 2024-12-15 18:48:15
원래의
498명이 탐색했습니다.

Why does comparing floats to double literals in C produce unexpected results?

부동 소수점 비교 퍼즐

다음 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

이 문제를 해결하려면 다음 중 하나를 수행할 수 있습니다.

  • 변경 변수 a와 b를 double로 선언하거나
  • 리터럴을 0.7과 0.5로 변경합니다. float로 지정

위 내용은 C에서 부동 소수점을 이중 리터럴과 비교하면 예상치 못한 결과가 나타나는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿