1

这是我创建的实现牛顿方法的立方体根方法的测试用例的 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>

我觉得这与我的“delta”值(在这种情况下)有关,因为当我在方法中用(而不是)-640替换“delta”时,我没有失败......640-640assertEquals()

4

2 回答 2

3

delta有这个值:-64E9*1E-8这实际上是-64。也就是说:它是一个负值。正如delta预期的那样,实际值和预期值之间的差异的上限需要将其设为正数。

看一下类的源代码Assert。比较双打的地方是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) 表明您的值不同。

换句话说:将 delta 的定义更改为:

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

如果您阅读JUnit Assert, assertEquals 的 Javadocs,您会发现这delta确实应该是肯定的:

断言两个双精度或浮点数在正增量内相等。

于 2013-07-19T21:15:31.527 回答