> 백엔드 개발 > C++ > C의 부동 소수점 비교가 때때로 예상치 못한 결과를 생성하는 이유는 무엇입니까?

C의 부동 소수점 비교가 때때로 예상치 못한 결과를 생성하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-12-17 01:21:25
원래의
373명이 탐색했습니다.

Why Does Floating-Point Comparison in C Sometimes Produce Unexpected Results?

부동 소수점 비교 이상

부동 소수점 비교의 개념은 오해의 소지가 있을 수 있으며, 특히 부동 소수점 데이터 유형을 다룰 때 더욱 그렇습니다. 다음 예를 고려하십시오.

int main() {
    float a = 0.7;
    float b = 0.5;
    if (a < 0.7) {
        if (b < 0.5)
            printf("2 are right");
        else
            printf("1 is right");
    } else
        printf("0 are right");
}
로그인 후 복사

초기 조건이 false이므로 직관적으로 이 코드는 "0이 맞습니다"를 출력한다고 가정할 수 있습니다. 그런데 놀랍게도 실제 출력은 "1이 옳습니다."

설명

설명은 부동 소수점 숫자의 내부 표현에 있습니다. C에서는 비교 중에 float가 double로 승격되며 double이 float보다 더 정확합니다. 결과적으로 float로서의 0.7은 double로서의 0.7과 정확히 동일하지 않습니다. 0.7(float)이 double로 승격되면 0.7(double)보다 약간 작아집니다.

반면 0.5(float)는 double로 정확한 표현이 됩니다. 정도. 따라서, 조건 b < 0.5가 평가되면 0.5(더블)가 자신보다 작지 않기 때문에 false를 반환합니다.

해결책

이 문제를 해결하려면 다음 중 하나를 수행하세요.

  1. float를 double로 변경: a와 b를 다음과 같이 선언합니다. double의 경우 비교 중에 승격되지 않도록 하고 예상한 동작을 얻을 수 있는지 확인합니다.
  2. 리터럴에 f 접미사 추가: 리터럴에 접미사 f를 추가하면 명시적으로 나타냅니다. 플로트(float)로 처리되어야 합니다. 이렇게 하면 비교 중에 프로모션이 두 배로 늘어나는 것을 방지할 수 있습니다.

이러한 솔루션 중 하나를 구현하면 "0이 맞습니다."라는 원하는 출력을 얻을 수 있습니다.

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

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