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)
你这里有一个错字:
\nr_y2 = to_rad y1\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\x94 应该y2代替y1. 如果你修复它,你会得到〜738这是正确的答案。您想要的数字 827 似乎是 Google 地图显示的行驶距离、道路等。如果您在 google 上搜索“jfk 和 ord 之间的飞行距离”,您会得到 738。
| 归档时间: |
|
| 查看次数: |
150 次 |
| 最近记录: |