(java)a!=a在什么情况下为true?

目前只发现两种情况:

为何?

对于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了

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值