29 lines
1,004 B
Text
29 lines
1,004 B
Text
test: procedure options (main); /* 12 January 2014. Derived from Fortran version */
|
|
declare d float;
|
|
|
|
d = haversine(36.12, -86.67, 33.94, -118.40); /* BNA to LAX */
|
|
put edit ( 'distance: ', d, ' km') (A, F(10,3)); /* distance: 2887.2600 km */
|
|
|
|
|
|
degrees_to_radians: procedure (degree) returns (float);
|
|
declare degree float nonassignable;
|
|
declare pi float (15) initial ( (4*atan(1.0d0)) );
|
|
|
|
return ( degree*pi/180 );
|
|
end degrees_to_radians;
|
|
|
|
haversine: procedure (deglat1, deglon1, deglat2, deglon2) returns (float);
|
|
declare (deglat1, deglon1, deglat2, deglon2) float nonassignable;
|
|
declare (a, c, dlat, dlon, lat1, lat2) float;
|
|
declare radius float value (6372.8);
|
|
|
|
dlat = degrees_to_radians(deglat2-deglat1);
|
|
dlon = degrees_to_radians(deglon2-deglon1);
|
|
lat1 = degrees_to_radians(deglat1);
|
|
lat2 = degrees_to_radians(deglat2);
|
|
a = (sin(dlat/2))**2 + cos(lat1)*cos(lat2)*(sin(dlon/2))**2;
|
|
c = 2*asin(sqrt(a));
|
|
return ( radius*c );
|
|
end haversine;
|
|
|
|
end test;
|