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 \mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)\right)\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)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r66754 = R;
double r66755 = 2.0;
double r66756 = phi1;
double r66757 = phi2;
double r66758 = r66756 - r66757;
double r66759 = r66758 / r66755;
double r66760 = sin(r66759);
double r66761 = pow(r66760, r66755);
double r66762 = cos(r66756);
double r66763 = cos(r66757);
double r66764 = r66762 * r66763;
double r66765 = lambda1;
double r66766 = lambda2;
double r66767 = r66765 - r66766;
double r66768 = r66767 / r66755;
double r66769 = sin(r66768);
double r66770 = r66764 * r66769;
double r66771 = r66770 * r66769;
double r66772 = r66761 + r66771;
double r66773 = sqrt(r66772);
double r66774 = 1.0;
double r66775 = r66774 - r66772;
double r66776 = sqrt(r66775);
double r66777 = atan2(r66773, r66776);
double r66778 = r66755 * r66777;
double r66779 = r66754 * r66778;
return r66779;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r66780 = R;
double r66781 = 2.0;
double r66782 = phi1;
double r66783 = phi2;
double r66784 = r66782 - r66783;
double r66785 = r66784 / r66781;
double r66786 = sin(r66785);
double r66787 = pow(r66786, r66781);
double r66788 = cos(r66782);
double r66789 = cos(r66783);
double r66790 = r66788 * r66789;
double r66791 = lambda1;
double r66792 = lambda2;
double r66793 = r66791 - r66792;
double r66794 = r66793 / r66781;
double r66795 = sin(r66794);
double r66796 = log1p(r66795);
double r66797 = expm1(r66796);
double r66798 = expm1(r66797);
double r66799 = log1p(r66798);
double r66800 = r66790 * r66799;
double r66801 = r66800 * r66795;
double r66802 = r66787 + r66801;
double r66803 = sqrt(r66802);
double r66804 = 1.0;
double r66805 = r66790 * r66795;
double r66806 = r66805 * r66795;
double r66807 = r66787 + r66806;
double r66808 = r66804 - r66807;
double r66809 = sqrt(r66808);
double r66810 = atan2(r66803, r66809);
double r66811 = r66781 * r66810;
double r66812 = r66780 * r66811;
return r66812;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 23.9
rmApplied log1p-expm1-u23.9
rmApplied expm1-log1p-u23.9
Final simplification23.9
herbie shell --seed 2019325 +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))))))))))