Java ByteBuffer compareTo:将字节与自身进行比较“For float and double”?

时间:2010-09-04 17:39:06

标签: java

Java's ByteBuffer内部是用于实现Comparable< ByteBuffer> ...的方法compareTo ...

public int compareTo(ByteBuffer that) {
    int n = this.position() + Math.min(this.remaining(), that.remaining());
    for (int i = this.position(), j = that.position(); i < n; i++, j++) {
        byte v1 = this.get(i);
        byte v2 = that.get(j);
        if (v1 == v2)
            continue;
        if ((v1 != v1) && (v2 != v2)) // For float and double
            continue;
        if (v1 < v2)
            return -1;
        return +1;
    }
    return this.remaining() - that.remaining();
}

if ((v1 != v1) && (v2 != v2)) // For float and double有什么意义?

如果我写这种代码,我会被警告要比较相同的表达式。

4 个答案:

答案 0 :(得分:2)

在那个特定的代码中,它没有意义。然而,这是花车和双打的流行成语。两者都可以是“NaN”,这意味着它们不代表有效的,可比较的数字。 NaN在技术上不等于任何东西,甚至本身,所以对于float或double,代码会检查两者是否都是NaN,在这种情况下足以称它们相等。

答案 1 :(得分:2)

我似乎是从一个公共源代码模板生成的Buffer类,这个特定的行只对float和double版本有意义,以检测两个数字都是NAN的特殊情况。

答案 2 :(得分:1)

Double.NaN == Double.NaNFloat.NaN == Float.NaN提供false

另见JLS 4.2.3的结尾:

  

如果任一操作数为NaN,则等于运算符==返回false,如果任一操作数为NaN(第15.21.1节),则不等式运算符!=返回true。

答案 3 :(得分:0)

正如所有其他的引用者已经指出的那样,检查Float.NaNDouble.NaN。他们应该使用Float.isNanDouble.isNaN。这会使代码更具可读性。长话短说:不要模仿。