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 r61850 = R;
double r61851 = 2.0;
double r61852 = phi1;
double r61853 = phi2;
double r61854 = r61852 - r61853;
double r61855 = r61854 / r61851;
double r61856 = sin(r61855);
double r61857 = pow(r61856, r61851);
double r61858 = cos(r61852);
double r61859 = cos(r61853);
double r61860 = r61858 * r61859;
double r61861 = lambda1;
double r61862 = lambda2;
double r61863 = r61861 - r61862;
double r61864 = r61863 / r61851;
double r61865 = sin(r61864);
double r61866 = r61860 * r61865;
double r61867 = r61866 * r61865;
double r61868 = r61857 + r61867;
double r61869 = sqrt(r61868);
double r61870 = 1.0;
double r61871 = r61870 - r61868;
double r61872 = sqrt(r61871);
double r61873 = atan2(r61869, r61872);
double r61874 = r61851 * r61873;
double r61875 = r61850 * r61874;
return r61875;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r61876 = R;
double r61877 = 2.0;
double r61878 = phi1;
double r61879 = phi2;
double r61880 = r61878 - r61879;
double r61881 = r61880 / r61877;
double r61882 = sin(r61881);
double r61883 = pow(r61882, r61877);
double r61884 = cos(r61878);
double r61885 = cos(r61879);
double r61886 = r61884 * r61885;
double r61887 = lambda1;
double r61888 = lambda2;
double r61889 = r61887 - r61888;
double r61890 = r61889 / r61877;
double r61891 = sin(r61890);
double r61892 = r61886 * r61891;
double r61893 = r61892 * r61891;
double r61894 = r61883 + r61893;
double r61895 = sqrt(r61894);
double r61896 = 1.0;
double r61897 = 3.0;
double r61898 = pow(r61891, r61897);
double r61899 = cbrt(r61898);
double r61900 = r61886 * r61899;
double r61901 = r61900 * r61899;
double r61902 = r61883 + r61901;
double r61903 = r61896 - r61902;
double r61904 = sqrt(r61903);
double r61905 = atan2(r61895, r61904);
double r61906 = r61877 * r61905;
double r61907 = r61876 * r61906;
return r61907;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
Final simplification24.6
herbie shell --seed 2019326
(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))))))))))