double.NaN - 这种违反直觉的功能如何运作?

GeR*_*ReV 4 double nan

我偶然发现了.NET double.NaN在代码中的定义:

public const double NaN = (double)0.0 / (double)0.0;
Run Code Online (Sandbox Code Playgroud)

这在PositiveInfinity和中类似地完成NegativeInfinity.

double.IsNaN (删除一些#pragmas和注释)定义为:

[Pure] 
[ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
public static bool IsNaN(double d) 
{
    if (d != d)
    { 
        return true; 
    }
    else 
    {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说非常违反直觉.

为什么NaN被定义为除以零?怎么0.0 / 0.0代表"幕后"?如何划分为0 double,为什么NaN != NaN

Spe*_*nce 6

这里的答案相当简单..Net框架实现了IEEE规定的浮点标准(System.Double符合IEC 60559:1989(IEEE 754)二进制浮点运算标准).这是因为浮点运算实际上必须适用于许多系统,而不仅仅是x86/64架构,因此遵循这些约定可以确保兼容性问题较少(例如将代码从DSP移植到x86处理器中).

至于d!= d,这是性能优化.基本上,该指令依赖于硬件指令,该指令可以非常快速地确定两个双浮点数是否相等.在标准下,NAN!= NAN因此是最快的测试方式.试图为您找到参考.