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 \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 r99848 = R;
double r99849 = 2.0;
double r99850 = phi1;
double r99851 = phi2;
double r99852 = r99850 - r99851;
double r99853 = r99852 / r99849;
double r99854 = sin(r99853);
double r99855 = pow(r99854, r99849);
double r99856 = cos(r99850);
double r99857 = cos(r99851);
double r99858 = r99856 * r99857;
double r99859 = lambda1;
double r99860 = lambda2;
double r99861 = r99859 - r99860;
double r99862 = r99861 / r99849;
double r99863 = sin(r99862);
double r99864 = r99858 * r99863;
double r99865 = r99864 * r99863;
double r99866 = r99855 + r99865;
double r99867 = sqrt(r99866);
double r99868 = 1.0;
double r99869 = r99868 - r99866;
double r99870 = sqrt(r99869);
double r99871 = atan2(r99867, r99870);
double r99872 = r99849 * r99871;
double r99873 = r99848 * r99872;
return r99873;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99874 = R;
double r99875 = 2.0;
double r99876 = phi1;
double r99877 = phi2;
double r99878 = r99876 - r99877;
double r99879 = r99878 / r99875;
double r99880 = sin(r99879);
double r99881 = pow(r99880, r99875);
double r99882 = cos(r99876);
double r99883 = cos(r99877);
double r99884 = r99882 * r99883;
double r99885 = lambda1;
double r99886 = lambda2;
double r99887 = r99885 - r99886;
double r99888 = r99887 / r99875;
double r99889 = sin(r99888);
double r99890 = r99884 * r99889;
double r99891 = r99890 * r99889;
double r99892 = r99881 + r99891;
double r99893 = sqrt(r99892);
double r99894 = 1.0;
double r99895 = 3.0;
double r99896 = pow(r99889, r99895);
double r99897 = cbrt(r99896);
double r99898 = r99884 * r99897;
double r99899 = r99898 * r99897;
double r99900 = r99881 + r99899;
double r99901 = r99894 - r99900;
double r99902 = sqrt(r99901);
double r99903 = atan2(r99893, r99902);
double r99904 = r99875 * r99903;
double r99905 = r99874 * r99904;
return r99905;
}



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 add-cbrt-cube24.4
Simplified24.4
rmApplied add-cbrt-cube24.4
Simplified24.4
Final simplification24.4
herbie shell --seed 2019322
(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))))))))))