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 \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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^{\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104983 = R;
double r104984 = 2.0;
double r104985 = phi1;
double r104986 = phi2;
double r104987 = r104985 - r104986;
double r104988 = r104987 / r104984;
double r104989 = sin(r104988);
double r104990 = pow(r104989, r104984);
double r104991 = cos(r104985);
double r104992 = cos(r104986);
double r104993 = r104991 * r104992;
double r104994 = lambda1;
double r104995 = lambda2;
double r104996 = r104994 - r104995;
double r104997 = r104996 / r104984;
double r104998 = sin(r104997);
double r104999 = r104993 * r104998;
double r105000 = r104999 * r104998;
double r105001 = r104990 + r105000;
double r105002 = sqrt(r105001);
double r105003 = 1.0;
double r105004 = r105003 - r105001;
double r105005 = sqrt(r105004);
double r105006 = atan2(r105002, r105005);
double r105007 = r104984 * r105006;
double r105008 = r104983 * r105007;
return r105008;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r105009 = R;
double r105010 = 2.0;
double r105011 = phi1;
double r105012 = phi2;
double r105013 = r105011 - r105012;
double r105014 = r105013 / r105010;
double r105015 = sin(r105014);
double r105016 = pow(r105015, r105010);
double r105017 = cos(r105011);
double r105018 = cos(r105012);
double r105019 = r105017 * r105018;
double r105020 = lambda1;
double r105021 = lambda2;
double r105022 = r105020 - r105021;
double r105023 = r105022 / r105010;
double r105024 = sin(r105023);
double r105025 = expm1(r105024);
double r105026 = log1p(r105025);
double r105027 = r105019 * r105026;
double r105028 = r105027 * r105026;
double r105029 = r105016 + r105028;
double r105030 = sqrt(r105029);
double r105031 = 1.0;
double r105032 = r105019 * r105024;
double r105033 = log1p(r105024);
double r105034 = expm1(r105033);
double r105035 = exp(r105034);
double r105036 = log(r105035);
double r105037 = r105032 * r105036;
double r105038 = r105016 + r105037;
double r105039 = r105031 - r105038;
double r105040 = sqrt(r105039);
double r105041 = atan2(r105030, r105040);
double r105042 = r105010 * r105041;
double r105043 = r105009 * r105042;
return r105043;
}



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-log-exp24.6
rmApplied log1p-expm1-u24.6
rmApplied log1p-expm1-u24.6
rmApplied expm1-log1p-u24.6
Final simplification24.6
herbie shell --seed 2020060 +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))))))))))