我已经将带有 gtest 测试的 c++ 项目移植到带有 nunit 测试的 ac# 项目。现在我遇到了浮点精度的问题。
在 nunit 测试中我一直不好(红色)
Assert.AreEqual(0.7, 7 * 0.1);
在 gtest 测试中,我有:
ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);
没关系(绿色)
现在的问题是为什么???
我已经将带有 gtest 测试的 c++ 项目移植到带有 nunit 测试的 ac# 项目。现在我遇到了浮点精度的问题。
在 nunit 测试中我一直不好(红色)
Assert.AreEqual(0.7, 7 * 0.1);
在 gtest 测试中,我有:
ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);
没关系(绿色)
现在的问题是为什么???
Google TestASSERT_DOUBLE_EQ()
验证实际值在预期值的 4 ULP 内(请参阅https://github.com/google/googletest/blob/main/docs/advanced.md#floating-point-comparison中的更多信息)。Nunit 可能正在执行精确比较。
或者,您可以添加第三个参数,这是两个值之间的最大差异,您可以在此处阅读。
public static void AreEqual (
double expected,
double actual,
double delta
)
验证两个指定的双精度值是否相等,或彼此在指定的精度范围内。如果它们不在彼此指定的精度范围内,则断言失败。
永远不会比较浮点数是否相等!十进制小数(如 0.1)不能表示为 ieee 浮点数而不会丢失小的精度。看起来像 0.7 的可能实际上是 0.6999999 或其他东西。那么它们是不同的数字。您应该使用 epsilon 技术:考虑a == b if abs(a - b) <= epsilon
,其中 epsilon 是非常小的常数。
阅读本文和许多其他人^
在比较浮点数时尝试Assert.AreApproximatelyEqual 。