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 \tan^{-1}_* \frac{\sqrt{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}}\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68966 = R;
double r68967 = 2.0;
double r68968 = phi1;
double r68969 = phi2;
double r68970 = r68968 - r68969;
double r68971 = r68970 / r68967;
double r68972 = sin(r68971);
double r68973 = pow(r68972, r68967);
double r68974 = cos(r68968);
double r68975 = cos(r68969);
double r68976 = r68974 * r68975;
double r68977 = lambda1;
double r68978 = lambda2;
double r68979 = r68977 - r68978;
double r68980 = r68979 / r68967;
double r68981 = sin(r68980);
double r68982 = r68976 * r68981;
double r68983 = r68982 * r68981;
double r68984 = r68973 + r68983;
double r68985 = sqrt(r68984);
double r68986 = 1.0;
double r68987 = r68986 - r68984;
double r68988 = sqrt(r68987);
double r68989 = atan2(r68985, r68988);
double r68990 = r68967 * r68989;
double r68991 = r68966 * r68990;
return r68991;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68992 = 2.0;
double r68993 = lambda1;
double r68994 = lambda2;
double r68995 = r68993 - r68994;
double r68996 = r68995 / r68992;
double r68997 = sin(r68996);
double r68998 = phi2;
double r68999 = cos(r68998);
double r69000 = phi1;
double r69001 = cos(r69000);
double r69002 = r68999 * r69001;
double r69003 = r69002 * r68997;
double r69004 = r68997 * r69003;
double r69005 = r69000 - r68998;
double r69006 = r69005 / r68992;
double r69007 = sin(r69006);
double r69008 = pow(r69007, r68992);
double r69009 = r69004 + r69008;
double r69010 = sqrt(r69009);
double r69011 = 1.0;
double r69012 = exp(r68997);
double r69013 = log(r69012);
double r69014 = r69002 * r69013;
double r69015 = r69014 * r69013;
double r69016 = r69008 + r69015;
double r69017 = r69011 - r69016;
double r69018 = sqrt(r69017);
double r69019 = atan2(r69010, r69018);
double r69020 = r68992 * r69019;
double r69021 = R;
double r69022 = r69020 * r69021;
return r69022;
}



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-log-exp24.4
rmApplied add-log-exp24.4
Final simplification24.4
herbie shell --seed 2019179
(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))))))))))