为什么 double.IsNegative(double.NaN) return 为真?
Why does double.IsNegative(double.NaN) return true?
为什么 double.IsNegative(double.NaN)
意外地 return true
而 double.NaN < 0
return 却如预期的那样 false
?
IEEE754 定义浮点数。最高位用来定义符号,0为正,1为负。
通过一些挖掘,double.NaN
似乎在二进制中表示为 0xFFF8000000000000
(并且在某种程度上在代码中表示为 0.0 / 0.0
)。
double.IsNegative(double d)
只检查最高位,不涉及任何实际数学运算。因此,NaN 被解释为负值。同时,如果在二进制比较中使用 double.NaN
将始终产生 false:
double.NaN < 0.0 //false
double.NaN > 0.0 //false
double.NaN <= 0.0 //false
double.NaN >= 0.0 //false
double.NaN == 0.0 //false
嗯,根据 refrence source,double.IsNegative
只是检查 最高有效位 :
[Pure]
[System.Security.SecuritySafeCritical] // auto-generated
internal unsafe static bool IsNegative(double d) {
return (*(UInt64*)(&d) & 0x8000000000000000) == 0x8000000000000000;
}
在 double.NaN
的情况下,设置了最高有效位 :
11111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000
|| || |
|<- Exp -><- Mantissa ->
Sign
这就是为什么 double.IsNegative
returns true
当我们输入 <
或 >
FPU 命令时 used 知道 所有的指数是一种特殊的浮点值,应该以特殊的方式处理。
与 Single.NaN
的图片完全相同。
注意,我们可以构造另一个奇怪的值,负零:
10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
|| || |
|<- Exp -><- Mantissa ->
Sign
请看:
double negativeZero = BitConverter.ToDouble(new byte[] {
0, 0, 0, 0, 0, 0, 0, 128
});
Console.WriteLine(negativeZero == 0 ? "Zero" : "???");
Console.WriteLine(double.IsNegative(negativeZero) ? "Negative" : "???");
为什么 double.IsNegative(double.NaN)
意外地 return true
而 double.NaN < 0
return 却如预期的那样 false
?
IEEE754 定义浮点数。最高位用来定义符号,0为正,1为负。
通过一些挖掘,double.NaN
似乎在二进制中表示为 0xFFF8000000000000
(并且在某种程度上在代码中表示为 0.0 / 0.0
)。
double.IsNegative(double d)
只检查最高位,不涉及任何实际数学运算。因此,NaN 被解释为负值。同时,如果在二进制比较中使用 double.NaN
将始终产生 false:
double.NaN < 0.0 //false
double.NaN > 0.0 //false
double.NaN <= 0.0 //false
double.NaN >= 0.0 //false
double.NaN == 0.0 //false
嗯,根据 refrence source,double.IsNegative
只是检查 最高有效位 :
[Pure]
[System.Security.SecuritySafeCritical] // auto-generated
internal unsafe static bool IsNegative(double d) {
return (*(UInt64*)(&d) & 0x8000000000000000) == 0x8000000000000000;
}
在 double.NaN
的情况下,设置了最高有效位 :
11111111 11111000 00000000 00000000 00000000 00000000 00000000 00000000
|| || |
|<- Exp -><- Mantissa ->
Sign
这就是为什么 double.IsNegative
returns true
当我们输入 <
或 >
FPU 命令时 used 知道 所有的指数是一种特殊的浮点值,应该以特殊的方式处理。
与 Single.NaN
的图片完全相同。
注意,我们可以构造另一个奇怪的值,负零:
10000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
|| || |
|<- Exp -><- Mantissa ->
Sign
请看:
double negativeZero = BitConverter.ToDouble(new byte[] {
0, 0, 0, 0, 0, 0, 0, 128
});
Console.WriteLine(negativeZero == 0 ? "Zero" : "???");
Console.WriteLine(double.IsNegative(negativeZero) ? "Negative" : "???");