这是我创建的立方根方法的测试用例的JUnit代码,它实现了Newton的方法:
@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
)有关,因为当我用640
(而不是-640
)替换“delta”时在assertEquals()
方法中,我没有失败......
答案 0 :(得分:3)
您的delta
具有此值:-64E9*1E-8
实际上是-64
。即:它是负值。由于delta
预计是实际值和期望值之间差异的上限,因此需要将其设为正数。
查看Assert
课程的source code。比较双打的地方是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);
答案 1 :(得分:1)
如果您阅读Javadocs of JUnit Assert, assertEquals,您会发现delta
确实应该是肯定的:
断言两个双精度或浮点数等于正三角形。