Floating point 使用浮点算法计算两点之间距离的精确方法?

Floating point 使用浮点算法计算两点之间距离的精确方法?,floating-point,language-agnostic,Floating Point,Language Agnostic,最近有人在采访中问我,使用浮点运算计算两点之间距离的最佳方法是什么 我天真的回答是: 假设这两点是(a,b)和(c,d),答案是 dist = sqrt( (a-c)*(a-c) + (b-d)*(b-d)) 然而,我现在意识到,如果这些点非常接近,首先平方可能会导致下溢。有没有更准确的方法可以做到这一点?正如马克·迪金森在评论中提到的那样,数学库倾向于提供一个hypop函数 维基百科的文章实际上解决了溢出/下溢问题 从文章中: 朴素实现的困难在于x2或y2可能溢出或下溢,除非中间结果以扩展

最近有人在采访中问我,使用浮点运算计算两点之间距离的最佳方法是什么

我天真的回答是:

假设这两点是(a,b)和(c,d),答案是

dist = sqrt( (a-c)*(a-c) + (b-d)*(b-d))

然而,我现在意识到,如果这些点非常接近,首先平方可能会导致下溢。有没有更准确的方法可以做到这一点?

正如马克·迪金森在评论中提到的那样,数学库倾向于提供一个hypop函数

维基百科的文章实际上解决了溢出/下溢问题

从文章中:

朴素实现的困难在于x2或y2可能溢出或下溢,除非中间结果以扩展精度计算。一种常见的实现技术是在必要时交换值,以便| x |≥ |y |,然后使用等效形式:

y/x的计算不能溢出。如果y/x下溢,最终结果等于| x |,这在计算精度范围内是正确的。平方根的计算值介于1和2之间。最后,与| x |的乘法不能下溢,只有当结果太大而无法表示时才会溢出


许多语言都有提供方法的数学库,因此在这些语言中,您只需执行
hypot(a-c,b-d)
。假设
hypot
得到了很好的实现,那么应该可以避免中间溢出和下溢的问题。请注意,
hypot
也是推荐的IEEE 754标准操作。面试官是否允许你使用
hypot
。(在一台典型的机器上,按二的幂进行缩放比按两个值中的较大者进行缩放要好。)@MarkDickinson这是一个非常开放的问题。未指定任何约束。然而,这次采访是为了科学计算的角色,所以我猜他们想知道我是否对浮点运算的陷阱有很好的理解。Netlib中
hypot
的这个实现似乎也是一个很好的解决方案:如果你比较许多三角形,只想对斜边长度排序,那么就不需要(昂贵的)sqrt操作了。