double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
return ((double) (R * ((double) sqrt(((double) (((double) (((double) (((double) (lambda1 - lambda2)) * ((double) cos(((double) (((double) (phi1 + phi2)) / 2.0)))))) * ((double) (((double) (lambda1 - lambda2)) * ((double) cos(((double) (((double) (phi1 + phi2)) / 2.0)))))))) + ((double) (((double) (phi1 - phi2)) * ((double) (phi1 - phi2))))))))));
}
double code(double R, double lambda1, double lambda2, double phi1, double phi2) {
double VAR;
if ((phi1 <= -5.1932364225039894e-40)) {
VAR = ((double) (R * ((double) (phi2 - phi1))));
} else {
double VAR_1;
if (((phi1 <= 8.893889606600523e-137) || !(phi1 <= 2.1628661069747332e-23))) {
VAR_1 = ((double) (R * ((double) sqrt(((double) (((double) (((double) (lambda1 - lambda2)) * ((double) (((double) (lambda1 - lambda2)) * ((double) (((double) cos(((double) (((double) (phi1 + phi2)) / 2.0)))) * ((double) cos(((double) (((double) (phi1 + phi2)) / 2.0)))))))))) + ((double) (((double) (phi1 - phi2)) * ((double) (phi1 - phi2))))))))));
} else {
VAR_1 = ((double) (R * ((double) (((double) sqrt(((double) (((double) (((double) (lambda1 - lambda2)) * ((double) (((double) (((double) (lambda1 - lambda2)) * ((double) (1.0 + ((double) cos(((double) (((double) (((double) (phi1 + phi2)) / 2.0)) * 2.0)))))))) * ((double) (((double) (phi1 * phi1)) + ((double) (phi2 * ((double) (phi1 + phi2)))))))))) + ((double) (2.0 * ((double) (((double) (phi1 - phi2)) * ((double) (((double) pow(phi1, 3.0)) - ((double) pow(phi2, 3.0)))))))))))) / ((double) sqrt(((double) (2.0 * ((double) (((double) (phi1 * phi1)) + ((double) (phi2 * ((double) (phi1 + phi2))))))))))))));
}
VAR = VAR_1;
}
return VAR;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if phi1 < -5.1932364225039894e-40Initial program 46.2
Simplified46.2
Taylor expanded around 0 28.6
if -5.1932364225039894e-40 < phi1 < 8.8938896066005225e-137 or 2.16286610697473319e-23 < phi1 Initial program 37.4
Simplified37.4
if 8.8938896066005225e-137 < phi1 < 2.16286610697473319e-23Initial program 30.7
Simplified30.7
rmApplied flip3--34.5
Applied associate-*r/37.5
Applied cos-mult37.5
Applied associate-*r/37.5
Applied associate-*r/37.6
Applied frac-add38.7
Applied sqrt-div38.8
Simplified32.7
Simplified32.7
Final simplification34.5
herbie shell --seed 2020192
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
:precision binary64
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))