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(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right), \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right), {\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \sin \left(\frac{\phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \sqrt[3]{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right), {\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \sin \left(\frac{\phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1}{2}\right)\right)}^{2}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2950681 = R;
double r2950682 = 2.0;
double r2950683 = phi1;
double r2950684 = phi2;
double r2950685 = r2950683 - r2950684;
double r2950686 = r2950685 / r2950682;
double r2950687 = sin(r2950686);
double r2950688 = pow(r2950687, r2950682);
double r2950689 = cos(r2950683);
double r2950690 = cos(r2950684);
double r2950691 = r2950689 * r2950690;
double r2950692 = lambda1;
double r2950693 = lambda2;
double r2950694 = r2950692 - r2950693;
double r2950695 = r2950694 / r2950682;
double r2950696 = sin(r2950695);
double r2950697 = r2950691 * r2950696;
double r2950698 = r2950697 * r2950696;
double r2950699 = r2950688 + r2950698;
double r2950700 = sqrt(r2950699);
double r2950701 = 1.0;
double r2950702 = r2950701 - r2950699;
double r2950703 = sqrt(r2950702);
double r2950704 = atan2(r2950700, r2950703);
double r2950705 = r2950682 * r2950704;
double r2950706 = r2950681 * r2950705;
return r2950706;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2950707 = R;
double r2950708 = 2.0;
double r2950709 = r2950707 * r2950708;
double r2950710 = lambda1;
double r2950711 = lambda2;
double r2950712 = r2950710 - r2950711;
double r2950713 = r2950712 / r2950708;
double r2950714 = sin(r2950713);
double r2950715 = expm1(r2950714);
double r2950716 = log1p(r2950715);
double r2950717 = phi1;
double r2950718 = cos(r2950717);
double r2950719 = phi2;
double r2950720 = cos(r2950719);
double r2950721 = r2950718 * r2950720;
double r2950722 = r2950714 * r2950721;
double r2950723 = r2950717 / r2950708;
double r2950724 = sin(r2950723);
double r2950725 = r2950719 / r2950708;
double r2950726 = cos(r2950725);
double r2950727 = r2950724 * r2950726;
double r2950728 = sin(r2950725);
double r2950729 = cos(r2950723);
double r2950730 = r2950728 * r2950729;
double r2950731 = r2950727 - r2950730;
double r2950732 = pow(r2950731, r2950708);
double r2950733 = fma(r2950716, r2950722, r2950732);
double r2950734 = sqrt(r2950733);
double r2950735 = 1.0;
double r2950736 = r2950714 * r2950714;
double r2950737 = r2950736 * r2950714;
double r2950738 = cbrt(r2950737);
double r2950739 = r2950738 * r2950721;
double r2950740 = fma(r2950714, r2950739, r2950732);
double r2950741 = r2950735 - r2950740;
double r2950742 = sqrt(r2950741);
double r2950743 = atan2(r2950734, r2950742);
double r2950744 = r2950709 * r2950743;
return r2950744;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.1
Simplified24.1
rmApplied div-sub24.1
Applied sin-diff23.5
rmApplied div-sub23.5
Applied sin-diff13.9
rmApplied log1p-expm1-u14.0
rmApplied add-cbrt-cube14.0
Final simplification14.0
herbie shell --seed 2019200 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))