gpt4 book ai didi

c# - 根据给定的精度评估两个 double 是否相等,而不是在某个固定的公差范围内

转载 作者:IT王子 更新时间:2023-10-29 04:11:20 30 4
gpt4 key购买 nike

我正在运行 NUnit 测试来评估一些已知的测试数据和计算结果。这些数字是浮点 double ,所以我不希望它们完全相等,但我不确定如何在给定精度下将它们视为相等。

在 NUnit 中,我们可以与固定公差进行比较:

double expected = 0.389842845321551d;
double actual = 0.38984284532155145d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));

这对于小于零的数字来说效果很好,但随着数字的增长,公差确实需要改变,所以我们总是关心相同数量的精度。

具体来说,这个测试失败了:

double expected = 1.95346834136148d;
double actual = 1.9534683413614817d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));

当然,更大的数字会因容忍而失败..

double expected = 1632.4587642911599d;
double actual = 1632.4587642911633d; // really comes from a data import
Expect(actual, EqualTo(expected).Within(0.000000000000001));

评估两个 float 在给定精度下是否相等的正确方法是什么?在 NUnit 中是否有内置的方法来执行此操作?

最佳答案

来自 msdn:

By default, a Double value contains 15 decimal digits of precision, although a maximum of 17 digits is maintained internally.

那么我们假设 15。

因此,我们可以说我们希望容差达到相同的程度。

小数点后有多少位精确数字?我们需要知道最高有效数字与小数点的距离,对吧?幅度。我们可以用 Log10 得到这个。

然后我们需要将 1 除以 10 ^ 精度以获得我们想要的精度附近的值。

现在,您需要做的测试用例比我多,但这似乎可行:

  double expected = 1632.4587642911599d;
double actual = 1632.4587642911633d; // really comes from a data import

// Log10(100) = 2, so to get the manitude we add 1.
int magnitude = 1 + (expected == 0.0 ? -1 : Convert.ToInt32(Math.Floor(Math.Log10(expected))));
int precision = 15 - magnitude ;

double tolerance = 1.0 / Math.Pow(10, precision);

Assert.That(actual, Is.EqualTo(expected).Within(tolerance));

已经晚了 - 这里可能有陷阱。我针对你的三组测试数据进行了测试,每组都通过了。将 pricision 更改为 16 - magnitude 会导致测试失败。将它设置为 14 - magnitude 显然会导致它通过,因为公差更大。

关于c# - 根据给定的精度评估两个 double 是否相等,而不是在某个固定的公差范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4787125/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com