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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63875 = R;
double r63876 = 2.0;
double r63877 = phi1;
double r63878 = phi2;
double r63879 = r63877 - r63878;
double r63880 = r63879 / r63876;
double r63881 = sin(r63880);
double r63882 = pow(r63881, r63876);
double r63883 = cos(r63877);
double r63884 = cos(r63878);
double r63885 = r63883 * r63884;
double r63886 = lambda1;
double r63887 = lambda2;
double r63888 = r63886 - r63887;
double r63889 = r63888 / r63876;
double r63890 = sin(r63889);
double r63891 = r63885 * r63890;
double r63892 = r63891 * r63890;
double r63893 = r63882 + r63892;
double r63894 = sqrt(r63893);
double r63895 = 1.0;
double r63896 = r63895 - r63893;
double r63897 = sqrt(r63896);
double r63898 = atan2(r63894, r63897);
double r63899 = r63876 * r63898;
double r63900 = r63875 * r63899;
return r63900;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63901 = R;
double r63902 = 2.0;
double r63903 = phi1;
double r63904 = r63903 / r63902;
double r63905 = sin(r63904);
double r63906 = phi2;
double r63907 = r63906 / r63902;
double r63908 = cos(r63907);
double r63909 = r63905 * r63908;
double r63910 = cos(r63904);
double r63911 = sin(r63907);
double r63912 = r63910 * r63911;
double r63913 = r63909 - r63912;
double r63914 = pow(r63913, r63902);
double r63915 = cos(r63903);
double r63916 = cos(r63906);
double r63917 = r63915 * r63916;
double r63918 = lambda1;
double r63919 = lambda2;
double r63920 = r63918 - r63919;
double r63921 = r63920 / r63902;
double r63922 = sin(r63921);
double r63923 = r63917 * r63922;
double r63924 = r63923 * r63922;
double r63925 = r63914 + r63924;
double r63926 = sqrt(r63925);
double r63927 = 1.0;
double r63928 = exp(r63922);
double r63929 = log(r63928);
double r63930 = r63917 * r63929;
double r63931 = 3.0;
double r63932 = pow(r63922, r63931);
double r63933 = cbrt(r63932);
double r63934 = r63930 * r63933;
double r63935 = r63914 + r63934;
double r63936 = r63927 - r63935;
double r63937 = sqrt(r63936);
double r63938 = atan2(r63926, r63937);
double r63939 = r63902 * r63938;
double r63940 = r63901 * r63939;
return r63940;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.7
rmApplied div-sub24.7
Applied sin-diff24.1
rmApplied div-sub24.1
Applied sin-diff14.4
rmApplied add-log-exp14.5
rmApplied add-cbrt-cube14.5
Simplified14.5
Final simplification14.5
herbie shell --seed 2019306
(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))))))))))