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 - \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}}}}{\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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\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 r73729 = R;
double r73730 = 2.0;
double r73731 = phi1;
double r73732 = phi2;
double r73733 = r73731 - r73732;
double r73734 = r73733 / r73730;
double r73735 = sin(r73734);
double r73736 = pow(r73735, r73730);
double r73737 = cos(r73731);
double r73738 = cos(r73732);
double r73739 = r73737 * r73738;
double r73740 = lambda1;
double r73741 = lambda2;
double r73742 = r73740 - r73741;
double r73743 = r73742 / r73730;
double r73744 = sin(r73743);
double r73745 = r73739 * r73744;
double r73746 = r73745 * r73744;
double r73747 = r73736 + r73746;
double r73748 = sqrt(r73747);
double r73749 = 1.0;
double r73750 = r73749 - r73747;
double r73751 = sqrt(r73750);
double r73752 = atan2(r73748, r73751);
double r73753 = r73730 * r73752;
double r73754 = r73729 * r73753;
return r73754;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r73755 = R;
double r73756 = 2.0;
double r73757 = phi1;
double r73758 = phi2;
double r73759 = r73757 - r73758;
double r73760 = r73759 / r73756;
double r73761 = sin(r73760);
double r73762 = pow(r73761, r73756);
double r73763 = cos(r73757);
double r73764 = cos(r73758);
double r73765 = r73763 * r73764;
double r73766 = lambda1;
double r73767 = lambda2;
double r73768 = r73766 - r73767;
double r73769 = r73768 / r73756;
double r73770 = sin(r73769);
double r73771 = r73765 * r73770;
double r73772 = 3.0;
double r73773 = pow(r73770, r73772);
double r73774 = cbrt(r73773);
double r73775 = r73771 * r73774;
double r73776 = r73762 + r73775;
double r73777 = sqrt(r73776);
double r73778 = 1.0;
double r73779 = r73765 * r73774;
double r73780 = r73779 * r73774;
double r73781 = r73762 + r73780;
double r73782 = r73778 - r73781;
double r73783 = sqrt(r73782);
double r73784 = atan2(r73777, r73783);
double r73785 = r73756 * r73784;
double r73786 = r73755 * r73785;
return r73786;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied add-cbrt-cube24.7
Simplified24.7
rmApplied add-cbrt-cube24.8
Simplified24.8
rmApplied add-cbrt-cube24.8
Simplified24.8
Final simplification24.8
herbie shell --seed 2019212
(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))))))))))