program story

double.NaN이 자신과 같지 않은 이유는 무엇입니까?

inputbox 2020. 10. 4. 11:02
반응형

double.NaN이 자신과 같지 않은 이유는 무엇입니까?


누군가 나에게 이것을 설명 할 수 있습니까? C #에서 double.NaN은 double.NaN과 같지 않습니다.

bool huh = double.NaN == double.NaN; // huh = false
bool huh2 = double.NaN >= 0; // huh2 = false
bool huh3 = double.NaN <= 0; // huh3 = false

double.NaN과 비교할 수있는 상수는 무엇입니까?


궁금하다면 Double.IsNaN다음과 같이 보입니다.

public static bool IsNaN(double d)
{
    return (d != d);
}

펑키?


Double.IsNaN을 사용하십시오 .


bool isNaN = Double.IsNaN(yourNumber)

의도적 인 행동입니다. NaN이되는 이유 는 숫자가 아닌 것을 나타 내기 때문에 많은 것을 포괄합니다.

어떤 것을 NaN과 비교하는 적절한 방법은 IsNaN 함수 를 사용하는 입니다.


Double.IsNan ()사용 하여 여기에서 동등성을 테스트하십시오. 그 이유는 NaN이 숫자가 아니기 때문입니다.


이를위한 특수 기능이 있습니다.

double.IsNan(huh);

이 조건을 확인하려면 "Double.IsNaN (value)"메서드를 사용하십시오.


실제로 IEEE-754 부동 소수점 숫자가 NaN 인지 확인하는 방법을 이미 찾았습니다 . 이는 False자체와 비교할 경우 평가되는 유일한 부동 소수점 값 (또는 여러 NaN이 있기 때문에 값 범위)입니다 .

bool isNaN(double v) {
    return v != v;
}

내부적으로 Double.IsNaN 메서드는 실제로 동일한 작업을 수행 할 수 있습니다. FP 표준에 대해 모르는 사람에게는이 동작이 매우 놀랍기 때문에 여전히 사용해야합니다.


NaN에 대해 아는 유일한 사실은 "숫자가 아님"이라는 것입니다. 그렇다고 상태와 연관 될 수있는 값이 있다는 의미는 아닙니다. 예를 들면 :

∞ + (-∞) = NaN

0/0 = NaN

(∞ + (-∞)) <> (0/0)

시연 할 몇 가지 C #은 다음과 같습니다.

var infinity = 100d / 0;
var negInfinity = -100d / 0;

var notANumber = infinity + negInfinity;
Console.WriteLine("Negative Infinity plus Infinity is NaN: {0}", double.IsNaN(notANumber));

var notANumber2 = 0d / 0d;
Console.WriteLine("Zero divided by Zero is NaN: {0}", double.IsNaN(notANumber2));

Console.WriteLine("These two are not equal: {0}", notANumber == notANumber2);

이유 Double.NaN != Double.NaN는 간단합니다.

당신 0/0은과 같을 것으로 기대 Math.Sqrt(-3)합니까? 그리고 Math.Sqrt(-7)?

There is a bug in C# in my opinion where Equals() is not overridden for NaN.

Assert.IsTrue(Double.NaN != Double.NaN);
Assert.IsTrue(Double.NaN.Equals(Double.NaN));

At the same time

Assert.IsTrue(Double.PositiveInfinity == Double.NegativeInfinity);
Assert.IsTrue(Double.PositiveInfinity.Equals(Double.PositiveInfinity));
// same for Double.NegativeInfinity and Single

Use static functions for Double and Single, e.g.

Double.IsNaN(value) && Double.IsInfinity(value);

Or more specific:

Double.IsPositiveInfinity(value);
Double.IsNegativeInfinity(value);

The Equality operator considers two NaN values to be unequal to one another. In general, Double operators cannot be used to compare Double.NaN with other Double values, although comparison methods (such as Equals and CompareTo) can. see below examples

Referenced from msdn

class Program
{
    static void Main(string[] args)
    {
        Double i = Double.NaN;
        while (!i.Equals(i)) //this would be result in false
        //while(i != i) // this would result in true.
        {
            Console.WriteLine("Hello");
        }
    }
}

here is .net fiddle for the same.

참고URL : https://stackoverflow.com/questions/1145443/why-is-double-nan-not-equal-to-itself

반응형