3

double 値が等しいかどうかをチェックする最もパフォーマンスの高い方法は何ですか?

という事は承知しています

double a = 0.00023d;
double b = 0.00029d;

boolean eq = (a == b);

遅い。

だから私は使用しています

double epsilon = 0.00000001d;
eq = Math.abs(a - b) < epsilon;

問題は、Infinitestテストに時間がかかりすぎることについて不平を言っていることです。大したことではありませんが (1 秒トップ)、気になりました。

追加情報

aこれは期待値であるためハードコードされており、次のようbに計算されます。

  // fyi: current = int, max = int
  public double getStatus()
  {
    double value = 0.0;
    if (current != 0 && max != 0)
      value = ((double) current) / max;
    return value;
  }

アップデート

java.lang.Double はそのようにします

public boolean equals(Object obj) {
return (obj instanceof Double)
       && (doubleToLongBits(((Double)obj).value) ==
          doubleToLongBits(value));
}

したがって、それがベストプラクティスであると想定できます。

4

3 に答える 3

6

JUnit has a method of checking a Double for 'equality' with a given delta:

Assert.assertEquals(0.00023d, 0.00029d, 0.0001d);

See this API documentation.

As noted in the comments, JUnit actually most likely is slower than comparing manually with a given delta. JUnit first does a Double.compare(expected, actual) followed (if not equal) by a Math.abs(expected - actual) <= delta.

Hopefully this answer still is useful for people not aware that JUnit actually provides a way for inexact Double equality testing.

于 2013-07-31T13:08:36.967 に答える
0

java.lang.Double

質問のjava.lang.Double.equals()呼び出しに示されているようにpublic static long doubleToLongBits(double value)、これは

/**
 * Returns a representation of the specified floating-point value
 * according to the IEEE 754 floating-point "double
 * format" bit layout.

と等しいかどうかをチェックし==ます。(doubleToLongBits内部的に を呼び出すpublic static native long doubleToRawLongBits(double value)ため、プラットフォームに依存します)。

これがプリミティブ型の仕組みです。

プリミティブ型 double

浮動小数点型は float とdoubleであり、これらは概念的に単精度 32 ビットおよび倍精度 64 ビット形式の IEEE 754 値と演算に関連付けられており、バイナリ浮動小数点演算の IEEE 標準、ANSI/IEEE で指定されています。標準 754-1985 (IEEE、ニューヨーク)。JLS-4.2.3


浮動小数点数の演算子は、IEEE 754 で指定されたとおりに動作します (剰余演算子 (§15.17.3) を除く)。 JLS-4.2.4


したがって、最も速い方法は、プリミティブ型を使用し、必要な精度に応じて「デルタ チェック」を実行することです。Double が提供するメソッドを使用してそれが不可能な場合。

JUnit assert メソッドは使用しないでください。より多くのチェックを実行するため、次のように sth を実行する方がよいでしょう。

boolean eq = Double.valueOf(5.0d).equals(Double.valueOf(2.0d));
Assert.assertTrue(eq);
于 2013-08-06T13:07:59.133 に答える