6

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

在 nunit 测试中我一直不好(红色)

Assert.AreEqual(0.7, 7 * 0.1); 

在 gtest 测试中,我有:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

没关系(绿色)

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

4

4 回答 4

5

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

于 2010-11-10T22:08:14.957 回答
3

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

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

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

于 2010-08-25T10:38:26.527 回答
1

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

在 Java 中使用 == 比较浮点数有什么问题?

于 2010-08-25T10:31:57.337 回答
0

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

于 2010-08-25T10:38:37.633 回答