gtest (C++) 和 nunit (C#) 中双重比较之间的差异

发布于 2024-09-16 12:32:52 字数 296 浏览 5 评论 0原文

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

在 nunit 测试中,我的表现不太好(红色)

Assert.AreEqual(0.7, 7 * 0.1); 

在 gtest 测试中,我的表现是:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

哪个没问题(绿色)

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

I have done porting of a c++ project with gtest tests to a c# project having an nunit test. Now I encounter problems with floating point precision.

in the nunit test I have being not ok (red)

Assert.AreEqual(0.7, 7 * 0.1); 

in the gtest test I have:

ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);

which is ok (green)

The question now is WHY???

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

乖乖 2024-09-23 12:32:52

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

Google Test's ASSERT_DOUBLE_EQ() verifies that the actual value is within 4 ULPs of the expected one (see more info at https://github.com/google/googletest/blob/main/docs/advanced.md#floating-point-comparison). Nunit is probably performing exact comparison.

权谋诡计 2024-09-23 12:32:52

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

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

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

Alternatively you can add a third parameter, which is the maximum difference between the two values, as you can read here.

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

Verifies that two specified doubles
are equal, or within the specified
accuracy of each other. The assertion
fails if they are not within the
specified accuracy of each other.

九八野马 2024-09-23 12:32:52

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

never-ever compare floating point numbers for equality! decimal fractional numbers (like 0.1) can't be represented into ieee floats without small precision lost. what may look like 0.7 may be 0.6999999 or something else indeed. they are different numbers then. You should use epsilon technique: consider a == b if abs(a - b) <= epsilon , where epsilon is very small constant number.

read this and many others^

http://docs.sun.com/source/806-3568/ncg_goldberg.html

What's wrong with using == to compare floats in Java?

少跟Wǒ拽 2024-09-23 12:32:52

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

Try Assert.AreApproximatelyEqual when comparing floats instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文