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 1.443474666294679403718523771330180153971 \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 r87824 = R;
double r87825 = lambda1;
double r87826 = lambda2;
double r87827 = r87825 - r87826;
double r87828 = phi1;
double r87829 = phi2;
double r87830 = r87828 + r87829;
double r87831 = 2.0;
double r87832 = r87830 / r87831;
double r87833 = cos(r87832);
double r87834 = r87827 * r87833;
double r87835 = r87834 * r87834;
double r87836 = r87828 - r87829;
double r87837 = r87836 * r87836;
double r87838 = r87835 + r87837;
double r87839 = sqrt(r87838);
double r87840 = r87824 * r87839;
return r87840;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87841 = lambda1;
double r87842 = lambda2;
double r87843 = r87841 - r87842;
double r87844 = phi1;
double r87845 = phi2;
double r87846 = r87844 + r87845;
double r87847 = 2.0;
double r87848 = r87846 / r87847;
double r87849 = cos(r87848);
double r87850 = r87843 * r87849;
double r87851 = r87850 * r87850;
double r87852 = r87844 - r87845;
double r87853 = r87852 * r87852;
double r87854 = r87851 + r87853;
double r87855 = 1.4434746662946794e+306;
bool r87856 = r87854 <= r87855;
double r87857 = R;
double r87858 = sqrt(r87854);
double r87859 = r87857 * r87858;
double r87860 = r87845 - r87844;
double r87861 = r87857 * r87860;
double r87862 = r87856 ? r87859 : r87861;
return r87862;
}



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.4434746662946794e+306Initial program 1.9
if 1.4434746662946794e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.8
Taylor expanded around 0 46.7
Final simplification29.2
herbie shell --seed 2019351
(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))))))