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)\left(2 \cdot R\right) \cdot \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \cos \phi_2 \cdot \left(\cos \phi_1 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\sqrt[3]{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}, \left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \cos \phi_1\right) \cdot \cos \phi_2, {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4095837 = R;
double r4095838 = 2.0;
double r4095839 = phi1;
double r4095840 = phi2;
double r4095841 = r4095839 - r4095840;
double r4095842 = r4095841 / r4095838;
double r4095843 = sin(r4095842);
double r4095844 = pow(r4095843, r4095838);
double r4095845 = cos(r4095839);
double r4095846 = cos(r4095840);
double r4095847 = r4095845 * r4095846;
double r4095848 = lambda1;
double r4095849 = lambda2;
double r4095850 = r4095848 - r4095849;
double r4095851 = r4095850 / r4095838;
double r4095852 = sin(r4095851);
double r4095853 = r4095847 * r4095852;
double r4095854 = r4095853 * r4095852;
double r4095855 = r4095844 + r4095854;
double r4095856 = sqrt(r4095855);
double r4095857 = 1.0;
double r4095858 = r4095857 - r4095855;
double r4095859 = sqrt(r4095858);
double r4095860 = atan2(r4095856, r4095859);
double r4095861 = r4095838 * r4095860;
double r4095862 = r4095837 * r4095861;
return r4095862;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4095863 = 2.0;
double r4095864 = R;
double r4095865 = r4095863 * r4095864;
double r4095866 = lambda1;
double r4095867 = lambda2;
double r4095868 = r4095866 - r4095867;
double r4095869 = r4095868 / r4095863;
double r4095870 = sin(r4095869);
double r4095871 = phi2;
double r4095872 = cos(r4095871);
double r4095873 = phi1;
double r4095874 = cos(r4095873);
double r4095875 = r4095874 * r4095870;
double r4095876 = r4095872 * r4095875;
double r4095877 = r4095873 - r4095871;
double r4095878 = r4095877 / r4095863;
double r4095879 = sin(r4095878);
double r4095880 = pow(r4095879, r4095863);
double r4095881 = fma(r4095870, r4095876, r4095880);
double r4095882 = sqrt(r4095881);
double r4095883 = 1.0;
double r4095884 = r4095870 * r4095870;
double r4095885 = r4095884 * r4095870;
double r4095886 = cbrt(r4095885);
double r4095887 = exp(r4095870);
double r4095888 = log(r4095887);
double r4095889 = r4095888 * r4095874;
double r4095890 = r4095889 * r4095872;
double r4095891 = fma(r4095886, r4095890, r4095880);
double r4095892 = r4095883 - r4095891;
double r4095893 = sqrt(r4095892);
double r4095894 = atan2(r4095882, r4095893);
double r4095895 = r4095865 * r4095894;
return r4095895;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.5
Simplified24.5
rmApplied add-log-exp24.5
rmApplied add-cbrt-cube24.5
Final simplification24.5
herbie shell --seed 2019172 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))