Math.isFinite()方法的实现

时间:2016-09-02 03:39:28

标签: java floating-point nan infinity

检查值是否为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;
}

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

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

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

我的第二个问题是,
&#34;这是完全相同的吗?&#34;
即,
&#34;这个方法会返回true吗? &#34;

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;
}

1 个答案:

答案 0 :(得分:2)

Math.abs(double)比它看起来更快

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

因为这些方法被认为是HotSpot和许多其他JVM中的内在函数。内在代替代码,代码执行相同的操作,但效率更高。

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

  

所以,相信GrepCode有时很危险。

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

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