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 r56223 = R;
double r56224 = lambda1;
double r56225 = lambda2;
double r56226 = r56224 - r56225;
double r56227 = phi1;
double r56228 = phi2;
double r56229 = r56227 + r56228;
double r56230 = 2.0;
double r56231 = r56229 / r56230;
double r56232 = cos(r56231);
double r56233 = r56226 * r56232;
double r56234 = r56233 * r56233;
double r56235 = r56227 - r56228;
double r56236 = r56235 * r56235;
double r56237 = r56234 + r56236;
double r56238 = sqrt(r56237);
double r56239 = r56223 * r56238;
return r56239;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r56240 = lambda1;
double r56241 = lambda2;
double r56242 = r56240 - r56241;
double r56243 = phi1;
double r56244 = phi2;
double r56245 = r56243 + r56244;
double r56246 = 2.0;
double r56247 = r56245 / r56246;
double r56248 = cos(r56247);
double r56249 = log1p(r56248);
double r56250 = expm1(r56249);
double r56251 = r56242 * r56250;
double r56252 = r56243 - r56244;
double r56253 = hypot(r56251, r56252);
double r56254 = R;
double r56255 = r56253 * r56254;
return r56255;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.9
Simplified3.7
rmApplied expm1-log1p-u3.7
Final simplification3.7
herbie shell --seed 2019305 +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))))))