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 4.321129580240060876714015364199417813533 \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(\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 r732763 = R;
double r732764 = lambda1;
double r732765 = lambda2;
double r732766 = r732764 - r732765;
double r732767 = phi1;
double r732768 = phi2;
double r732769 = r732767 + r732768;
double r732770 = 2.0;
double r732771 = r732769 / r732770;
double r732772 = cos(r732771);
double r732773 = r732766 * r732772;
double r732774 = r732773 * r732773;
double r732775 = r732767 - r732768;
double r732776 = r732775 * r732775;
double r732777 = r732774 + r732776;
double r732778 = sqrt(r732777);
double r732779 = r732763 * r732778;
return r732779;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r732780 = lambda1;
double r732781 = lambda2;
double r732782 = r732780 - r732781;
double r732783 = phi1;
double r732784 = phi2;
double r732785 = r732783 + r732784;
double r732786 = 2.0;
double r732787 = r732785 / r732786;
double r732788 = cos(r732787);
double r732789 = r732782 * r732788;
double r732790 = r732789 * r732789;
double r732791 = r732783 - r732784;
double r732792 = r732791 * r732791;
double r732793 = r732790 + r732792;
double r732794 = 4.321129580240061e+306;
bool r732795 = r732793 <= r732794;
double r732796 = R;
double r732797 = sqrt(r732793);
double r732798 = r732796 * r732797;
double r732799 = r732784 - r732783;
double r732800 = r732796 * r732799;
double r732801 = r732795 ? r732798 : r732800;
return r732801;
}



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))) < 4.321129580240061e+306Initial program 1.8
if 4.321129580240061e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.6
Taylor expanded around 0 47.1
Final simplification29.2
herbie shell --seed 2019353
(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))))))