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(\sqrt[3]{{\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)}^{3}}\right)\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r62726 = R;
double r62727 = lambda1;
double r62728 = lambda2;
double r62729 = r62727 - r62728;
double r62730 = phi1;
double r62731 = phi2;
double r62732 = r62730 + r62731;
double r62733 = 2.0;
double r62734 = r62732 / r62733;
double r62735 = cos(r62734);
double r62736 = r62729 * r62735;
double r62737 = r62736 * r62736;
double r62738 = r62730 - r62731;
double r62739 = r62738 * r62738;
double r62740 = r62737 + r62739;
double r62741 = sqrt(r62740);
double r62742 = r62726 * r62741;
return r62742;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r62743 = lambda1;
double r62744 = lambda2;
double r62745 = r62743 - r62744;
double r62746 = phi1;
double r62747 = phi2;
double r62748 = r62746 + r62747;
double r62749 = 2.0;
double r62750 = r62748 / r62749;
double r62751 = cos(r62750);
double r62752 = 3.0;
double r62753 = pow(r62751, r62752);
double r62754 = cbrt(r62753);
double r62755 = log1p(r62754);
double r62756 = expm1(r62755);
double r62757 = r62745 * r62756;
double r62758 = r62746 - r62747;
double r62759 = hypot(r62757, r62758);
double r62760 = R;
double r62761 = r62759 * r62760;
return r62761;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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