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 r43835 = R;
double r43836 = 2.0;
double r43837 = phi1;
double r43838 = phi2;
double r43839 = r43837 - r43838;
double r43840 = r43839 / r43836;
double r43841 = sin(r43840);
double r43842 = pow(r43841, r43836);
double r43843 = cos(r43837);
double r43844 = cos(r43838);
double r43845 = r43843 * r43844;
double r43846 = lambda1;
double r43847 = lambda2;
double r43848 = r43846 - r43847;
double r43849 = r43848 / r43836;
double r43850 = sin(r43849);
double r43851 = r43845 * r43850;
double r43852 = r43851 * r43850;
double r43853 = r43842 + r43852;
double r43854 = sqrt(r43853);
double r43855 = 1.0;
double r43856 = r43855 - r43853;
double r43857 = sqrt(r43856);
double r43858 = atan2(r43854, r43857);
double r43859 = r43836 * r43858;
double r43860 = r43835 * r43859;
return r43860;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r43861 = R;
double r43862 = 2.0;
double r43863 = phi1;
double r43864 = phi2;
double r43865 = r43863 - r43864;
double r43866 = r43865 / r43862;
double r43867 = sin(r43866);
double r43868 = pow(r43867, r43862);
double r43869 = cos(r43863);
double r43870 = cos(r43864);
double r43871 = r43869 * r43870;
double r43872 = lambda1;
double r43873 = lambda2;
double r43874 = r43872 - r43873;
double r43875 = r43874 / r43862;
double r43876 = sin(r43875);
double r43877 = log1p(r43876);
double r43878 = expm1(r43877);
double r43879 = expm1(r43878);
double r43880 = log1p(r43879);
double r43881 = r43871 * r43880;
double r43882 = r43881 * r43876;
double r43883 = r43868 + r43882;
double r43884 = sqrt(r43883);
double r43885 = 1.0;
double r43886 = r43871 * r43876;
double r43887 = r43886 * r43876;
double r43888 = r43868 + r43887;
double r43889 = r43885 - r43888;
double r43890 = sqrt(r43889);
double r43891 = atan2(r43884, r43890);
double r43892 = r43862 * r43891;
double r43893 = r43861 * r43892;
return r43893;
}



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-u24.0
Final simplification24.0
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))))))))))