- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在查找两点之间的整数点数时的奇怪精度行为:
我正在为此编写一个算法(伪)。
给定 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);
最佳答案
m
和 c
是 double
,所以 (m*i)+c
将返回一个 double
。然而,j
是一个 int
。因此,您将整数与 double 进行比较。鉴于 floating point representation ,在进行直接比较时,这将成为一个问题。您需要将该比较的右侧转换为整数,或者进行某种非精确比较。或者,您可以使用不是浮点精度的东西,例如 decimal
,它不会显示此问题。
关于c# - 如何在 C# 中处理精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22917989/
我是一名优秀的程序员,十分优秀!