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{log1p}\left(\mathsf{expm1}\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 r43409 = R;
double r43410 = lambda1;
double r43411 = lambda2;
double r43412 = r43410 - r43411;
double r43413 = phi1;
double r43414 = phi2;
double r43415 = r43413 + r43414;
double r43416 = 2.0;
double r43417 = r43415 / r43416;
double r43418 = cos(r43417);
double r43419 = r43412 * r43418;
double r43420 = r43419 * r43419;
double r43421 = r43413 - r43414;
double r43422 = r43421 * r43421;
double r43423 = r43420 + r43422;
double r43424 = sqrt(r43423);
double r43425 = r43409 * r43424;
return r43425;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r43426 = lambda1;
double r43427 = lambda2;
double r43428 = r43426 - r43427;
double r43429 = phi1;
double r43430 = phi2;
double r43431 = r43429 + r43430;
double r43432 = 2.0;
double r43433 = r43431 / r43432;
double r43434 = cos(r43433);
double r43435 = expm1(r43434);
double r43436 = log1p(r43435);
double r43437 = r43428 * r43436;
double r43438 = r43429 - r43430;
double r43439 = hypot(r43437, r43438);
double r43440 = R;
double r43441 = r43439 * r43440;
return r43441;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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