1

Newton のメソッドを実装する、私が作成したキューブ ルート メソッドのテスト ケースの JUnit コードを次に示します。

@Test
public void standardCase_negative64e9() {
  double n = -64E9;
  double result = csc143.newton.Roots.cbrt(n);
  double delta = n * 1E-8;
  assertEquals("Standard cube root -64E9", -4.0E3, result, delta);
}

すべてのテスト ケースのテストを (DrJave IDE を使用して) 実行すると、このテスト ケースのみが失敗し、次のように表示されます。

Failure: java.lang.AssertionError: Standard cube root -64E9 expected:<-4000.0> but
was:<-4000.0000000003124>

メソッドで「デルタ」を(の代わりに)に置き換えると、失敗しないため、これは「デルタ」値(-640この場合)と関係があると思います...640-640assertEquals()

4

2 に答える 2

3

あなたdeltaはこの値を持っています:-64E9*1E-8これは実際に-64は.つまり: それは負の値です. 実際deltaの値と期待値の差の上限であると予想されるため、それを正の数にする必要があります。

クラスのソースコードを見てみましょう。Assertdouble が比較される場所はdoubleIsDifferentメソッドです。

static private boolean doubleIsDifferent(double d1, double d2, double delta) {
    if (Double.compare(d1, d2) == 0) {
        return false;
    }
    if ((Math.abs(d1 - d2) <= delta)) {    
        return false;
    }

    return true;
}

ご覧のとおり、関連する式はMath.abs(d1 - d2) <= delta. Math.abs左辺を使用 するため、常に 0 または正です。したがって、負の値よりも小さくなることはあり得ないため、このメソッドは常に戻り、値が異なることをtrue呼び出し元 ( ) に示します。assertEquals

つまり、デルタの定義を次のように変更します。

double delta = Math.abs(n * 1E-8);
于 2013-07-19T21:53:23.510 に答える
1

JUnit Assert の Javadoc である assertEqualsを読むと、delta実際に肯定的であることがわかります。

2 つの double または float が正のデルタ内で等しいことをアサートします。

于 2013-07-19T21:15:31.527 に答える