Haskell - 从半正矢返回的距离不正确

gre*_*mes 0 math haskell distance haversine

我有下面的代码用于计算机场列表之间的半正矢距离,但它始终返回错误的值。例如,在 ORD(芝加哥)和 JFK(纽约)上运行以下代码,haversine (head $ allAirports) (last $ allAirports)92.16479615931107当 ORD 和 JFK 之间的实际距离约为 827 英里时才会返回。知道我在计算中做错了什么吗?

type Location = (Double, Double)

data Airport = Airport {
  name :: String,
  location :: Location
} deriving (Eq)

allAirports :: [Airport]
allAirports = [
   Airport { name="ORD", location=(41.9786,-87.9048)},
   Airport { name="JFK", location=(40.64505923593942, -73.777106518636)}]

 haversine :: Airport -> Airport -> Double
 haversine (Airport _ (x1,y1)) (Airport _ (x2,y2)) = radius * c
  where radius = 3959.87433
    to_rad :: Double -> Double
    to_rad x = (x * pi) / 180
    r_x1 = to_rad x1
    r_x2 = to_rad x2
    r_y1 = to_rad y1
    r_y2 = to_rad y1
    dlat = r_x2 - r_x1
    dlon = r_y2 - r_y1
    a = sin(dlat/2)**2 + cos(r_x1)*cos(r_x2)*sin(dlon/2)**2
    c = 2 * asin(sqrt(a)) 
Run Code Online (Sandbox Code Playgroud)

Art*_*syn 7

你这里有一个错字:

\n
r_y2 = to_rad y1\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\x94 应该y2代替y1. 如果你修复它,你会得到〜738这是正确的答案。您想要的数字 827 似乎是 Google 地图显示的行驶距离、道路等。如果您在 google 上搜索“jfk 和 ord 之间的飞行距离”,您会得到 738。

\n