>백엔드 개발 >C++ >`float == double`이 항상 작동하지 않는 이유는 무엇입니까?

`float == double`이 항상 작동하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-01 04:37:28559검색

Why Doesn't `float == double` Always Work?

Double과 Float의 비교: 왜 예상치 못한 결과가 나오는가?

Double 및 Float와 같은 부동 소수점 숫자는 수치 계산에서 중요한 역할을 합니다. 그러나 이러한 유형을 비교하면 아래 코드 조각에서 볼 수 있듯이 혼란스러운 결과가 나올 수 있습니다.

<code class="python">float f = 1.1
double d = 1.1
if (f == d):  # returns false!</code>

이 예상치 못한 동작은 정밀도와 반올림이라는 두 가지 기본 요소에서 비롯됩니다.

정밀도:

부동 소수점 숫자는 정밀도가 유한하여 정확하게 표현할 수 있는 자릿수를 제한합니다. 정밀도가 높은 숫자에는 더 많은 메모리가 필요하며, 이는 부동 소수점 변수의 경우 항상 가능한 것은 아닙니다.

예를 들어 소수점 이하 자릿수 1/3(0.33333...)은 32비트 형식으로 정확하게 표현할 수 없습니다. 뜨다. 대략적으로 계산하여 0.3333333333333333으로 저장해야 하므로 정밀도가 약간 손실됩니다.

반올림:

이진수와 십진수에는 본질적인 차이가 있습니다. 십진수로 쉽게 표현할 수 있는 분수(예: 1/10을 0.1)는 종종 이진수로 복잡한 표현(예: 1/10을 0.0001100110011...)으로 표현해야 합니다.

이러한 불일치로 인해 반올림 오류가 발생합니다. 부동 소수점 값은 메모리 제한에 맞게 잘립니다. 결과적으로 예제 코드의 0.1 표현은 double에 저장된 0.1과 정확히 동일하지 않을 수 있습니다.

결론:

정밀도 및 반올림 문제로 인해 , 동등(==)을 사용하여 double과 float를 비교하는 것은 신뢰할 수 없습니다. 대신, 보다 강력한 접근 방식은 절대 차이를 허용 가능한 엡실론 값과 비교하는 것입니다. 이렇게 하면 차이가 허용 가능한 허용 범위 내에 있도록 보장됩니다.

<code class="python">if abs(f - d) < epsilon:  # epsilon is a small threshold</code>

이 접근 방식을 사용하면 비교가 정밀도 및 반올림 오류의 영향을 받지 않아 정확하고 일관된 결과를 얻을 수 있습니다.

위 내용은 `float == double`이 항상 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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