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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r101739 = R;
double r101740 = 2.0;
double r101741 = phi1;
double r101742 = phi2;
double r101743 = r101741 - r101742;
double r101744 = r101743 / r101740;
double r101745 = sin(r101744);
double r101746 = pow(r101745, r101740);
double r101747 = cos(r101741);
double r101748 = cos(r101742);
double r101749 = r101747 * r101748;
double r101750 = lambda1;
double r101751 = lambda2;
double r101752 = r101750 - r101751;
double r101753 = r101752 / r101740;
double r101754 = sin(r101753);
double r101755 = r101749 * r101754;
double r101756 = r101755 * r101754;
double r101757 = r101746 + r101756;
double r101758 = sqrt(r101757);
double r101759 = 1.0;
double r101760 = r101759 - r101757;
double r101761 = sqrt(r101760);
double r101762 = atan2(r101758, r101761);
double r101763 = r101740 * r101762;
double r101764 = r101739 * r101763;
return r101764;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r101765 = R;
double r101766 = 2.0;
double r101767 = phi1;
double r101768 = r101767 / r101766;
double r101769 = sin(r101768);
double r101770 = phi2;
double r101771 = r101770 / r101766;
double r101772 = cos(r101771);
double r101773 = r101769 * r101772;
double r101774 = cos(r101768);
double r101775 = sin(r101771);
double r101776 = r101774 * r101775;
double r101777 = r101773 - r101776;
double r101778 = pow(r101777, r101766);
double r101779 = cos(r101767);
double r101780 = cos(r101770);
double r101781 = r101779 * r101780;
double r101782 = lambda1;
double r101783 = lambda2;
double r101784 = r101782 - r101783;
double r101785 = r101784 / r101766;
double r101786 = sin(r101785);
double r101787 = r101781 * r101786;
double r101788 = r101787 * r101786;
double r101789 = r101778 + r101788;
double r101790 = sqrt(r101789);
double r101791 = 1.0;
double r101792 = 3.0;
double r101793 = pow(r101786, r101792);
double r101794 = cbrt(r101793);
double r101795 = r101787 * r101794;
double r101796 = r101778 + r101795;
double r101797 = r101791 - r101796;
double r101798 = sqrt(r101797);
double r101799 = atan2(r101790, r101798);
double r101800 = r101766 * r101799;
double r101801 = r101765 * r101800;
return r101801;
}



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 add-log-exp13.8
rmApplied add-cbrt-cube13.8
Simplified13.8
Final simplification13.8
herbie shell --seed 2020065
(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))))))))))