我已经使用gtest测试将c ++项目移植到具有nunit测试的c#项目。现在我遇到浮点精度问题。
在nunit测试中我不行(红色)
Assert.AreEqual(0.7, 7 * 0.1);
在gtest测试中我有:
ASSERT_DOUBLE_EQ(0.7, 7 * 0.1);
哪个好(绿色)
现在的问题是为什么 ???
答案 0 :(得分:2)
从不比较浮点数的平等!十进制小数(如0.1)不能表示为ieee浮点数而不会丢失小的精度。可能看起来像0.7可能是0.6999999或其他确实。他们是不同的数字。你应该使用epsilon技术:考虑a == b if abs(a - b) <= epsilon
,其中epsilon是一个非常小的常数。
阅读本文及其他许多内容^
答案 1 :(得分:2)
Google Test ASSERT_DOUBLE_EQ()
验证实际值是否在预期值的4个ULP范围内(请参阅https://github.com/google/googletest/blob/master/googletest/docs/advanced.md#floating-point-comparison的更多信息)。 Nunit可能正在进行精确比较。
答案 2 :(得分:1)
或者,您可以添加第三个参数,这是两个值之间的最大差异,因为您可以阅读here。
public static void AreEqual (
double expected,
double actual,
double delta
)
验证两个指定的双打 是等于,或在指定范围内 彼此的准确性。断言 如果他们不在 指定的准确度。
答案 3 :(得分:0)
在比较浮点数时尝试Assert.AreApproximatelyEqual。