【问题标题】:Accurate methods for computing distance between 2 points using floating-point arithmetic?使用浮点算法计算两点之间距离的准确方法?
【发布时间】: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


【解决方案1】:

正如 Mark Dickinson 在评论中提到的,数学库倾向于提供一个假设函数。

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

https://en.wikipedia.org/wiki/Hypot

来自文章:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-15
    • 2010-10-30
    • 2016-12-26
    • 2011-04-23
    • 2014-11-14
    • 1970-01-01
    相关资源
    最近更新 更多