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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r70862 = R;
double r70863 = 2.0;
double r70864 = phi1;
double r70865 = phi2;
double r70866 = r70864 - r70865;
double r70867 = r70866 / r70863;
double r70868 = sin(r70867);
double r70869 = pow(r70868, r70863);
double r70870 = cos(r70864);
double r70871 = cos(r70865);
double r70872 = r70870 * r70871;
double r70873 = lambda1;
double r70874 = lambda2;
double r70875 = r70873 - r70874;
double r70876 = r70875 / r70863;
double r70877 = sin(r70876);
double r70878 = r70872 * r70877;
double r70879 = r70878 * r70877;
double r70880 = r70869 + r70879;
double r70881 = sqrt(r70880);
double r70882 = 1.0;
double r70883 = r70882 - r70880;
double r70884 = sqrt(r70883);
double r70885 = atan2(r70881, r70884);
double r70886 = r70863 * r70885;
double r70887 = r70862 * r70886;
return r70887;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r70888 = R;
double r70889 = 2.0;
double r70890 = phi1;
double r70891 = phi2;
double r70892 = r70890 - r70891;
double r70893 = r70892 / r70889;
double r70894 = sin(r70893);
double r70895 = pow(r70894, r70889);
double r70896 = cos(r70890);
double r70897 = cos(r70891);
double r70898 = r70896 * r70897;
double r70899 = lambda1;
double r70900 = lambda2;
double r70901 = r70899 - r70900;
double r70902 = r70901 / r70889;
double r70903 = sin(r70902);
double r70904 = r70898 * r70903;
double r70905 = r70904 * r70903;
double r70906 = r70895 + r70905;
double r70907 = sqrt(r70906);
double r70908 = 1.0;
double r70909 = exp(r70903);
double r70910 = log(r70909);
double r70911 = r70898 * r70910;
double r70912 = 3.0;
double r70913 = pow(r70903, r70912);
double r70914 = cbrt(r70913);
double r70915 = r70911 * r70914;
double r70916 = r70895 + r70915;
double r70917 = r70908 - r70916;
double r70918 = sqrt(r70917);
double r70919 = atan2(r70907, r70918);
double r70920 = r70889 * r70919;
double r70921 = r70888 * r70920;
return r70921;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.1
rmApplied add-cbrt-cube24.1
Simplified24.1
rmApplied add-log-exp24.1
Final simplification24.1
herbie shell --seed 2019362
(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))))))))))