【发布时间】:2018-07-19 10:07:39
【问题描述】:
我最近在一次采访中被问及使用浮点算法计算两点之间距离的最佳方法是什么。
我天真的回答是:
假设两点是(a,b)和(c,d),答案是
dist = sqrt( (a-c)*(a-c) + (b-d)*(b-d))
但是,我现在意识到,如果点非常接近,则先平方可能会导致下溢。有没有更准确的方法来做到这一点?
【问题讨论】:
-
许多语言都有一个提供
hypot方法的数学库,因此在这些语言中,您只需使用hypot(a-c, b-d)。假设hypot实现得很好,那应该可以避免中间溢出和下溢的问题。请注意,hypot也是推荐的 IEEE 754 标准操作。面试官允许你使用hypot,还是要求你自己滚动? -
相关博文:johndcook.com/blog/2010/06/02/…,不过我觉得还有更准确的方法。 (在典型的机器上,按 2 的幂进行缩放比按两个值中的较大者进行缩放更好。)
-
@MarkDickinson 这是一个非常开放的问题。没有指定约束。但是,面试是针对科学计算的角色,所以我猜他们想知道我是否对浮点运算的陷阱有很好的理解。
-
在 Netlib 中实现
hypot似乎也是一个很好的解决方案:netlib.org/fdlibm/e_hypot.c -
如果您要比较许多三角形并且只想对斜边长度进行排序,则不需要(昂贵的)sqrt 操作。
标签: floating-point language-agnostic