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)\left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\cos \left(\frac{\phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}{\sqrt{1 - \left(\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \left(\cos \phi_2 \cdot \cos \phi_1\right)\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right) + {\left(\cos \left(\frac{\phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2}\right)}}\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3014881 = R;
double r3014882 = 2.0;
double r3014883 = phi1;
double r3014884 = phi2;
double r3014885 = r3014883 - r3014884;
double r3014886 = r3014885 / r3014882;
double r3014887 = sin(r3014886);
double r3014888 = pow(r3014887, r3014882);
double r3014889 = cos(r3014883);
double r3014890 = cos(r3014884);
double r3014891 = r3014889 * r3014890;
double r3014892 = lambda1;
double r3014893 = lambda2;
double r3014894 = r3014892 - r3014893;
double r3014895 = r3014894 / r3014882;
double r3014896 = sin(r3014895);
double r3014897 = r3014891 * r3014896;
double r3014898 = r3014897 * r3014896;
double r3014899 = r3014888 + r3014898;
double r3014900 = sqrt(r3014899);
double r3014901 = 1.0;
double r3014902 = r3014901 - r3014899;
double r3014903 = sqrt(r3014902);
double r3014904 = atan2(r3014900, r3014903);
double r3014905 = r3014882 * r3014904;
double r3014906 = r3014881 * r3014905;
return r3014906;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3014907 = 2.0;
double r3014908 = phi2;
double r3014909 = r3014908 / r3014907;
double r3014910 = cos(r3014909);
double r3014911 = phi1;
double r3014912 = r3014911 / r3014907;
double r3014913 = sin(r3014912);
double r3014914 = r3014910 * r3014913;
double r3014915 = cos(r3014912);
double r3014916 = sin(r3014909);
double r3014917 = r3014915 * r3014916;
double r3014918 = r3014914 - r3014917;
double r3014919 = pow(r3014918, r3014907);
double r3014920 = lambda1;
double r3014921 = lambda2;
double r3014922 = r3014920 - r3014921;
double r3014923 = r3014922 / r3014907;
double r3014924 = sin(r3014923);
double r3014925 = cos(r3014908);
double r3014926 = cos(r3014911);
double r3014927 = r3014925 * r3014926;
double r3014928 = r3014927 * r3014924;
double r3014929 = r3014924 * r3014928;
double r3014930 = r3014919 + r3014929;
double r3014931 = sqrt(r3014930);
double r3014932 = 1.0;
double r3014933 = exp(r3014924);
double r3014934 = log(r3014933);
double r3014935 = r3014934 * r3014927;
double r3014936 = expm1(r3014924);
double r3014937 = log1p(r3014936);
double r3014938 = r3014935 * r3014937;
double r3014939 = r3014938 + r3014919;
double r3014940 = r3014932 - r3014939;
double r3014941 = sqrt(r3014940);
double r3014942 = atan2(r3014931, r3014941);
double r3014943 = r3014907 * r3014942;
double r3014944 = R;
double r3014945 = r3014943 * r3014944;
return r3014945;
}



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 div-sub24.6
Applied sin-diff24.0
rmApplied div-sub24.0
Applied sin-diff14.0
rmApplied log1p-expm1-u14.0
rmApplied add-log-exp14.0
Final simplification14.0
herbie shell --seed 2019144 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* 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))))))))))