我偶然发现了.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?
这里的答案相当简单..Net框架实现了IEEE规定的浮点标准(System.Double符合IEC 60559:1989(IEEE 754)二进制浮点运算标准).这是因为浮点运算实际上必须适用于许多系统,而不仅仅是x86/64架构,因此遵循这些约定可以确保兼容性问题较少(例如将代码从DSP移植到x86处理器中).
至于d!= d,这是性能优化.基本上,该指令依赖于硬件指令,该指令可以非常快速地确定两个双浮点数是否相等.在标准下,NAN!= NAN因此是最快的测试方式.试图为您找到参考.
| 归档时间: |
|
| 查看次数: |
313 次 |
| 最近记录: |