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.080381427413534589194695339354407783058 \cdot 10^{303}:\\
\;\;\;\;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 r96861 = R;
double r96862 = lambda1;
double r96863 = lambda2;
double r96864 = r96862 - r96863;
double r96865 = phi1;
double r96866 = phi2;
double r96867 = r96865 + r96866;
double r96868 = 2.0;
double r96869 = r96867 / r96868;
double r96870 = cos(r96869);
double r96871 = r96864 * r96870;
double r96872 = r96871 * r96871;
double r96873 = r96865 - r96866;
double r96874 = r96873 * r96873;
double r96875 = r96872 + r96874;
double r96876 = sqrt(r96875);
double r96877 = r96861 * r96876;
return r96877;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r96878 = lambda1;
double r96879 = lambda2;
double r96880 = r96878 - r96879;
double r96881 = phi1;
double r96882 = phi2;
double r96883 = r96881 + r96882;
double r96884 = 2.0;
double r96885 = r96883 / r96884;
double r96886 = cos(r96885);
double r96887 = r96880 * r96886;
double r96888 = r96887 * r96887;
double r96889 = r96881 - r96882;
double r96890 = r96889 * r96889;
double r96891 = r96888 + r96890;
double r96892 = 1.0803814274135346e+303;
bool r96893 = r96891 <= r96892;
double r96894 = R;
double r96895 = r96880 * r96880;
double r96896 = r96886 * r96886;
double r96897 = r96895 * r96896;
double r96898 = r96897 + r96890;
double r96899 = sqrt(r96898);
double r96900 = r96894 * r96899;
double r96901 = r96882 - r96881;
double r96902 = r96894 * r96901;
double r96903 = r96893 ? r96900 : r96902;
return r96903;
}



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.0803814274135346e+303Initial program 2.1
rmApplied swap-sqr2.1
if 1.0803814274135346e+303 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.3
Taylor expanded around 0 47.2
Final simplification29.5
herbie shell --seed 2019304
(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))))))