0

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

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
}
4

2 回答 2

5

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

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

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

于 2013-05-09T01:39:43.440 回答
4

也许您想检查计算 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)
}
于 2013-05-09T01:47:46.343 回答