Java Float.NaN isNaN方法及其中v!=v实现的思考
偶然看到baidu的一个关于isNaN()中v!=v如何理解的提问,回答了一番,但感觉还是这里说比较合适
java的Float里面定义了一个NaN字段,其值是0.0f/0.0f ;
这个值本身比较特殊,它表示的是一个非数值的状态或者说类型, 这个值不等于任何值,包括它自身 (大致可以理解为NaN与NaN之间是同类,虽然我们是同类但是我不是你,更深层的原因我觉得可能是每个NaN都会分配一个单独的地址来放, 所以导致NaN==NaN的时候比较内存地址一定会返回false,也就是NaN!=NaN的时候一定是true
).
除此之外, Float实现中还有一些别的特殊之处可以参考:
Float里面compareTo()这个方法注解中提到它处理值的时候有两个特殊考虑:
一个就是,实现时考虑了这个值NaN值, 注解原文意思是这个值跟自己相等(一个Float对象值是NaN的时候, 使用equals()方法比较另一个NaN的变量值时是相等的结果), 并且这里还定义了NaN大于所有其他值(甚至包括比浮点数的正无穷大要大);
第二个, 就是规定了-0.0f 是小于 0.0f 的;
compareTo() 和equals() 方法归根结底是floatToIntBits(float f1)本身实现逻辑决定的,类似的equals方法中也单独提到两个例外,分别是说:
1)虽然Float.NaN==Float.NaN 结果为false,但Float.NaN与Float.NaN的equal()结果相等的
2)虽然0.0f==-0.0f结果为true,但0.0f 与 -0.0f的equals()结果是不等的;
以上都是自己简单粗浅的理解, 源码和注解原文并没有附图,因为我觉得来围观的估计不至于不知道上面说的这些东西在哪; 对于内容中不当之处欢迎指正和交流,(不洗勿喷 | 喜大奔普) ~