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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r89833 = R;
double r89834 = 2.0;
double r89835 = phi1;
double r89836 = phi2;
double r89837 = r89835 - r89836;
double r89838 = r89837 / r89834;
double r89839 = sin(r89838);
double r89840 = pow(r89839, r89834);
double r89841 = cos(r89835);
double r89842 = cos(r89836);
double r89843 = r89841 * r89842;
double r89844 = lambda1;
double r89845 = lambda2;
double r89846 = r89844 - r89845;
double r89847 = r89846 / r89834;
double r89848 = sin(r89847);
double r89849 = r89843 * r89848;
double r89850 = r89849 * r89848;
double r89851 = r89840 + r89850;
double r89852 = sqrt(r89851);
double r89853 = 1.0;
double r89854 = r89853 - r89851;
double r89855 = sqrt(r89854);
double r89856 = atan2(r89852, r89855);
double r89857 = r89834 * r89856;
double r89858 = r89833 * r89857;
return r89858;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r89859 = R;
double r89860 = 2.0;
double r89861 = phi1;
double r89862 = r89861 / r89860;
double r89863 = sin(r89862);
double r89864 = phi2;
double r89865 = r89864 / r89860;
double r89866 = cos(r89865);
double r89867 = r89863 * r89866;
double r89868 = cos(r89862);
double r89869 = sin(r89865);
double r89870 = r89868 * r89869;
double r89871 = r89867 - r89870;
double r89872 = pow(r89871, r89860);
double r89873 = cos(r89861);
double r89874 = cos(r89864);
double r89875 = r89873 * r89874;
double r89876 = lambda1;
double r89877 = lambda2;
double r89878 = r89876 - r89877;
double r89879 = r89878 / r89860;
double r89880 = sin(r89879);
double r89881 = r89875 * r89880;
double r89882 = r89881 * r89880;
double r89883 = r89872 + r89882;
double r89884 = sqrt(r89883);
double r89885 = 1.0;
double r89886 = 3.0;
double r89887 = pow(r89880, r89886);
double r89888 = cbrt(r89887);
double r89889 = r89875 * r89888;
double r89890 = exp(r89880);
double r89891 = log(r89890);
double r89892 = r89889 * r89891;
double r89893 = r89872 + r89892;
double r89894 = r89885 - r89893;
double r89895 = sqrt(r89894);
double r89896 = atan2(r89884, r89895);
double r89897 = r89860 * r89896;
double r89898 = r89859 * r89897;
return r89898;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.5
rmApplied div-sub24.5
Applied sin-diff23.8
rmApplied div-sub23.8
Applied sin-diff14.0
rmApplied add-log-exp14.0
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2020083
(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))))))))))