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(\sin \left(\frac{\lambda_1}{2}\right) \cdot \cos \left(\frac{\lambda_2}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right) \cdot \left(\sin \left(\frac{\lambda_1}{2}\right) \cdot \cos \left(\frac{\lambda_2}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r109835 = R;
double r109836 = 2.0;
double r109837 = phi1;
double r109838 = phi2;
double r109839 = r109837 - r109838;
double r109840 = r109839 / r109836;
double r109841 = sin(r109840);
double r109842 = pow(r109841, r109836);
double r109843 = cos(r109837);
double r109844 = cos(r109838);
double r109845 = r109843 * r109844;
double r109846 = lambda1;
double r109847 = lambda2;
double r109848 = r109846 - r109847;
double r109849 = r109848 / r109836;
double r109850 = sin(r109849);
double r109851 = r109845 * r109850;
double r109852 = r109851 * r109850;
double r109853 = r109842 + r109852;
double r109854 = sqrt(r109853);
double r109855 = 1.0;
double r109856 = r109855 - r109853;
double r109857 = sqrt(r109856);
double r109858 = atan2(r109854, r109857);
double r109859 = r109836 * r109858;
double r109860 = r109835 * r109859;
return r109860;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r109861 = R;
double r109862 = 2.0;
double r109863 = phi1;
double r109864 = r109863 / r109862;
double r109865 = sin(r109864);
double r109866 = phi2;
double r109867 = r109866 / r109862;
double r109868 = cos(r109867);
double r109869 = r109865 * r109868;
double r109870 = cos(r109864);
double r109871 = sin(r109867);
double r109872 = r109870 * r109871;
double r109873 = r109869 - r109872;
double r109874 = pow(r109873, r109862);
double r109875 = cos(r109863);
double r109876 = cos(r109866);
double r109877 = r109875 * r109876;
double r109878 = lambda1;
double r109879 = lambda2;
double r109880 = r109878 - r109879;
double r109881 = r109880 / r109862;
double r109882 = sin(r109881);
double r109883 = r109877 * r109882;
double r109884 = r109883 * r109882;
double r109885 = r109874 + r109884;
double r109886 = sqrt(r109885);
double r109887 = 1.0;
double r109888 = r109878 / r109862;
double r109889 = sin(r109888);
double r109890 = r109879 / r109862;
double r109891 = cos(r109890);
double r109892 = r109889 * r109891;
double r109893 = cos(r109888);
double r109894 = sin(r109890);
double r109895 = r109893 * r109894;
double r109896 = r109892 - r109895;
double r109897 = r109877 * r109896;
double r109898 = r109897 * r109896;
double r109899 = r109874 + r109898;
double r109900 = r109887 - r109899;
double r109901 = sqrt(r109900);
double r109902 = atan2(r109886, r109901);
double r109903 = r109862 * r109902;
double r109904 = r109861 * r109903;
return r109904;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied div-sub24.4
Applied sin-diff24.6
rmApplied div-sub24.6
Applied sin-diff24.1
rmApplied div-sub24.1
Applied sin-diff14.2
rmApplied div-sub14.2
Applied sin-diff13.5
Final simplification13.5
herbie shell --seed 2019356
(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))))))))))