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 2.2870988957810845 \cdot 10^{298}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{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 r37549 = R;
double r37550 = lambda1;
double r37551 = lambda2;
double r37552 = r37550 - r37551;
double r37553 = phi1;
double r37554 = phi2;
double r37555 = r37553 + r37554;
double r37556 = 2.0;
double r37557 = r37555 / r37556;
double r37558 = cos(r37557);
double r37559 = r37552 * r37558;
double r37560 = r37559 * r37559;
double r37561 = r37553 - r37554;
double r37562 = r37561 * r37561;
double r37563 = r37560 + r37562;
double r37564 = sqrt(r37563);
double r37565 = r37549 * r37564;
return r37565;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r37566 = lambda1;
double r37567 = lambda2;
double r37568 = r37566 - r37567;
double r37569 = phi1;
double r37570 = phi2;
double r37571 = r37569 + r37570;
double r37572 = 2.0;
double r37573 = r37571 / r37572;
double r37574 = cos(r37573);
double r37575 = r37568 * r37574;
double r37576 = r37575 * r37575;
double r37577 = r37569 - r37570;
double r37578 = r37577 * r37577;
double r37579 = r37576 + r37578;
double r37580 = 2.2870988957810845e+298;
bool r37581 = r37579 <= r37580;
double r37582 = R;
double r37583 = r37568 * r37568;
double r37584 = r37574 * r37574;
double r37585 = r37583 * r37584;
double r37586 = r37585 + r37578;
double r37587 = sqrt(r37586);
double r37588 = r37582 * r37587;
double r37589 = r37570 - r37569;
double r37590 = r37582 * r37589;
double r37591 = r37581 ? r37588 : r37590;
return r37591;
}



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))) < 2.2870988957810845e+298Initial program 2.0
rmApplied swap-sqr2.0
if 2.2870988957810845e+298 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 62.7
Taylor expanded around 0 47.6
Final simplification29.4
herbie shell --seed 2020045
(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))))))