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(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2923718 = R;
double r2923719 = 2.0;
double r2923720 = phi1;
double r2923721 = phi2;
double r2923722 = r2923720 - r2923721;
double r2923723 = r2923722 / r2923719;
double r2923724 = sin(r2923723);
double r2923725 = pow(r2923724, r2923719);
double r2923726 = cos(r2923720);
double r2923727 = cos(r2923721);
double r2923728 = r2923726 * r2923727;
double r2923729 = lambda1;
double r2923730 = lambda2;
double r2923731 = r2923729 - r2923730;
double r2923732 = r2923731 / r2923719;
double r2923733 = sin(r2923732);
double r2923734 = r2923728 * r2923733;
double r2923735 = r2923734 * r2923733;
double r2923736 = r2923725 + r2923735;
double r2923737 = sqrt(r2923736);
double r2923738 = 1.0;
double r2923739 = r2923738 - r2923736;
double r2923740 = sqrt(r2923739);
double r2923741 = atan2(r2923737, r2923740);
double r2923742 = r2923719 * r2923741;
double r2923743 = r2923718 * r2923742;
return r2923743;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2923744 = R;
double r2923745 = 2.0;
double r2923746 = r2923744 * r2923745;
double r2923747 = lambda1;
double r2923748 = lambda2;
double r2923749 = r2923747 - r2923748;
double r2923750 = r2923749 / r2923745;
double r2923751 = sin(r2923750);
double r2923752 = r2923751 * r2923751;
double r2923753 = phi1;
double r2923754 = cos(r2923753);
double r2923755 = phi2;
double r2923756 = cos(r2923755);
double r2923757 = r2923754 * r2923756;
double r2923758 = r2923753 - r2923755;
double r2923759 = r2923758 / r2923745;
double r2923760 = sin(r2923759);
double r2923761 = r2923760 * r2923760;
double r2923762 = fma(r2923752, r2923757, r2923761);
double r2923763 = sqrt(r2923762);
double r2923764 = cos(r2923759);
double r2923765 = r2923764 * r2923764;
double r2923766 = expm1(r2923751);
double r2923767 = log1p(r2923766);
double r2923768 = r2923767 * r2923751;
double r2923769 = r2923757 * r2923768;
double r2923770 = r2923765 - r2923769;
double r2923771 = sqrt(r2923770);
double r2923772 = atan2(r2923763, r2923771);
double r2923773 = r2923746 * r2923772;
return r2923773;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 23.9
Simplified23.9
rmApplied log1p-expm1-u23.9
Final simplification23.9
herbie shell --seed 2019146 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* 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))))))))))