使用浮点数进行最准确的线交点纵坐标计算?

chm*_*ike 5 c c++ math optimization numerical

我正在计算给定横坐标 x 上的点的纵坐标 y。该线由其两个端点坐标 (x0,y0)(x1,y1) 定义。端点坐标是浮点数,计算必须以浮点精度完成才能在 GPU 中使用。

数学,因此天真的实现,是微不足道的。

设 t = (x - x0)/(x1 - x0),然后 y = (1 - t) * y0 + t * y1 = y0 + t * (y1 - y0)。

问题是当 x1 - x0 小时。结果将引入取消错误。当与 x - x0 之一结合时,在除法中我预计 t 会出现重大错误。

问题是是否存在另一种更准确地确定 y 的方法?

即我应该先计算 (x - x0)*(y1 - y0),然后除以 (x1 - x0) 吗?

y1 - y0 的差值总是很大。

MSa*_*ers 3

在很大程度上,你的根本问题是根本性的。当(x1-x0)较小时,表示x1和x0的尾数仅有少数位不同。推而广之,x0 和 x1 之间的浮点数数量有限。例如,如果只有尾数的低 4 位不同,则它们之间最多有 14 个值。

在你最好的算法中,t术语代表这些较低位。继续举例,如果 x0 和 x1 相差 4 位,则 t 也只能采用 16 个值。这些可能值的计算相当稳健。无论您计算 3E0/14E0 还是 3E-12/14E-12,结果都会接近数学值 3/14。

您的公式还有一个额外的优点,即 y0 <= y <= y1,因为 0 <= t <= 1

(我假设您对浮点表示有足够的​​了解,因此“(x1-x0)很小”实际上意味着“相对于 x1 和 x0 本身的值来说很小”。当 x0 时,1E-1 的差异很小=1E3 但如果 x0=1E-6 则较大)