gpt4 book ai didi

c# - 如何在 C# 中处理精度

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:46:02 25 4
gpt4 key购买 nike

在查找两点之间的整数点数时的奇怪精度行为:

我正在为此编写一个算法(伪)。

给定 x1,y1 和 x2,y2

我计算了 double m,其中 m 是给定的线段的梯度 (double)(y2-y1)/(x2-x1)然后我计算了 double c,其中 c 是作为 y1 - (m*x1) 给出的 y 截距

然后对于 i = Min(x1,x2) i < Max(x1,x2) 对于 j = Min(y1, y2) j < Max(y1,y2) 如果 j = (m*i) + c 则++

最后返回结果-1

该代码适用于某些测试用例,但在其他测试用例上失败,例如,当两个端点彼此垂直时,我必须处理 m 的无穷大和 c 的 NaN 情况。但是,一个特殊情况引起了我的注意,测试用例 43、38、17、6 分别用于 x1、y1 和 x2、y2。

运行代码 j 从 6 开始,i 从 17 开始,所以这个点肯定在线段上,尽管我不应该计算它,因为它是一个端点。奇怪的是这个值 i, j != (m*i)+c = 5.9999999999... 而不是 6。这怎么可能?我在哪里失去了精度?更重要的是,我是如何失去精度的?

代码:

        int cnt = 0;
double i, j;
double m = (double)(y2 - y1) / (x2 - x1);
double c = y1 - (m * x1);
for (i = Math.Min(x1, x2); i <= Math.Max(x1, x2); i++)
{
for (j = Math.Min(y1, y2); j <= Math.Max(y1, y2); j++)
{
if (j == (m * i) + c||double.IsInfinity(m) && double.IsNaN(c))
cnt++;
}
}
return cnt - 2;

所以我将所有变量都更改为十进制,但不幸的是,我的测试用例仍然失败。但我想我已经将范围缩小到这一点:decimal m = (decimal)(y2 - y1)/(x2 - x1);

最佳答案

mcdouble,所以 (m*i)+c 将返回一个 double。然而,j 是一个 int。因此,您将整数与 double 进行比较。鉴于 floating point representation ,在进行直接比较时,这将成为一个问题。您需要将该比较的右侧转换为整数,或者进行某种非精确比较。或者,您可以使用不是浮点精度的东西,例如 decimal,它不会显示此问题。

关于c# - 如何在 C# 中处理精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22917989/

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