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 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \log \left(e^{\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r83885 = R;
double r83886 = 2.0;
double r83887 = phi1;
double r83888 = phi2;
double r83889 = r83887 - r83888;
double r83890 = r83889 / r83886;
double r83891 = sin(r83890);
double r83892 = pow(r83891, r83886);
double r83893 = cos(r83887);
double r83894 = cos(r83888);
double r83895 = r83893 * r83894;
double r83896 = lambda1;
double r83897 = lambda2;
double r83898 = r83896 - r83897;
double r83899 = r83898 / r83886;
double r83900 = sin(r83899);
double r83901 = r83895 * r83900;
double r83902 = r83901 * r83900;
double r83903 = r83892 + r83902;
double r83904 = sqrt(r83903);
double r83905 = 1.0;
double r83906 = r83905 - r83903;
double r83907 = sqrt(r83906);
double r83908 = atan2(r83904, r83907);
double r83909 = r83886 * r83908;
double r83910 = r83885 * r83909;
return r83910;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r83911 = R;
double r83912 = 2.0;
double r83913 = r83911 * r83912;
double r83914 = phi1;
double r83915 = cos(r83914);
double r83916 = phi2;
double r83917 = cos(r83916);
double r83918 = r83915 * r83917;
double r83919 = lambda1;
double r83920 = lambda2;
double r83921 = r83919 - r83920;
double r83922 = r83921 / r83912;
double r83923 = sin(r83922);
double r83924 = r83923 * r83923;
double r83925 = r83914 - r83916;
double r83926 = r83925 / r83912;
double r83927 = sin(r83926);
double r83928 = pow(r83927, r83912);
double r83929 = fma(r83918, r83924, r83928);
double r83930 = sqrt(r83929);
double r83931 = 1.0;
double r83932 = expm1(r83923);
double r83933 = log1p(r83932);
double r83934 = exp(r83933);
double r83935 = log(r83934);
double r83936 = r83935 * r83923;
double r83937 = fma(r83918, r83936, r83928);
double r83938 = r83931 - r83937;
double r83939 = sqrt(r83938);
double r83940 = atan2(r83930, r83939);
double r83941 = r83913 * r83940;
return r83941;
}



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 add-log-exp24.1
rmApplied log1p-expm1-u24.1
Final simplification24.1
herbie shell --seed 2019199 +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))))))))))