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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\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 \sqrt[3]{{\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}^{3}}\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 r99834 = R;
double r99835 = 2.0;
double r99836 = phi1;
double r99837 = phi2;
double r99838 = r99836 - r99837;
double r99839 = r99838 / r99835;
double r99840 = sin(r99839);
double r99841 = pow(r99840, r99835);
double r99842 = cos(r99836);
double r99843 = cos(r99837);
double r99844 = r99842 * r99843;
double r99845 = lambda1;
double r99846 = lambda2;
double r99847 = r99845 - r99846;
double r99848 = r99847 / r99835;
double r99849 = sin(r99848);
double r99850 = r99844 * r99849;
double r99851 = r99850 * r99849;
double r99852 = r99841 + r99851;
double r99853 = sqrt(r99852);
double r99854 = 1.0;
double r99855 = r99854 - r99852;
double r99856 = sqrt(r99855);
double r99857 = atan2(r99853, r99856);
double r99858 = r99835 * r99857;
double r99859 = r99834 * r99858;
return r99859;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99860 = R;
double r99861 = 2.0;
double r99862 = phi1;
double r99863 = phi2;
double r99864 = r99862 - r99863;
double r99865 = r99864 / r99861;
double r99866 = sin(r99865);
double r99867 = pow(r99866, r99861);
double r99868 = cos(r99862);
double r99869 = cos(r99863);
double r99870 = r99868 * r99869;
double r99871 = lambda1;
double r99872 = lambda2;
double r99873 = r99871 - r99872;
double r99874 = r99873 / r99861;
double r99875 = sin(r99874);
double r99876 = 3.0;
double r99877 = pow(r99875, r99876);
double r99878 = cbrt(r99877);
double r99879 = r99870 * r99878;
double r99880 = r99879 * r99875;
double r99881 = r99867 + r99880;
double r99882 = sqrt(r99881);
double r99883 = 1.0;
double r99884 = exp(r99875);
double r99885 = log(r99884);
double r99886 = pow(r99885, r99876);
double r99887 = cbrt(r99886);
double r99888 = r99870 * r99887;
double r99889 = r99888 * r99875;
double r99890 = r99867 + r99889;
double r99891 = r99883 - r99890;
double r99892 = sqrt(r99891);
double r99893 = atan2(r99882, r99892);
double r99894 = r99861 * r99893;
double r99895 = r99860 * r99894;
return r99895;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.1
rmApplied add-cbrt-cube24.1
Simplified24.1
rmApplied add-log-exp24.1
rmApplied add-cbrt-cube24.3
Simplified24.3
Final simplification24.3
herbie shell --seed 2020057
(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))))))))))