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 중국어 웹사이트의 기타 관련 기사를 참조하세요!