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)\left(R \cdot 2\right) \cdot \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\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}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}} \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right), {\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}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79720 = R;
double r79721 = 2.0;
double r79722 = phi1;
double r79723 = phi2;
double r79724 = r79722 - r79723;
double r79725 = r79724 / r79721;
double r79726 = sin(r79725);
double r79727 = pow(r79726, r79721);
double r79728 = cos(r79722);
double r79729 = cos(r79723);
double r79730 = r79728 * r79729;
double r79731 = lambda1;
double r79732 = lambda2;
double r79733 = r79731 - r79732;
double r79734 = r79733 / r79721;
double r79735 = sin(r79734);
double r79736 = r79730 * r79735;
double r79737 = r79736 * r79735;
double r79738 = r79727 + r79737;
double r79739 = sqrt(r79738);
double r79740 = 1.0;
double r79741 = r79740 - r79738;
double r79742 = sqrt(r79741);
double r79743 = atan2(r79739, r79742);
double r79744 = r79721 * r79743;
double r79745 = r79720 * r79744;
return r79745;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79746 = R;
double r79747 = 2.0;
double r79748 = r79746 * r79747;
double r79749 = phi1;
double r79750 = cos(r79749);
double r79751 = phi2;
double r79752 = cos(r79751);
double r79753 = r79750 * r79752;
double r79754 = lambda1;
double r79755 = lambda2;
double r79756 = r79754 - r79755;
double r79757 = r79756 / r79747;
double r79758 = sin(r79757);
double r79759 = r79758 * r79758;
double r79760 = r79749 / r79747;
double r79761 = sin(r79760);
double r79762 = r79751 / r79747;
double r79763 = cos(r79762);
double r79764 = r79761 * r79763;
double r79765 = cos(r79760);
double r79766 = sin(r79762);
double r79767 = r79765 * r79766;
double r79768 = r79764 - r79767;
double r79769 = pow(r79768, r79747);
double r79770 = fma(r79753, r79759, r79769);
double r79771 = sqrt(r79770);
double r79772 = 1.0;
double r79773 = 3.0;
double r79774 = pow(r79758, r79773);
double r79775 = cbrt(r79774);
double r79776 = exp(r79758);
double r79777 = log(r79776);
double r79778 = r79775 * r79777;
double r79779 = fma(r79753, r79778, r79769);
double r79780 = r79772 - r79779;
double r79781 = sqrt(r79780);
double r79782 = atan2(r79771, r79781);
double r79783 = r79748 * r79782;
return r79783;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.7
Simplified24.7
rmApplied div-sub24.7
Applied sin-diff24.0
rmApplied div-sub24.0
Applied sin-diff14.2
rmApplied add-log-exp14.2
rmApplied add-cbrt-cube14.2
Simplified14.2
Final simplification14.2
herbie shell --seed 2019351 +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))))))))))