16

2つの浮動小数点値を比較して正確に等しいかどうかを確認するための、エレガントで読みやすく、冗長でない方法とは何ですか?

単純に聞こえるかもしれませんが、それは厄介な問題です。オペレーターはNaNの==仕事を終わらせず、ゼロの特別な扱いもします。

(+0.0 == -0.0) -> true
Double.NaN == Double.NaN -> false

しかし、2つの値が完全に同じであるかどうかを判断したいと思います(ただし、異なるNaNパターンは気にしないため、NaN==他のNaN->true)。

私はこの醜いモンスターのコードでこれを行うことができます:

Double.doubleToLongBits(a) == Double.doubleToLongBits(b)

これを書く(そして意図を明らかにする)より良い方法はありますか?

4

2 に答える 2

23

使用できます

Double.compare(a, b) == 0

compareTo の javadoc から

  • このメソッドでは、Double.NaN はそれ自体と等しく、他のすべての double 値 (Double.POSITIVE_INFINITY を含む) より大きいと見なされます。
  • このメソッドでは、0.0d は -0.0d より大きいと見なされます。
于 2013-03-22T14:24:03.660 に答える
10

あなたが持っているものは、それを行うための最良の方法です。値のビット単位の表現に関心があることが明確になります。longこれらのビットを、ファンキーな動作を持たない便利な 64 ビット型に変換しています。

コードベースに頻繁に表示されたくない場合は、メソッドを追加してラップするだけです。

public static boolean bitwiseEqualsWithCanonicalNaN(double x, double y) {
    return Double.doubleToLongBits(x) == Double.doubleToLongBits(y);
}

あなたの質問によると、これは異なる NaN 値を区別しないことに注意してください。後でこれを行いたい場合は、 を使用する必要がありますDouble.toRawLongBits

于 2013-03-22T14:24:55.680 に答える