此代码:
double d = BitConverter.Int64BitsToDouble(long.MaxValue);
Console.WriteLine(d);
Console.WriteLine(double.IsNaN(d));
Console.WriteLine(BitConverter.DoubleToInt64Bits(d) == BitConverter.DoubleToInt64Bits(double.NaN));
说
NaN
True
False
这意味着NaN并不总是相同,我是对的吗?
答案 0 :(得分:2)
根据IEEE 754标准,具有所有指数位1和至少一个有效位1的任何位模式都是NaN。根据该规则,对于64位浮点,有2个 53 -2 NaN。
您没有指定语言。使用IEEE 754的某些语言或语言实现可能更喜欢NaN的特定位模式,并尝试强制NaN到该模式。例如,Java Language Specification说:
在大多数情况下,Java SE平台会处理给定的NaN值 类型,好像折叠成一个规范值,因此 规范通常是指任意NaN,就像a 规范价值。
要了解浮点运算在程序中的表现,您需要考虑适当的语言规则以及基础浮点实现。