Math.isFinite() 方法的实现

Implementation of Math.isFinite() method

检查值是否为NaN,
我们可以使用 Double.isNaN().
grepcode
实现是这样的。

public static boolean isNaN(double v){
    return (v != v);
}

Double.isInfinite()是这样的。

public static boolean isInfinite(double v){
    return (v == Double.POSITIVE_INFINITY) || (v == Double.NEGATIVE_INFINITY);
}  

然而,Double.isFinite()是这样的。

public static boolean isFinite(double v){
    return Math.abs(v) <= Double.MAX_VALUE;
}

所以我的第一个问题是,
为什么不简单地 returns !( Double.isNaN(v) || Double.isInfinite(v) ) ?
有任何性能原因吗?

我认为 A 比 B 快。这是错误的吗?

一个。一个 !=,两个 ==,两个 ||,和一个 !
B. abs()<=

我的第二个问题是,
“这是完全相同的吗?”
也就是说,
“这个方法 return true 吗?”

public static boolean test(){
    long x = Long.MIN_VALUE;
    for(;;){ //iterate from Long.MIN_VALUE to Long.MAX_VALUE
        double d = Double.longBitsToDouble(x);
        boolean a = ! ( Double.isNaN(d) || Double.isInfinite(d) );
        boolean b = Double.isFinite(d);
        if(a != b) return false;
        if(x == Long.MAX_VALUE) break;
        x++;
    }
    return true;
}

Math.abs(double) 比看起来要快

return (a <= 0.0D) ? 0.0D - a : a;

因为这些方法在 HotSpot 和许多其他 JVM 中被认为是固有的。内在代码被做同样事情但效率更高的代码所取代。

请参阅 vmSymbols.hpp 以获取由手动编码的机器代码替换的符号列表。

so, believing GrepCode is sometimes dangerous.

GrepCode 告诉您源代码是什么样的。很难再猜测将 Java 代码转换为本机代码时将对其执行哪些优化。 JIT 有巧妙的优化,死代码消除可以使看起来 faster/smarter 运行 更慢的优化。

如有疑问,请坚持使用最简单的代码,JIT 可能对其进行了特殊优化。尝试一些棘手的事情,你可能会发现,JIT 没有针对它进行优化,它会更慢。