为什么在Java浮点比较中使用Float.floatToIntBits()?

为什么在Java浮点比较中使用Float.floatToIntBits()?,java,vector,floating-point,box2d,Java,Vector,Floating Point,Box2d,在JBox2d中,Vec2.equals()存在以下代码: 我想知道floatint位转换函数的作用是什么。这是否提供了一种解决Java浮点比较不准确问题的方法(如果可能的话)?还是完全是另外一回事?我想知道这是否是epsilon方法的替代方法: if (Math.abs(floatVal1 - floatVal2) < epsilon) 仅供参考,我完全明白为什么在hashCode()中使用转换函数——hash id必须是整数。Double.Nan(非数字)是比较时的一个特殊值: Sy

在JBox2d中,
Vec2.equals()
存在以下代码:

我想知道floatint位转换函数的作用是什么。这是否提供了一种解决Java浮点比较不准确问题的方法(如果可能的话)?还是完全是另外一回事?我想知道这是否是epsilon方法的替代方法:

if (Math.abs(floatVal1 - floatVal2) < epsilon)
仅供参考,我完全明白为什么在hashCode()中使用转换函数——hash id必须是整数。

Double.Nan(非数字)是比较时的一个特殊值:

System.out.println(Float.NaN == Float.NaN);
System.out.println(Float.floatToIntBits(Float.NaN) == Float.floatToIntBits(Float.NaN));
这张照片是:

false
true 

解释如下:
float
float
需要特殊处理,因为存在
-0.0
NaN
、正无穷大和负无穷大。这就是为什么Sun JVM的
Float.equals()
看起来像这样(6u21):

所以,不,
Math.abs()
带ε不是一个好的选择。从Javadoc:

如果f1和f2都表示Float.NaN, 然后equals方法返回true, 即使Float.NaN==Float.NaN 该值为false。如果f1代表 +0.0f而f2表示-0.0f,反之亦然,则同等试验具有 值为false,即使0.0f==-0.0f 该值为true


这就是为什么Eclipse的自动生成代码会为您这样做。

我不知道100%,但很可能他们正在试图绕过NaN!=南问题。如果你的浮动恰好是NaN,你不能与任何东西进行比较,因为结果总是错误的。比较整数位将得到NaN==NaN。

换句话说,这完全优于epsilon方法?如果是这样的话,我简直不敢相信我的运气。好吧,如果你能保证你不会得到任何
NaNs
-0.0
或无穷大,那么使用
Math.abs()
可能会更快。也许吧。我从下面的评论中看出,我误解了它的作用。它解决了围绕特殊浮点值的问题;它不会处理浮动不准确的问题——正如您最初在回答中所说的那样。所以忽略我的最后一个问题。Math.abs()System.out.println(Float.NaN == Float.NaN); System.out.println(Float.floatToIntBits(Float.NaN) == Float.floatToIntBits(Float.NaN));
false
true 
public boolean equals(Object obj)
{
    return (obj instanceof Float)
           && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}