3

我想知道是否有办法提高计算斜率的准确性。(这是几个月前在这里提出的)。

似乎通过改变:

float get_slope(float dXa, float dXb, float dYa, float dYb) {
    return (dXa - dXb)/(dYa - dYb);
}

float get_slope(float dXa, float dXb, float dYa, float dYb) {
    return  dXa/(dYa - dYb) - dXb/(dYa - dYb);
}

可能是一个改进。建议?

编辑:我追求的是精度,而不是效率。

4

3 回答 3

5

将它们转换为函数内部的两倍


很明显,当分母接近零时,你会遇到麻烦。你的斜率将接近无穷大。所以很大程度上取决于你想对斜坡做什么。有时,如果您知道您的 delta y 将接近于零,您可以计算斜率的倒数并改用它。您甚至可以检测哪个更小——deltax 或 deltay 的绝对值并返回斜率或 1/斜率。还要查看 atan2()。


如果您知道输入是十进制的,并且您也希望输出是十进制的,那么您可以通过使用十进制库进行所有计算来克服将浮点数转换为二进制并返回所固有的精度损失。我记得当我使用 Atari BASIC 进行十进制计算时我是多么高兴,因为它使用了 6502 的 BCD 模式。

于 2009-05-27T19:23:24.773 回答
1

如果您不介意燃烧一些额外的循环,则可以通过循环获得更好的准确性。

计算 A 和 B 之间的线段的斜率。

计算 {(Xa - (Xa -Xb)), (Ya -(Ya -Yb)} 和 {(Xb + (Xa - Xb)), (Yb +(Ya - Yb))} 之间的线段的斜率。 .. 基本上是 A - 斜率和 B + 斜率。

然后比较得到的斜率。如果差异太大(选择您想要的阈值),则继续前进,并在最后平均所有斜率。

这可以帮助消除由非常小的斜率的浮点运算引起的异常。

于 2009-05-27T19:44:00.507 回答
1

我认为你有一个错字。你大概是说

return  dXa/(dYa - dYb) - dXb/(dYa - dYb);

我会说你给出的第一个表格具有更高的精度。如果 dXa 和 dXb 接近且很大,那么在相减之前您将失去两个除法的精度。

于 2009-05-27T19:00:48.610 回答