在C#中看到double.Nan == double.NaN
总是false后,我对其背后的等式实现方式产生了好奇。因此,我使用Resharper去反编译Double结构体,这是我发现的:
public struct Double : IComparable, IFormattable, IConvertible, IComparable<double>, IEquatable<double>
{
// stuff removed...
public const double NaN = double.NaN;
// more stuff removed...
}
这似乎表明结构体Double
声明了一个常量,该常量是以特殊的小写double
定义的,尽管我一直认为这两个是完全同义的。此外,如果我在小写的double上使用“转到实现”,Resharper仅仅会将我滚动到文件顶部的声明处。类似地,跳转到小写NaN
的实现只会把我带到先前行中的常量声明处!
因此,我正在尝试理解这个看似递归的定义。这只是反编译器的产物吗?可能是Resharper的限制吗?还是说这个小写的double实际上是一种完全不同的东西 - 代表着CLR / CTS中更低层次的某些内容?
NaN
真正来自哪里?
public const double NaN = 0.0 / 0.0;
。 - Joel RondeauNaN
表示不是数字
,可以是正数或负数,就像Infinity
一样。以防有人想知道。 - Nolonar