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)}\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) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r58818 = R;
double r58819 = lambda1;
double r58820 = lambda2;
double r58821 = r58819 - r58820;
double r58822 = phi1;
double r58823 = phi2;
double r58824 = r58822 + r58823;
double r58825 = 2.0;
double r58826 = r58824 / r58825;
double r58827 = cos(r58826);
double r58828 = r58821 * r58827;
double r58829 = r58828 * r58828;
double r58830 = r58822 - r58823;
double r58831 = r58830 * r58830;
double r58832 = r58829 + r58831;
double r58833 = sqrt(r58832);
double r58834 = r58818 * r58833;
return r58834;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r58835 = lambda1;
double r58836 = lambda2;
double r58837 = r58835 - r58836;
double r58838 = phi1;
double r58839 = phi2;
double r58840 = r58838 + r58839;
double r58841 = 2.0;
double r58842 = r58840 / r58841;
double r58843 = cos(r58842);
double r58844 = expm1(r58843);
double r58845 = log1p(r58844);
double r58846 = r58837 * r58845;
double r58847 = r58838 - r58839;
double r58848 = hypot(r58846, r58847);
double r58849 = R;
double r58850 = r58848 * r58849;
return r58850;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.8
Simplified3.7
rmApplied add-cbrt-cube3.8
Simplified3.8
rmApplied log1p-expm1-u3.8
Simplified3.8
Final simplification3.8
herbie shell --seed 2020083 +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))))))