2013-07-19 316 views
1

這裏是我創建的實現牛頓法立方根方法的測試用例我的JUnit代碼: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(而不是-640)在assertEquals()方法,我沒有得到一個失敗...

+0

這個問題不http://stackoverflow.com/questions/322749/retain-precision-with-doubles-in-的副本java的。它應該重新打開。 –

+0

如果您還解釋_why_ @ItayMaman,您可能會獲得更多成功... – Ben

+0

您在重新打開的隊列中看不到答案@SteveP – Ben

回答

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)指示您的值不同。

換句話說:改變三角洲的定義:

double delta = Math.abs(n * 1E-8); 
1

如果你讀了Javadocs of JUnit Assert, assertEquals,你會看到delta確實應該是積極的:

斷言兩個雙打或浮筒等於內正三角洲。

+0

那麼爲什麼我的早期測試用例之一沒有遇到同一問題: @Test public void standardCase_negative1000(){ double n = -1000; double result = csc143.newton.Roots.cbrt(n); double delta = n * 1E-8; assertEquals(「Standard cube root root -1000」,-10.0,result,delta); } – adub3