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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\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 r99703 = R;
double r99704 = 2.0;
double r99705 = phi1;
double r99706 = phi2;
double r99707 = r99705 - r99706;
double r99708 = r99707 / r99704;
double r99709 = sin(r99708);
double r99710 = pow(r99709, r99704);
double r99711 = cos(r99705);
double r99712 = cos(r99706);
double r99713 = r99711 * r99712;
double r99714 = lambda1;
double r99715 = lambda2;
double r99716 = r99714 - r99715;
double r99717 = r99716 / r99704;
double r99718 = sin(r99717);
double r99719 = r99713 * r99718;
double r99720 = r99719 * r99718;
double r99721 = r99710 + r99720;
double r99722 = sqrt(r99721);
double r99723 = 1.0;
double r99724 = r99723 - r99721;
double r99725 = sqrt(r99724);
double r99726 = atan2(r99722, r99725);
double r99727 = r99704 * r99726;
double r99728 = r99703 * r99727;
return r99728;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99729 = R;
double r99730 = 2.0;
double r99731 = phi1;
double r99732 = r99731 / r99730;
double r99733 = sin(r99732);
double r99734 = phi2;
double r99735 = r99734 / r99730;
double r99736 = cos(r99735);
double r99737 = r99733 * r99736;
double r99738 = cos(r99732);
double r99739 = sin(r99735);
double r99740 = r99738 * r99739;
double r99741 = r99737 - r99740;
double r99742 = pow(r99741, r99730);
double r99743 = cos(r99731);
double r99744 = cos(r99734);
double r99745 = r99743 * r99744;
double r99746 = lambda1;
double r99747 = lambda2;
double r99748 = r99746 - r99747;
double r99749 = r99748 / r99730;
double r99750 = sin(r99749);
double r99751 = r99745 * r99750;
double r99752 = r99751 * r99750;
double r99753 = r99742 + r99752;
double r99754 = sqrt(r99753);
double r99755 = 1.0;
double r99756 = 3.0;
double r99757 = pow(r99750, r99756);
double r99758 = cbrt(r99757);
double r99759 = r99745 * r99758;
double r99760 = r99746 / r99730;
double r99761 = sin(r99760);
double r99762 = r99747 / r99730;
double r99763 = cos(r99762);
double r99764 = r99761 * r99763;
double r99765 = cos(r99760);
double r99766 = sin(r99762);
double r99767 = r99765 * r99766;
double r99768 = r99764 - r99767;
double r99769 = r99759 * r99768;
double r99770 = r99742 + r99769;
double r99771 = r99755 - r99770;
double r99772 = sqrt(r99771);
double r99773 = atan2(r99754, r99772);
double r99774 = r99730 * r99773;
double r99775 = r99729 * r99774;
return r99775;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.8
rmApplied div-sub24.8
Applied sin-diff24.2
rmApplied div-sub24.2
Applied sin-diff14.3
rmApplied add-cbrt-cube14.3
Simplified14.3
rmApplied div-sub14.3
Applied sin-diff14.6
Final simplification14.6
herbie shell --seed 2020039 +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))))))))))