R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79889 = R;
double r79890 = 2.0;
double r79891 = phi1;
double r79892 = phi2;
double r79893 = r79891 - r79892;
double r79894 = r79893 / r79890;
double r79895 = sin(r79894);
double r79896 = pow(r79895, r79890);
double r79897 = cos(r79891);
double r79898 = cos(r79892);
double r79899 = r79897 * r79898;
double r79900 = lambda1;
double r79901 = lambda2;
double r79902 = r79900 - r79901;
double r79903 = r79902 / r79890;
double r79904 = sin(r79903);
double r79905 = r79899 * r79904;
double r79906 = r79905 * r79904;
double r79907 = r79896 + r79906;
double r79908 = sqrt(r79907);
double r79909 = 1.0;
double r79910 = r79909 - r79907;
double r79911 = sqrt(r79910);
double r79912 = atan2(r79908, r79911);
double r79913 = r79890 * r79912;
double r79914 = r79889 * r79913;
return r79914;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79915 = R;
double r79916 = 2.0;
double r79917 = phi1;
double r79918 = phi2;
double r79919 = r79917 - r79918;
double r79920 = r79919 / r79916;
double r79921 = sin(r79920);
double r79922 = pow(r79921, r79916);
double r79923 = cos(r79917);
double r79924 = cos(r79918);
double r79925 = r79923 * r79924;
double r79926 = lambda1;
double r79927 = lambda2;
double r79928 = r79926 - r79927;
double r79929 = r79928 / r79916;
double r79930 = sin(r79929);
double r79931 = r79925 * r79930;
double r79932 = r79931 * r79930;
double r79933 = r79922 + r79932;
double r79934 = sqrt(r79933);
double r79935 = 1.0;
double r79936 = exp(r79930);
double r79937 = log(r79936);
double r79938 = r79925 * r79937;
double r79939 = r79938 * r79930;
double r79940 = r79922 + r79939;
double r79941 = r79935 - r79940;
double r79942 = sqrt(r79941);
double r79943 = atan2(r79934, r79942);
double r79944 = r79916 * r79943;
double r79945 = r79915 * r79944;
return r79945;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied add-log-exp24.6
Final simplification24.6
herbie shell --seed 2020021 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* R (* 2 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))) (sqrt (- 1 (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))))))))