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 \left(\log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right) + \log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right)\right)\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 r140819 = R;
double r140820 = 2.0;
double r140821 = phi1;
double r140822 = phi2;
double r140823 = r140821 - r140822;
double r140824 = r140823 / r140820;
double r140825 = sin(r140824);
double r140826 = pow(r140825, r140820);
double r140827 = cos(r140821);
double r140828 = cos(r140822);
double r140829 = r140827 * r140828;
double r140830 = lambda1;
double r140831 = lambda2;
double r140832 = r140830 - r140831;
double r140833 = r140832 / r140820;
double r140834 = sin(r140833);
double r140835 = r140829 * r140834;
double r140836 = r140835 * r140834;
double r140837 = r140826 + r140836;
double r140838 = sqrt(r140837);
double r140839 = 1.0;
double r140840 = r140839 - r140837;
double r140841 = sqrt(r140840);
double r140842 = atan2(r140838, r140841);
double r140843 = r140820 * r140842;
double r140844 = r140819 * r140843;
return r140844;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r140845 = R;
double r140846 = 2.0;
double r140847 = phi1;
double r140848 = r140847 / r140846;
double r140849 = sin(r140848);
double r140850 = phi2;
double r140851 = r140850 / r140846;
double r140852 = cos(r140851);
double r140853 = r140849 * r140852;
double r140854 = cos(r140848);
double r140855 = sin(r140851);
double r140856 = r140854 * r140855;
double r140857 = r140853 - r140856;
double r140858 = pow(r140857, r140846);
double r140859 = cos(r140847);
double r140860 = cos(r140850);
double r140861 = r140859 * r140860;
double r140862 = lambda1;
double r140863 = lambda2;
double r140864 = r140862 - r140863;
double r140865 = r140864 / r140846;
double r140866 = sin(r140865);
double r140867 = r140861 * r140866;
double r140868 = r140867 * r140866;
double r140869 = r140858 + r140868;
double r140870 = sqrt(r140869);
double r140871 = 1.0;
double r140872 = exp(r140866);
double r140873 = sqrt(r140872);
double r140874 = log(r140873);
double r140875 = r140874 + r140874;
double r140876 = r140861 * r140875;
double r140877 = r140876 * r140866;
double r140878 = r140858 + r140877;
double r140879 = r140871 - r140878;
double r140880 = sqrt(r140879);
double r140881 = atan2(r140870, r140880);
double r140882 = r140846 * r140881;
double r140883 = r140845 * r140882;
return r140883;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.0
rmApplied div-sub24.0
Applied sin-diff23.3
rmApplied div-sub23.3
Applied sin-diff13.4
rmApplied add-log-exp13.4
rmApplied add-sqr-sqrt13.5
Applied log-prod13.5
Final simplification13.5
herbie shell --seed 2020059
(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))))))))))