Java Float.NaN isNaN方法及其中v!=v实现的思考

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()结果是不等的;

以上都是自己简单粗浅的理解, 源码和注解原文并没有附图,因为我觉得来围观的估计不至于不知道上面说的这些东西在哪; 对于内容中不当之处欢迎指正和交流,(不洗勿喷 | 喜大奔普) ~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值