检查值是否为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;
}
答案 0 :(得分:2)
Math.abs(double)比它看起来更快
return (a <= 0.0D) ? 0.0D - a : a;
因为这些方法被认为是HotSpot和许多其他JVM中的内在函数。内在代替代码,代码执行相同的操作,但效率更高。
请参阅vmSymbols.hpp以获取由手动编码的机器代码替换的符号列表。
所以,相信GrepCode有时很危险。
GrepCode会告诉您源代码是什么样的。很难再次猜测当Java代码转换为本机代码时将对Java代码执行哪些优化。 JIT具有巧妙的优化,消除死代码,可以使优化看起来更快/更聪明地运行得更慢。
如果有疑问,请坚持使用最简单的代码,JIT可能会对其进行特殊优化。尝试一些棘手的东西,你可能会发现,JIT没有优化它,它会慢一些。