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 没有针对它进行优化,它会更慢。
检查值是否为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 没有针对它进行优化,它会更慢。