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 \cos \left(\frac{\phi_1 + \phi_2}{2}\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68445 = R;
double r68446 = lambda1;
double r68447 = lambda2;
double r68448 = r68446 - r68447;
double r68449 = phi1;
double r68450 = phi2;
double r68451 = r68449 + r68450;
double r68452 = 2.0;
double r68453 = r68451 / r68452;
double r68454 = cos(r68453);
double r68455 = r68448 * r68454;
double r68456 = r68455 * r68455;
double r68457 = r68449 - r68450;
double r68458 = r68457 * r68457;
double r68459 = r68456 + r68458;
double r68460 = sqrt(r68459);
double r68461 = r68445 * r68460;
return r68461;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68462 = lambda1;
double r68463 = lambda2;
double r68464 = r68462 - r68463;
double r68465 = phi1;
double r68466 = phi2;
double r68467 = r68465 + r68466;
double r68468 = 2.0;
double r68469 = r68467 / r68468;
double r68470 = cos(r68469);
double r68471 = r68464 * r68470;
double r68472 = r68465 - r68466;
double r68473 = hypot(r68471, r68472);
double r68474 = R;
double r68475 = r68473 * r68474;
return r68475;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.1
Simplified3.8
rmApplied pow13.8
Final simplification3.8
herbie shell --seed 2020043 +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))))))