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 ((((double) (lambda1 - lambda2)) <= -1.1734773133815259e+167)) {
VAR = ((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))))))))))))));
} else {
double VAR_1;
if (((((double) (lambda1 - lambda2)) <= -7.419790721817663e-102) || (!(((double) (lambda1 - lambda2)) <= -1.3614665428904961e-260) && (((double) (lambda1 - lambda2)) <= 7.446488415646375e+153)))) {
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) (phi2 - phi1))));
}
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 (- lambda1 lambda2) < -1.1734773133815259e167Initial program 64.0
Simplified64.0
rmApplied flip3--64.0
Applied associate-*r/64.0
Applied cos-mult64.0
Applied associate-*r/64.0
Applied associate-*r/64.0
Applied frac-add64.0
Applied sqrt-div64.0
Simplified58.1
Simplified58.1
if -1.1734773133815259e167 < (- lambda1 lambda2) < -7.41979072181766273e-102 or -1.36146654289049613e-260 < (- lambda1 lambda2) < 7.44648841564637539e153Initial program 24.9
Simplified24.9
if -7.41979072181766273e-102 < (- lambda1 lambda2) < -1.36146654289049613e-260 or 7.44648841564637539e153 < (- lambda1 lambda2) Initial program 54.9
Simplified54.9
Taylor expanded around 0 50.3
Final simplification37.1
herbie shell --seed 2020190
(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))))))