Java的NaN

本文深入探讨了Java中特殊浮点数NaN(非数值)和无穷大的行为特性,解析了它们在比较运算中的表现,特别是NaN不等于自身这一独特属性,以及在Math.max函数中的处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看JDK源码时看到Math下边有个函数:

public static float max(float a, float b) {
    if (a != a)
        return a;   // a is NaN
    if ((a == 0.0f) &&
        (b == 0.0f) &&
        (Float.floatToRawIntBits(a) == negativeZeroFloatBits)) {
        // Raw conversion ok since NaN can't map to -0.0.
        return b;
    }
    return (a >= b) ? a : b;
}

注意  if (a != a) return a; // a is NaN

a竟然可能不等于a,这是什么逻辑?查了一下,NaN表示非数值,它不与任何数值相等,包括它自己。注意这一点跟

POSITIVE_INFINITY、NEGATIVE_INFINITY不一样,写个demo验证一下:
public static void main(String[] args) {
    System.out.println(Float.POSITIVE_INFINITY * 0);
    System.out.println(Float.NEGATIVE_INFINITY * 0);
    System.out.println((Float.POSITIVE_INFINITY * 0) == Float.POSITIVE_INFINITY);
    System.out.println((Float.NEGATIVE_INFINITY * 0) == Float.NEGATIVE_INFINITY);
    System.out.println(Float.POSITIVE_INFINITY / 0);
    System.out.println(Float.NEGATIVE_INFINITY / 0);
    System.out.println((Float.POSITIVE_INFINITY / 0) == Float.POSITIVE_INFINITY);
    System.out.println((Float.NEGATIVE_INFINITY / 0) == Float.NEGATIVE_INFINITY);
    float a = Float.POSITIVE_INFINITY;
    System.out.println(a == a);
    float b = Float.NaN;
    System.out.println(b == b);
    System.out.println(Double.isNaN(b));
}

输出:

NaN
NaN
false
false
Infinity
-Infinity
true
true
true
false
true

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值