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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right) + \log \left(\sqrt{e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}\right)\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r116940 = R;
double r116941 = 2.0;
double r116942 = phi1;
double r116943 = phi2;
double r116944 = r116942 - r116943;
double r116945 = r116944 / r116941;
double r116946 = sin(r116945);
double r116947 = pow(r116946, r116941);
double r116948 = cos(r116942);
double r116949 = cos(r116943);
double r116950 = r116948 * r116949;
double r116951 = lambda1;
double r116952 = lambda2;
double r116953 = r116951 - r116952;
double r116954 = r116953 / r116941;
double r116955 = sin(r116954);
double r116956 = r116950 * r116955;
double r116957 = r116956 * r116955;
double r116958 = r116947 + r116957;
double r116959 = sqrt(r116958);
double r116960 = 1.0;
double r116961 = r116960 - r116958;
double r116962 = sqrt(r116961);
double r116963 = atan2(r116959, r116962);
double r116964 = r116941 * r116963;
double r116965 = r116940 * r116964;
return r116965;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r116966 = R;
double r116967 = 2.0;
double r116968 = phi1;
double r116969 = r116968 / r116967;
double r116970 = sin(r116969);
double r116971 = phi2;
double r116972 = r116971 / r116967;
double r116973 = cos(r116972);
double r116974 = r116970 * r116973;
double r116975 = cos(r116969);
double r116976 = sin(r116972);
double r116977 = r116975 * r116976;
double r116978 = r116974 - r116977;
double r116979 = pow(r116978, r116967);
double r116980 = cos(r116968);
double r116981 = cos(r116971);
double r116982 = r116980 * r116981;
double r116983 = lambda1;
double r116984 = lambda2;
double r116985 = r116983 - r116984;
double r116986 = r116985 / r116967;
double r116987 = sin(r116986);
double r116988 = r116982 * r116987;
double r116989 = r116988 * r116987;
double r116990 = r116979 + r116989;
double r116991 = sqrt(r116990);
double r116992 = 1.0;
double r116993 = exp(r116987);
double r116994 = sqrt(r116993);
double r116995 = log(r116994);
double r116996 = r116995 + r116995;
double r116997 = r116982 * r116996;
double r116998 = r116997 * r116987;
double r116999 = r116979 + r116998;
double r117000 = r116992 - r116999;
double r117001 = sqrt(r117000);
double r117002 = atan2(r116991, r117001);
double r117003 = r116967 * r117002;
double r117004 = r116966 * r117003;
return r117004;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.0
rmApplied div-sub24.0
Applied sin-diff23.3
rmApplied div-sub23.3
Applied sin-diff13.4
rmApplied add-log-exp13.4
rmApplied add-sqr-sqrt13.5
Applied log-prod13.5
Final simplification13.5
herbie shell --seed 2020059 +o rules:numerics
(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))))))))))