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 \sqrt[3]{{\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)}^{3}}, \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r91614 = R;
double r91615 = lambda1;
double r91616 = lambda2;
double r91617 = r91615 - r91616;
double r91618 = phi1;
double r91619 = phi2;
double r91620 = r91618 + r91619;
double r91621 = 2.0;
double r91622 = r91620 / r91621;
double r91623 = cos(r91622);
double r91624 = r91617 * r91623;
double r91625 = r91624 * r91624;
double r91626 = r91618 - r91619;
double r91627 = r91626 * r91626;
double r91628 = r91625 + r91627;
double r91629 = sqrt(r91628);
double r91630 = r91614 * r91629;
return r91630;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r91631 = lambda1;
double r91632 = lambda2;
double r91633 = r91631 - r91632;
double r91634 = phi1;
double r91635 = phi2;
double r91636 = r91634 + r91635;
double r91637 = 2.0;
double r91638 = r91636 / r91637;
double r91639 = cos(r91638);
double r91640 = 3.0;
double r91641 = pow(r91639, r91640);
double r91642 = cbrt(r91641);
double r91643 = r91633 * r91642;
double r91644 = r91634 - r91635;
double r91645 = hypot(r91643, r91644);
double r91646 = R;
double r91647 = r91645 * r91646;
return r91647;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 39.4
Simplified3.6
rmApplied add-cbrt-cube3.6
Simplified3.6
Final simplification3.6
herbie shell --seed 2020039 +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))))))