我已經完成了將具有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);
這是確定(綠色)
現在的問題是爲什麼 ???
我已經完成了將具有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);
這是確定(綠色)
現在的問題是爲什麼 ???
另外,您可以添加第三個參數,這是兩個值之間的最大區別,你可以閱讀here。
public static void AreEqual (
double expected,
double actual,
double delta
)
驗證指定的兩個雙打 是相等的,或彼此的指定 精度範圍內。斷言 失敗,如果他們不在指定的精度彼此。
永遠不會比較浮點數的平等!十進制小數(如0.1)不能表示爲ieee浮點數,而不會丟失較小的精度。可能看起來像0.7的可能是0.6999999或者別的什麼。那麼他們是不同的數字。你應該使用epsilon技術:考慮a == b if abs(a - b) <= epsilon
,其中epsilon是非常小的常數。
讀這和許多其他^
gtest和nunit正在這樣做。但它似乎有不同的處理方式。我改變了線程的主題。 – schoetbi 2010-08-25 10:33:25
嘗試Assert.AreApproximatelyEqual而不是比較浮動。
Google Test的ASSERT_DOUBLE_EQ()
驗證實際值是否在預期值的4個ULP範圍內(請參閱https://github.com/google/googletest/blob/master/googletest/docs/AdvancedGuide.md#floating-point-comparison的更多信息)。 Nunit可能正在進行精確比較。
現在剩下的問題是如何適當設置三角洲... – schoetbi 2010-08-25 11:02:50