只是将我的问题放在上下文中:我有一个类,它根据每个元素的计算分数在其构造函数中对列表进行排序。现在我想将我的代码扩展到不对列表进行排序的类的版本。最简单的解决方案是使用一个分数计算器为每个元素分配相同的分数。
我应该选择哪个 double 值?我个人认为 +Infinity 或 -Infinity 因为我认为它们有特殊的表示,这意味着它们可以快速比较。这是一个正确的假设吗?我对java的底层实现了解不够,无法确定我是否正确。
最佳答案
通常避免 0.0
、-0.0
和 NaN
。任何其他数字都可以。您可以查看Double.compare
实现以查看它们是否经过特殊处理:
if (d1 < d2)
return -1; // Neither val is NaN, thisVal is smaller
if (d1 > d2)
return 1; // Neither val is NaN, thisVal is larger
// Cannot use doubleToRawLongBits because of possibility of NaNs.
long thisBits = Double.doubleToLongBits(d1);
long anotherBits = Double.doubleToLongBits(d2);
return (thisBits == anotherBits ? 0 : // Values are equal
(thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
1)); // (0.0, -0.0) or (NaN, !NaN)
但这取决于您的排序比较器的实现方式。如果您不使用Double.compare
,那么可能没关系。
请注意,除了 0.0/-0.0/NaN
的特殊情况外,双数比较是在 CPU 内部连接的并且速度非常快,因此与其他代码相比,您不太可能获得任何显着的比较开销你已经有了。
关于java - 对于哪个 double 值与其自身进行比较最快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31204190/