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(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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) \le 1.500446508517773028601267098300540477473 \cdot 10^{306}:\\
\;\;\;\;R \cdot \sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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)}\\
\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 r120806 = R;
double r120807 = lambda1;
double r120808 = lambda2;
double r120809 = r120807 - r120808;
double r120810 = phi1;
double r120811 = phi2;
double r120812 = r120810 + r120811;
double r120813 = 2.0;
double r120814 = r120812 / r120813;
double r120815 = cos(r120814);
double r120816 = r120809 * r120815;
double r120817 = r120816 * r120816;
double r120818 = r120810 - r120811;
double r120819 = r120818 * r120818;
double r120820 = r120817 + r120819;
double r120821 = sqrt(r120820);
double r120822 = r120806 * r120821;
return r120822;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r120823 = phi1;
double r120824 = phi2;
double r120825 = r120823 - r120824;
double r120826 = r120825 * r120825;
double r120827 = lambda1;
double r120828 = lambda2;
double r120829 = r120827 - r120828;
double r120830 = r120823 + r120824;
double r120831 = 2.0;
double r120832 = r120830 / r120831;
double r120833 = cos(r120832);
double r120834 = r120829 * r120833;
double r120835 = r120834 * r120834;
double r120836 = r120826 + r120835;
double r120837 = 1.500446508517773e+306;
bool r120838 = r120836 <= r120837;
double r120839 = R;
double r120840 = sqrt(r120836);
double r120841 = r120839 * r120840;
double r120842 = r120824 - r120823;
double r120843 = r120839 * r120842;
double r120844 = r120838 ? r120841 : r120843;
return r120844;
}



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.500446508517773e+306Initial program 1.9
if 1.500446508517773e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.7
Taylor expanded around 0 47.0
Final simplification29.2
herbie shell --seed 2019194
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))