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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right) \cdot \left({\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)}^{2} \cdot \sqrt[3]{\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 r72809 = R;
double r72810 = 2.0;
double r72811 = phi1;
double r72812 = phi2;
double r72813 = r72811 - r72812;
double r72814 = r72813 / r72810;
double r72815 = sin(r72814);
double r72816 = pow(r72815, r72810);
double r72817 = cos(r72811);
double r72818 = cos(r72812);
double r72819 = r72817 * r72818;
double r72820 = lambda1;
double r72821 = lambda2;
double r72822 = r72820 - r72821;
double r72823 = r72822 / r72810;
double r72824 = sin(r72823);
double r72825 = r72819 * r72824;
double r72826 = r72825 * r72824;
double r72827 = r72816 + r72826;
double r72828 = sqrt(r72827);
double r72829 = 1.0;
double r72830 = r72829 - r72827;
double r72831 = sqrt(r72830);
double r72832 = atan2(r72828, r72831);
double r72833 = r72810 * r72832;
double r72834 = r72809 * r72833;
return r72834;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r72835 = R;
double r72836 = 2.0;
double r72837 = phi1;
double r72838 = phi2;
double r72839 = r72837 - r72838;
double r72840 = r72839 / r72836;
double r72841 = sin(r72840);
double r72842 = pow(r72841, r72836);
double r72843 = cos(r72837);
double r72844 = cos(r72838);
double r72845 = r72843 * r72844;
double r72846 = lambda1;
double r72847 = lambda2;
double r72848 = r72846 - r72847;
double r72849 = r72848 / r72836;
double r72850 = sin(r72849);
double r72851 = r72845 * r72850;
double r72852 = r72851 * r72850;
double r72853 = r72842 + r72852;
double r72854 = sqrt(r72853);
double r72855 = 1.0;
double r72856 = 3.0;
double r72857 = pow(r72850, r72856);
double r72858 = cbrt(r72857);
double r72859 = r72845 * r72858;
double r72860 = cbrt(r72850);
double r72861 = 2.0;
double r72862 = pow(r72860, r72861);
double r72863 = r72862 * r72860;
double r72864 = r72859 * r72863;
double r72865 = r72842 + r72864;
double r72866 = r72855 - r72865;
double r72867 = sqrt(r72866);
double r72868 = atan2(r72854, r72867);
double r72869 = r72836 * r72868;
double r72870 = r72835 * r72869;
return r72870;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 23.9
rmApplied add-cbrt-cube24.0
Simplified24.0
rmApplied add-cube-cbrt24.0
Simplified24.0
Final simplification24.0
herbie shell --seed 2019325
(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))))))))))