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(\cos \left(\phi_2 \cdot 0.5\right) \cdot \cos \left(\phi_1 \cdot 0.5\right) - \sqrt[3]{{\left(\sin \left(\phi_2 \cdot 0.5\right) \cdot \sin \left(\phi_1 \cdot 0.5\right)\right)}^{3}}\right) \cdot \left(\lambda_1 - \lambda_2\right), \phi_1 - \phi_2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99541 = R;
double r99542 = lambda1;
double r99543 = lambda2;
double r99544 = r99542 - r99543;
double r99545 = phi1;
double r99546 = phi2;
double r99547 = r99545 + r99546;
double r99548 = 2.0;
double r99549 = r99547 / r99548;
double r99550 = cos(r99549);
double r99551 = r99544 * r99550;
double r99552 = r99551 * r99551;
double r99553 = r99545 - r99546;
double r99554 = r99553 * r99553;
double r99555 = r99552 + r99554;
double r99556 = sqrt(r99555);
double r99557 = r99541 * r99556;
return r99557;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99558 = phi2;
double r99559 = 0.5;
double r99560 = r99558 * r99559;
double r99561 = cos(r99560);
double r99562 = phi1;
double r99563 = r99562 * r99559;
double r99564 = cos(r99563);
double r99565 = r99561 * r99564;
double r99566 = sin(r99560);
double r99567 = sin(r99563);
double r99568 = r99566 * r99567;
double r99569 = 3.0;
double r99570 = pow(r99568, r99569);
double r99571 = cbrt(r99570);
double r99572 = r99565 - r99571;
double r99573 = lambda1;
double r99574 = lambda2;
double r99575 = r99573 - r99574;
double r99576 = r99572 * r99575;
double r99577 = r99562 - r99558;
double r99578 = hypot(r99576, r99577);
double r99579 = R;
double r99580 = r99578 * r99579;
return r99580;
}



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.7
Taylor expanded around inf 3.7
Simplified3.7
rmApplied distribute-lft-in3.7
Applied cos-sum0.1
Simplified0.1
Simplified0.1
rmApplied add-cbrt-cube0.1
Applied add-cbrt-cube0.1
Applied cbrt-unprod0.1
Simplified0.1
Final simplification0.1
herbie shell --seed 2020001 +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))))))