gtest(C ++)和nunit(C#)中双重比较的区别

时间:2010-08-25 10:26:31

标签: c# c++ nunit floating-point googletest

我已经使用gtest测试将c ++项目移植到具有nunit测试的c#项目。现在我遇到浮点精度问题。

在nunit测试中我不行(红色)

Assert.AreEqual(0.7, 7 * 0.1); 

在gtest测试中我有:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

哪个好(绿色)

现在的问题是为什么 ???

4 个答案:

答案 0 :(得分: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?

答案 1 :(得分:2)

Google Test ASSERT_DOUBLE_EQ()验证实际值是否在预期值的4个ULP范围内(请参阅https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#floating-point-comparison的更多信息)。 Nunit可能正在进行精确比较。

答案 2 :(得分:1)

或者,您可以添加第三个参数,这是两个值之间的最大差异,因为您可以阅读here

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

验证两个指定的双打   是等于,或在指定范围内   彼此的准确性。断言   如果他们不在   指定的准确度。

答案 3 :(得分:0)

在比较浮点数时尝试Assert.AreApproximatelyEqual