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 r72047 = R;
double r72048 = lambda1;
double r72049 = lambda2;
double r72050 = r72048 - r72049;
double r72051 = phi1;
double r72052 = phi2;
double r72053 = r72051 + r72052;
double r72054 = 2.0;
double r72055 = r72053 / r72054;
double r72056 = cos(r72055);
double r72057 = r72050 * r72056;
double r72058 = r72057 * r72057;
double r72059 = r72051 - r72052;
double r72060 = r72059 * r72059;
double r72061 = r72058 + r72060;
double r72062 = sqrt(r72061);
double r72063 = r72047 * r72062;
return r72063;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r72064 = lambda1;
double r72065 = lambda2;
double r72066 = r72064 - r72065;
double r72067 = phi1;
double r72068 = phi2;
double r72069 = r72067 + r72068;
double r72070 = 2.0;
double r72071 = r72069 / r72070;
double r72072 = cos(r72071);
double r72073 = log1p(r72072);
double r72074 = expm1(r72073);
double r72075 = r72066 * r72074;
double r72076 = r72067 - r72068;
double r72077 = hypot(r72075, r72076);
double r72078 = R;
double r72079 = r72077 * r72078;
return r72079;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 38.9
Simplified3.5
rmApplied expm1-log1p-u3.5
Final simplification3.5
herbie shell --seed 2020047 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
:precision binary64
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))