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)}\begin{array}{l}
\mathbf{if}\;\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) \le 1.823118213755077 \cdot 10^{306}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\cos \left(0.5 \cdot \left(\phi_2 + \phi_1\right)\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\\
\mathbf{else}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68534 = R;
double r68535 = lambda1;
double r68536 = lambda2;
double r68537 = r68535 - r68536;
double r68538 = phi1;
double r68539 = phi2;
double r68540 = r68538 + r68539;
double r68541 = 2.0;
double r68542 = r68540 / r68541;
double r68543 = cos(r68542);
double r68544 = r68537 * r68543;
double r68545 = r68544 * r68544;
double r68546 = r68538 - r68539;
double r68547 = r68546 * r68546;
double r68548 = r68545 + r68547;
double r68549 = sqrt(r68548);
double r68550 = r68534 * r68549;
return r68550;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68551 = lambda1;
double r68552 = lambda2;
double r68553 = r68551 - r68552;
double r68554 = phi1;
double r68555 = phi2;
double r68556 = r68554 + r68555;
double r68557 = 2.0;
double r68558 = r68556 / r68557;
double r68559 = cos(r68558);
double r68560 = r68553 * r68559;
double r68561 = r68560 * r68560;
double r68562 = r68554 - r68555;
double r68563 = r68562 * r68562;
double r68564 = r68561 + r68563;
double r68565 = 1.8231182137550767e+306;
bool r68566 = r68564 <= r68565;
double r68567 = R;
double r68568 = 0.5;
double r68569 = r68555 + r68554;
double r68570 = r68568 * r68569;
double r68571 = cos(r68570);
double r68572 = r68571 * r68553;
double r68573 = r68560 * r68572;
double r68574 = r68573 + r68563;
double r68575 = sqrt(r68574);
double r68576 = r68567 * r68575;
double r68577 = r68555 - r68554;
double r68578 = r68567 * r68577;
double r68579 = r68566 ? r68576 : r68578;
return r68579;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) < 1.8231182137550767e+306Initial program 1.9
Taylor expanded around inf 1.9
Simplified1.9
if 1.8231182137550767e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.8
Taylor expanded around 0 47.2
Final simplification29.2
herbie shell --seed 2020018
(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))))))