>  기사  >  백엔드 개발  >  'float' 값과 'double' 값을 비교하면 동일해 보이는 경우에도 가끔 'false'가 반환되는 이유는 무엇입니까?

'float' 값과 'double' 값을 비교하면 동일해 보이는 경우에도 가끔 'false'가 반환되는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-01 18:19:30672검색

Why does comparing `float` and `double` values sometimes return `false` even when they appear identical?

Double 및 Float 데이터 유형을 비교할 때 예상치 못한 결과

배정밀도 부동 소수점 숫자(double)와 단정밀도 부동 소수점을 비교할 때 숫자(부동 소수점)를 사용하면 예상치 못한 결과가 발생할 수 있습니다. 특히, float 변수 f와 double 변수 d 사이의 동일성 검사(f == d)는 두 값이 동일해 보이더라도 false를 반환할 수 있습니다.

이 동작은 부동과 관련된 두 가지 기본 요소에서 비롯됩니다. 점 숫자: 정밀도 및 반올림.

정밀도 및 반올림 오류

  • 정밀도: 부동 소수점 숫자는 제한된 자릿수를 저장합니다. , 이는 표현할 수 있는 값의 정확성을 결정합니다. 소수점 1/3과 같은 특정 숫자는 무한 소수점 표현을 가지며 정밀도를 잃지 않고 정확하게 저장할 수 없습니다.
  • 반올림: 부동 소수점 값을 이진수로 변환할 때, 특정 소수 값을 정확하게 표현하지 못할 수도 있습니다. 예를 들어, 십진수로 0.1은 무한한 숫자 시퀀스로 이진수로 표시됩니다. 결과적으로 부동 소수점 숫자는 해당 개수에 맞게 반올림됩니다.

동일성 검사에 대한 의미

부동 소수점 숫자에 내재된 정밀도와 반올림 포인트 번호는 특히 서로 매우 가까운 값을 비교할 때 반올림 오류로 이어질 수 있습니다. 이러한 오류가 누적되어 동등 비교가 실패하게 됩니다. 이로 인해 부동 소수점 숫자에 대한 직접 동등성 검사가 신뢰할 수 없게 되고 거짓 부정이 발생하기 쉽습니다.

해결책: Epsilon과 비교

등등 검사를 사용하는 대신 더 안정적인 부동 소수점 숫자를 비교하는 방법은 둘 사이의 절대적인 차이를 취하여 그것이 엡실론(ε)이라고 알려진 작은 값보다 작은지 확인하는 것입니다. 이를 통해 반올림 오류를 설명하고 해당 차이가 애플리케이션에 중요하지 않은지 판단할 수 있습니다.

if (abs(x - y) < epsilon)

위 내용은 'float' 값과 'double' 값을 비교하면 동일해 보이는 경우에도 가끔 'false'가 반환되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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