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 5.348243880039037302698940885134563058425 \cdot 10^{301}:\\
\;\;\;\;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)}\\
\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 r77584 = R;
double r77585 = lambda1;
double r77586 = lambda2;
double r77587 = r77585 - r77586;
double r77588 = phi1;
double r77589 = phi2;
double r77590 = r77588 + r77589;
double r77591 = 2.0;
double r77592 = r77590 / r77591;
double r77593 = cos(r77592);
double r77594 = r77587 * r77593;
double r77595 = r77594 * r77594;
double r77596 = r77588 - r77589;
double r77597 = r77596 * r77596;
double r77598 = r77595 + r77597;
double r77599 = sqrt(r77598);
double r77600 = r77584 * r77599;
return r77600;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r77601 = lambda1;
double r77602 = lambda2;
double r77603 = r77601 - r77602;
double r77604 = phi1;
double r77605 = phi2;
double r77606 = r77604 + r77605;
double r77607 = 2.0;
double r77608 = r77606 / r77607;
double r77609 = cos(r77608);
double r77610 = r77603 * r77609;
double r77611 = r77610 * r77610;
double r77612 = r77604 - r77605;
double r77613 = r77612 * r77612;
double r77614 = r77611 + r77613;
double r77615 = 5.348243880039037e+301;
bool r77616 = r77614 <= r77615;
double r77617 = R;
double r77618 = sqrt(r77614);
double r77619 = r77617 * r77618;
double r77620 = r77605 - r77604;
double r77621 = r77617 * r77620;
double r77622 = r77616 ? r77619 : r77621;
return r77622;
}



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))) < 5.348243880039037e+301Initial program 1.8
if 5.348243880039037e+301 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.1
Taylor expanded around 0 47.1
Final simplification29.3
herbie shell --seed 2019306
(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))))))