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 \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3986987 = R;
double r3986988 = lambda1;
double r3986989 = lambda2;
double r3986990 = r3986988 - r3986989;
double r3986991 = phi1;
double r3986992 = phi2;
double r3986993 = r3986991 + r3986992;
double r3986994 = 2.0;
double r3986995 = r3986993 / r3986994;
double r3986996 = cos(r3986995);
double r3986997 = r3986990 * r3986996;
double r3986998 = r3986997 * r3986997;
double r3986999 = r3986991 - r3986992;
double r3987000 = r3986999 * r3986999;
double r3987001 = r3986998 + r3987000;
double r3987002 = sqrt(r3987001);
double r3987003 = r3986987 * r3987002;
return r3987003;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3987004 = lambda1;
double r3987005 = lambda2;
double r3987006 = r3987004 - r3987005;
double r3987007 = phi1;
double r3987008 = phi2;
double r3987009 = r3987007 + r3987008;
double r3987010 = 2.0;
double r3987011 = r3987009 / r3987010;
double r3987012 = cos(r3987011);
double r3987013 = log1p(r3987012);
double r3987014 = expm1(r3987013);
double r3987015 = r3987006 * r3987014;
double r3987016 = r3987007 - r3987008;
double r3987017 = hypot(r3987015, r3987016);
double r3987018 = R;
double r3987019 = r3987017 * r3987018;
return r3987019;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.3
Simplified3.7
rmApplied *-commutative3.7
rmApplied expm1-log1p-u3.8
Final simplification3.8
herbie shell --seed 2019200 +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.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))