目前只发现两种情况:
为何?
对于jdk来说呢,具体实现也是有标准的
根据ieee 754的浮点运算标准来实现,好像在啥地方见过java的某个实现没有遵循这个标准
记不起来了。
以double为例吧
以上是jdk double的部分源程序
NaN和其来例
double c = Double.longBitsToDouble(0x7ff0000000000001L);
System.out.println(Double.isNaN(c));
这里面的c也是NaN
注意是native方法。
注释里面说的很详细了
* If the argument is any value in the range
* <code>0x7ff0000000000001L</code> through
* <code>0x7fffffffffffffffL</code> or in the range
* <code>0xfff0000000000001L</code> through
* <code>0xffffffffffffffffL</code>, the result is a NaN.
这两个范围内的转换成double都是NaN
同时
No IEEE
* 754 floating-point operation provided by Java can distinguish
* between two NaN values of the same type with different bit
* patterns.
这句话说明在java中两个NaN之间无法比较,所以a==a总是false
a!=a也就为true了