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

sch*_*tbi 6 c# c++ floating-point nunit googletest

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

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

Assert.AreEqual(0.7, 7 * 0.1); 
Run Code Online (Sandbox Code Playgroud)

在 gtest 测试中,我有:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);
Run Code Online (Sandbox Code Playgroud)

没问题(绿色)

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

Vla*_*sev 6

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


Exa*_*Exa 3

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

public static void AreEqual (
    double expected,
    double actual,
    double delta
)
Run Code Online (Sandbox Code Playgroud)

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