2010-08-25 53 views
4

我已經完成了將具有gtest測試的C++項目移植到具有nunit測試的c#項目。現在我遇到了浮點精度問題。在gtest(C++)和nunit(C#)中進行雙重比較的區別

在NUnit的測試中,我已經是不正常

在GTEST測試(紅色)

Assert.AreEqual(0.7, 7 * 0.1); 

我:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1); 

這是確定(綠色)

現在的問題是爲什麼 ???

回答

1

另外,您可以添加第三個參數,這是兩個值之間的最大區別,你可以閱讀here

public static void AreEqual (
    double expected, 
    double actual, 
    double delta 
) 

驗證指定的兩個雙打 是相等的,或彼此的指定 精度範圍內。斷言 失敗,如果他們不在指定的精度彼此。

+0

現在剩下的問題是如何適當設置三角洲... – schoetbi 2010-08-25 11:02:50

2

永遠不會比較浮點數的平等!十進制小數(如0.1)不能表示爲ieee浮點數,而不會丟失較小的精度。可能看起來像0.7的可能是0.6999999或者別的什麼。那麼他們是不同的數字。你應該使用epsilon技術:考慮a == b if abs(a - b) <= epsilon,其中epsilon是非常小的常數。

讀這和許多其他^

http://docs.sun.com/source/806-3568/ncg_goldberg.html

What's wrong with using == to compare floats in Java?

+2

gtest和nunit正在這樣做。但它似乎有不同的處理方式。我改變了線程的主題。 – schoetbi 2010-08-25 10:33:25