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 r65561 = R;
double r65562 = lambda1;
double r65563 = lambda2;
double r65564 = r65562 - r65563;
double r65565 = phi1;
double r65566 = phi2;
double r65567 = r65565 + r65566;
double r65568 = 2.0;
double r65569 = r65567 / r65568;
double r65570 = cos(r65569);
double r65571 = r65564 * r65570;
double r65572 = r65571 * r65571;
double r65573 = r65565 - r65566;
double r65574 = r65573 * r65573;
double r65575 = r65572 + r65574;
double r65576 = sqrt(r65575);
double r65577 = r65561 * r65576;
return r65577;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r65578 = lambda1;
double r65579 = lambda2;
double r65580 = r65578 - r65579;
double r65581 = phi1;
double r65582 = phi2;
double r65583 = r65581 + r65582;
double r65584 = 2.0;
double r65585 = r65583 / r65584;
double r65586 = cos(r65585);
double r65587 = 3.0;
double r65588 = pow(r65586, r65587);
double r65589 = cbrt(r65588);
double r65590 = log1p(r65589);
double r65591 = expm1(r65590);
double r65592 = r65580 * r65591;
double r65593 = r65581 - r65582;
double r65594 = hypot(r65592, r65593);
double r65595 = R;
double r65596 = r65594 * r65595;
return r65596;
}



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))))))