【问题标题】:Difference between double comparisons in gtest (C++) and nunit (C#)gtest (C++) 和 nunit (C#) 中双重比较的区别
【发布时间】:2011-04-03 15:40:50
【问题描述】:

我已经将一个带有 gtest 测试的 c++ 项目移植到一个带有 nunit 测试的 c# 项目中。现在我遇到了浮点精度问题。

在 nunit 测试中我不正常(红色)

Assert.AreEqual(0.7, 7 * 0.1); 

在我的 gtest 测试中:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

没关系(绿色)

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      验证两个指定的双精度 相等,或在指定范围内 彼此的准确性。断言 如果它们不在范围内,则失败 彼此指定的精度。

      【讨论】:

        【解决方案3】:

        永远不要比较浮点数是否相等!十进制小数(如 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?

        【讨论】:

        • gtest 和 nunit 正在这样做。但似乎处理方式不同。我换个话题。
        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2022-08-02
          • 2016-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-17
          相关资源
          最近更新 更多