【问题标题】:Why is this distance formula method giving me NaN?为什么这种距离公式方法给我 NaN?
【发布时间】:2013-05-09 01:37:20
【问题描述】:

我有以下代码用于计算欧几里得距离:

distanceBetween(first:(Double,Double), second:(Double,Double)): Double = {
   math.sqrt((first._1 - second._1) + (first._2 - second._2)) //distance formula
}

当我在 Scala 解释器中运行它时,我得到了这个结果:

distanceBetween((0.0,0.0),(20.0,20.0))

res0: Double = NaN

谁能解释我为什么会得到这个结果?

编辑:

根据 Patashu 和 ntalbs,两点之间的欧几里得距离的正确代码是:

distanceBetween(first:(Double,Double), second:(Double,Double)): Double = {
   scala.math.sqrt( scala.math.pow(second._1 - first._1, 2) + scala.math.pow(second._2 - first._2, 2) ) //distance formula
}

【问题讨论】:

    标签: scala formula euclidean-distance


    【解决方案1】:

    您忘记在减法周围加上绝对值。负数的 sqrt 是 NaN。

    编辑:我很笨。您可能打算做欧几里得距离,即 sqrt((x2-x1)^2+(y2-y1)^2),平方而不是 abs。

    (如果您打算计算出租车距离,也就是只能水平和垂直移动的距离,那就是 abs(x2-x1)+abs(y2-y1)。)

    【讨论】:

    • 并非如此。没有标准的距离公式(norm)实际上是绝对值差异的平方根。你忘了平方差。
    【解决方案2】:

    也许您想检查计算 2D 中两点之间距离的公式:

    d = sqrt((x2-x1)^2 + (y2-y1)^2)
    

    使用这个公式,在 sqrt() 内部永远不会是负数。所以代码应该是这样的:

    def distanceBetween(first:(Double,Double), second:(Double,Double)): Double = {
      val dx = second._1 - first._1
      val dy = second._2 - first._2
      math.sqrt(dx*dx + dy*dy)
    }
    

    【讨论】:

    • 实际上,如果他想要出租车距离而不是欧几里得距离,OP 的公式非常好。
    • @Patashu:没有那个平方根。
    • @copumpkin 嗯,你是对的。最奇怪的事情让我忘记了:)
    猜你喜欢
    • 2022-01-11
    • 2021-10-22
    • 2020-02-09
    • 2012-02-24
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多