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

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2025-01-31 04:07:36493검색

C#

C#과 같은 많은 프로그래밍 언어에서 부동 소수점의 수는 소수점을 나타내는 데 사용됩니다. 그러나 컴퓨터에서 플로팅 -Point 수의 제한된 표현으로 인해이 숫자는 정확도 문제가 있습니다.

다음 절차를 고려하십시오 이 프로그램은 False를 출력하며, 이는 0.09 정확도 문제를 이해하십시오

이 정확도의 이유는 부동 소수점 번호가 메모리로 표현되는 방식 때문입니다. 이 디지털 스토리지는 꼬리 번호 (소수 부분), 인덱스 (베이스의 전력) 및 기호의 조합입니다. 그러나 꼬리 번호의 정확도는 제한적입니다.

C#에서 단일 -예비 부동산 지점 번호 (Float)는 23 자리이며 듀얼 -프리션 플로팅 포인트 번호 (더블)에는 52 비트 테일 번호가 있습니다. 결말 번호를 정확하게 표현할 수없는 경우, 4 개의 주택으로, 5 개는 가장 가까운 숫자를 나타냅니다.

위의 예에서 0.09 99.999999 4 채의 주택과 5 개는 9.0입니다. 결과적으로,이 두 값은 비교적 동일하고 프로그램은 거짓을 출력합니다.

이 정확도를 줄이기 위해 IEEE 754 Floating -Point Operation Standard는 "Epsilon"의 개념을 소개합니다. 즉, 최소 전진 -플로팅 포인트를 변경하지 않고 1.0에 추가 할 수 있습니다. C#에서이 값은 약 1.4013E-45입니다.
<code class="language-csharp">class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f * 100f;
        float f2 = 0.09f * 99.999999f;

        Console.WriteLine(f1 > f2);
    }
}</code>
두 플로팅 포인트 수의 차이를 Epsilon과 비교함으로써 부동 소수점의 정확도 범위 내에서 유효성에 유효한 지 여부를 결정할 수 있습니다.

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

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