Java의 부동 소수점 비교 난제
Java는 설명된 대로 부동 소수점 값을 테스트하기 위해 동등 비교 연산자 '=='를 제공합니다. java.sun에서. 그러나 정적 분석은 부동 소수점 비교에 사용되는 것에 대해 종종 우려를 불러일으킵니다.
부동 소수점에 대한 '=='의 함정
'==' 연산자의 지정된 역할에도 불구하고 부동소수점 비교에서는 부동소수점 산술의 고유한 부정확성으로 인해 문제가 있는 것으로 나타났습니다. 부동 소수점 값은 내부적으로 유한 소수점 확장으로 표시되므로 계산 중에 반올림 오류와 잘림이 발생합니다. 결과적으로, 논리적으로 같아야 하는 두 개의 부동 소수점 숫자는 아주 약간씩 다를 수 있습니다. 이러한 차이는 동등성을 판단하기 위해 '=='를 사용할 때 잘못된 긍정 또는 부정으로 이어질 수 있습니다.
Float 동등성에 대한 선호 접근 방식
Float의 '동등성'을 정확하게 테스트하려면, ' 절대 차이를 허용 오차 임계값(엡실론)과 비교하는 것이 좋습니다. 이 엡실론 값은 매우 작아야 하며 원하는 정밀도에 따라 조정되어야 합니다.
예를 들어 sectionID 및 currentSectionID가 부동 변수인 경우 다음 코드 조각은 신뢰할 수 있는 방법을 제공합니다.
if (Math.abs(sectionID - currentSectionID) < epsilon) { // They are considered 'equal' }
이러한 맥락에서 엡실론은 0.00000001로 설정되거나 필요한 정확도에 따라 사용자 정의 값으로 설정될 수 있습니다. Math.abs를 활용하여 비교가 피연산자의 부호와 독립적인지 확인합니다.
결론
'=='은 지정된 동등으로 나타납니다. 부동 소수점 연산자의 단점으로 인해 부동 소수점 부정확성을 정확하게 처리하는 데 있어 정밀한 비교에 적합하지 않습니다. 선호되는 솔루션은 절대 차이를 적절한 허용 오차 임계값과 비교하여 Java의 부동 소수점 값에 대한 신뢰할 수 있는 동일성 평가를 제공하는 것입니다.
위 내용은 Java의 부동 소수점에 대해 직접 동등 비교('==')가 문제가 되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!