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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \log \left(e^{\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r69839 = R;
double r69840 = 2.0;
double r69841 = phi1;
double r69842 = phi2;
double r69843 = r69841 - r69842;
double r69844 = r69843 / r69840;
double r69845 = sin(r69844);
double r69846 = pow(r69845, r69840);
double r69847 = cos(r69841);
double r69848 = cos(r69842);
double r69849 = r69847 * r69848;
double r69850 = lambda1;
double r69851 = lambda2;
double r69852 = r69850 - r69851;
double r69853 = r69852 / r69840;
double r69854 = sin(r69853);
double r69855 = r69849 * r69854;
double r69856 = r69855 * r69854;
double r69857 = r69846 + r69856;
double r69858 = sqrt(r69857);
double r69859 = 1.0;
double r69860 = r69859 - r69857;
double r69861 = sqrt(r69860);
double r69862 = atan2(r69858, r69861);
double r69863 = r69840 * r69862;
double r69864 = r69839 * r69863;
return r69864;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r69865 = R;
double r69866 = 2.0;
double r69867 = phi1;
double r69868 = phi2;
double r69869 = r69867 - r69868;
double r69870 = r69869 / r69866;
double r69871 = sin(r69870);
double r69872 = pow(r69871, r69866);
double r69873 = cos(r69867);
double r69874 = cos(r69868);
double r69875 = r69873 * r69874;
double r69876 = lambda1;
double r69877 = lambda2;
double r69878 = r69876 - r69877;
double r69879 = r69878 / r69866;
double r69880 = sin(r69879);
double r69881 = r69875 * r69880;
double r69882 = r69881 * r69880;
double r69883 = r69872 + r69882;
double r69884 = sqrt(r69883);
double r69885 = 1.0;
double r69886 = cbrt(r69880);
double r69887 = r69886 * r69886;
double r69888 = r69887 * r69886;
double r69889 = exp(r69888);
double r69890 = log(r69889);
double r69891 = r69881 * r69890;
double r69892 = r69872 + r69891;
double r69893 = r69885 - r69892;
double r69894 = sqrt(r69893);
double r69895 = atan2(r69884, r69894);
double r69896 = r69866 * r69895;
double r69897 = r69865 * r69896;
return r69897;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.3
rmApplied add-log-exp24.3
rmApplied add-cube-cbrt24.4
Final simplification24.4
herbie shell --seed 2020047
(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))))))))))