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 \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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r65899 = R;
double r65900 = 2.0;
double r65901 = phi1;
double r65902 = phi2;
double r65903 = r65901 - r65902;
double r65904 = r65903 / r65900;
double r65905 = sin(r65904);
double r65906 = pow(r65905, r65900);
double r65907 = cos(r65901);
double r65908 = cos(r65902);
double r65909 = r65907 * r65908;
double r65910 = lambda1;
double r65911 = lambda2;
double r65912 = r65910 - r65911;
double r65913 = r65912 / r65900;
double r65914 = sin(r65913);
double r65915 = r65909 * r65914;
double r65916 = r65915 * r65914;
double r65917 = r65906 + r65916;
double r65918 = sqrt(r65917);
double r65919 = 1.0;
double r65920 = r65919 - r65917;
double r65921 = sqrt(r65920);
double r65922 = atan2(r65918, r65921);
double r65923 = r65900 * r65922;
double r65924 = r65899 * r65923;
return r65924;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r65925 = R;
double r65926 = 2.0;
double r65927 = phi1;
double r65928 = phi2;
double r65929 = r65927 - r65928;
double r65930 = r65929 / r65926;
double r65931 = sin(r65930);
double r65932 = pow(r65931, r65926);
double r65933 = cos(r65927);
double r65934 = cos(r65928);
double r65935 = r65933 * r65934;
double r65936 = lambda1;
double r65937 = lambda2;
double r65938 = r65936 - r65937;
double r65939 = r65938 / r65926;
double r65940 = sin(r65939);
double r65941 = r65935 * r65940;
double r65942 = r65941 * r65940;
double r65943 = r65932 + r65942;
double r65944 = sqrt(r65943);
double r65945 = 1.0;
double r65946 = 3.0;
double r65947 = pow(r65940, r65946);
double r65948 = cbrt(r65947);
double r65949 = r65935 * r65948;
double r65950 = expm1(r65948);
double r65951 = log1p(r65950);
double r65952 = r65949 * r65951;
double r65953 = r65932 + r65952;
double r65954 = r65945 - r65953;
double r65955 = sqrt(r65954);
double r65956 = atan2(r65944, r65955);
double r65957 = r65926 * r65956;
double r65958 = r65925 * r65957;
return r65958;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied log1p-expm1-u24.4
rmApplied add-cbrt-cube24.4
Simplified24.4
rmApplied add-cbrt-cube24.4
Simplified24.4
Final simplification24.4
herbie shell --seed 2019322 +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))))))))))