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 \log \left(e^{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\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 r76749 = R;
double r76750 = 2.0;
double r76751 = phi1;
double r76752 = phi2;
double r76753 = r76751 - r76752;
double r76754 = r76753 / r76750;
double r76755 = sin(r76754);
double r76756 = pow(r76755, r76750);
double r76757 = cos(r76751);
double r76758 = cos(r76752);
double r76759 = r76757 * r76758;
double r76760 = lambda1;
double r76761 = lambda2;
double r76762 = r76760 - r76761;
double r76763 = r76762 / r76750;
double r76764 = sin(r76763);
double r76765 = r76759 * r76764;
double r76766 = r76765 * r76764;
double r76767 = r76756 + r76766;
double r76768 = sqrt(r76767);
double r76769 = 1.0;
double r76770 = r76769 - r76767;
double r76771 = sqrt(r76770);
double r76772 = atan2(r76768, r76771);
double r76773 = r76750 * r76772;
double r76774 = r76749 * r76773;
return r76774;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r76775 = R;
double r76776 = 2.0;
double r76777 = phi1;
double r76778 = r76777 / r76776;
double r76779 = sin(r76778);
double r76780 = phi2;
double r76781 = r76780 / r76776;
double r76782 = cos(r76781);
double r76783 = r76779 * r76782;
double r76784 = cos(r76778);
double r76785 = sin(r76781);
double r76786 = r76784 * r76785;
double r76787 = r76783 - r76786;
double r76788 = pow(r76787, r76776);
double r76789 = cos(r76777);
double r76790 = cos(r76780);
double r76791 = r76789 * r76790;
double r76792 = lambda1;
double r76793 = lambda2;
double r76794 = r76792 - r76793;
double r76795 = r76794 / r76776;
double r76796 = sin(r76795);
double r76797 = r76791 * r76796;
double r76798 = r76797 * r76796;
double r76799 = r76788 + r76798;
double r76800 = sqrt(r76799);
double r76801 = 1.0;
double r76802 = 3.0;
double r76803 = pow(r76796, r76802);
double r76804 = cbrt(r76803);
double r76805 = exp(r76804);
double r76806 = log(r76805);
double r76807 = r76791 * r76806;
double r76808 = r76807 * r76796;
double r76809 = r76788 + r76808;
double r76810 = r76801 - r76809;
double r76811 = sqrt(r76810);
double r76812 = atan2(r76800, r76811);
double r76813 = r76776 * r76812;
double r76814 = r76775 * r76813;
return r76814;
}



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-diff14.0
rmApplied add-log-exp14.0
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2019303 +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))))))))))