R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}R \cdot \mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right), \phi_1 - \phi_2\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104796 = R;
double r104797 = lambda1;
double r104798 = lambda2;
double r104799 = r104797 - r104798;
double r104800 = phi1;
double r104801 = phi2;
double r104802 = r104800 + r104801;
double r104803 = 2.0;
double r104804 = r104802 / r104803;
double r104805 = cos(r104804);
double r104806 = r104799 * r104805;
double r104807 = r104806 * r104806;
double r104808 = r104800 - r104801;
double r104809 = r104808 * r104808;
double r104810 = r104807 + r104809;
double r104811 = sqrt(r104810);
double r104812 = r104796 * r104811;
return r104812;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104813 = R;
double r104814 = lambda1;
double r104815 = lambda2;
double r104816 = r104814 - r104815;
double r104817 = phi1;
double r104818 = phi2;
double r104819 = r104817 + r104818;
double r104820 = 2.0;
double r104821 = r104819 / r104820;
double r104822 = cos(r104821);
double r104823 = expm1(r104822);
double r104824 = log1p(r104823);
double r104825 = r104816 * r104824;
double r104826 = r104817 - r104818;
double r104827 = hypot(r104825, r104826);
double r104828 = r104813 * r104827;
return r104828;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.5
Simplified3.7
rmApplied *-commutative3.7
rmApplied log1p-expm1-u3.7
Final simplification3.7
herbie shell --seed 2020042 +o rules:numerics
(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))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))