R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\mathsf{hypot}\left(\left(\lambda_1 - \lambda_2\right) \cdot \sqrt[3]{\left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right) \cdot \log \left(e^{\cos \left(\frac{\phi_2 + \phi_1}{2}\right)}\right)\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right)}, \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2932990 = R;
double r2932991 = lambda1;
double r2932992 = lambda2;
double r2932993 = r2932991 - r2932992;
double r2932994 = phi1;
double r2932995 = phi2;
double r2932996 = r2932994 + r2932995;
double r2932997 = 2.0;
double r2932998 = r2932996 / r2932997;
double r2932999 = cos(r2932998);
double r2933000 = r2932993 * r2932999;
double r2933001 = r2933000 * r2933000;
double r2933002 = r2932994 - r2932995;
double r2933003 = r2933002 * r2933002;
double r2933004 = r2933001 + r2933003;
double r2933005 = sqrt(r2933004);
double r2933006 = r2932990 * r2933005;
return r2933006;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2933007 = lambda1;
double r2933008 = lambda2;
double r2933009 = r2933007 - r2933008;
double r2933010 = phi2;
double r2933011 = phi1;
double r2933012 = r2933010 + r2933011;
double r2933013 = 2.0;
double r2933014 = r2933012 / r2933013;
double r2933015 = cos(r2933014);
double r2933016 = exp(r2933015);
double r2933017 = log(r2933016);
double r2933018 = r2933015 * r2933017;
double r2933019 = r2933018 * r2933015;
double r2933020 = cbrt(r2933019);
double r2933021 = r2933009 * r2933020;
double r2933022 = r2933011 - r2933010;
double r2933023 = hypot(r2933021, r2933022);
double r2933024 = R;
double r2933025 = r2933023 * r2933024;
return r2933025;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 37.3
Simplified3.8
rmApplied add-cbrt-cube3.9
rmApplied add-log-exp3.9
Final simplification3.9
herbie shell --seed 2019143 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))