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.5051463061973085 \cdot 10^{304}:\\
\;\;\;\;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 r78730 = R;
double r78731 = lambda1;
double r78732 = lambda2;
double r78733 = r78731 - r78732;
double r78734 = phi1;
double r78735 = phi2;
double r78736 = r78734 + r78735;
double r78737 = 2.0;
double r78738 = r78736 / r78737;
double r78739 = cos(r78738);
double r78740 = r78733 * r78739;
double r78741 = r78740 * r78740;
double r78742 = r78734 - r78735;
double r78743 = r78742 * r78742;
double r78744 = r78741 + r78743;
double r78745 = sqrt(r78744);
double r78746 = r78730 * r78745;
return r78746;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r78747 = lambda1;
double r78748 = lambda2;
double r78749 = r78747 - r78748;
double r78750 = phi1;
double r78751 = phi2;
double r78752 = r78750 + r78751;
double r78753 = 2.0;
double r78754 = r78752 / r78753;
double r78755 = cos(r78754);
double r78756 = r78749 * r78755;
double r78757 = r78756 * r78756;
double r78758 = r78750 - r78751;
double r78759 = r78758 * r78758;
double r78760 = r78757 + r78759;
double r78761 = 5.5051463061973085e+304;
bool r78762 = r78760 <= r78761;
double r78763 = R;
double r78764 = sqrt(r78760);
double r78765 = r78763 * r78764;
double r78766 = r78751 - r78750;
double r78767 = r78763 * r78766;
double r78768 = r78762 ? r78765 : r78767;
return r78768;
}



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.5051463061973085e+304Initial program 1.7
if 5.5051463061973085e+304 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.4
Taylor expanded around 0 46.7
Final simplification29.1
herbie shell --seed 2020020
(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))))))