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 \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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 \mathsf{log1p}\left(\mathsf{expm1}\left(\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 r112787 = R;
double r112788 = 2.0;
double r112789 = phi1;
double r112790 = phi2;
double r112791 = r112789 - r112790;
double r112792 = r112791 / r112788;
double r112793 = sin(r112792);
double r112794 = pow(r112793, r112788);
double r112795 = cos(r112789);
double r112796 = cos(r112790);
double r112797 = r112795 * r112796;
double r112798 = lambda1;
double r112799 = lambda2;
double r112800 = r112798 - r112799;
double r112801 = r112800 / r112788;
double r112802 = sin(r112801);
double r112803 = r112797 * r112802;
double r112804 = r112803 * r112802;
double r112805 = r112794 + r112804;
double r112806 = sqrt(r112805);
double r112807 = 1.0;
double r112808 = r112807 - r112805;
double r112809 = sqrt(r112808);
double r112810 = atan2(r112806, r112809);
double r112811 = r112788 * r112810;
double r112812 = r112787 * r112811;
return r112812;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r112813 = R;
double r112814 = 2.0;
double r112815 = phi1;
double r112816 = r112815 / r112814;
double r112817 = sin(r112816);
double r112818 = phi2;
double r112819 = r112818 / r112814;
double r112820 = cos(r112819);
double r112821 = r112817 * r112820;
double r112822 = cos(r112816);
double r112823 = sin(r112819);
double r112824 = r112822 * r112823;
double r112825 = r112821 - r112824;
double r112826 = pow(r112825, r112814);
double r112827 = cos(r112815);
double r112828 = cos(r112818);
double r112829 = r112827 * r112828;
double r112830 = lambda1;
double r112831 = lambda2;
double r112832 = r112830 - r112831;
double r112833 = r112832 / r112814;
double r112834 = sin(r112833);
double r112835 = expm1(r112834);
double r112836 = log1p(r112835);
double r112837 = r112829 * r112836;
double r112838 = r112837 * r112834;
double r112839 = r112826 + r112838;
double r112840 = sqrt(r112839);
double r112841 = 1.0;
double r112842 = r112841 - r112839;
double r112843 = sqrt(r112842);
double r112844 = atan2(r112840, r112843);
double r112845 = r112814 * r112844;
double r112846 = r112813 * r112845;
return r112846;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.3
rmApplied div-sub24.3
Applied sin-diff23.7
rmApplied div-sub23.7
Applied sin-diff13.8
rmApplied log1p-expm1-u13.8
rmApplied log1p-expm1-u13.9
Final simplification13.9
herbie shell --seed 2020036 +o rules:numerics
(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))))))))))