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}\;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)} = -\infty \lor \neg \left(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)} \le 2.32264008745379216351385575890993297677 \cdot 10^{306}\right):\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;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)}\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r105895 = R;
double r105896 = lambda1;
double r105897 = lambda2;
double r105898 = r105896 - r105897;
double r105899 = phi1;
double r105900 = phi2;
double r105901 = r105899 + r105900;
double r105902 = 2.0;
double r105903 = r105901 / r105902;
double r105904 = cos(r105903);
double r105905 = r105898 * r105904;
double r105906 = r105905 * r105905;
double r105907 = r105899 - r105900;
double r105908 = r105907 * r105907;
double r105909 = r105906 + r105908;
double r105910 = sqrt(r105909);
double r105911 = r105895 * r105910;
return r105911;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r105912 = R;
double r105913 = lambda1;
double r105914 = lambda2;
double r105915 = r105913 - r105914;
double r105916 = phi1;
double r105917 = phi2;
double r105918 = r105916 + r105917;
double r105919 = 2.0;
double r105920 = r105918 / r105919;
double r105921 = cos(r105920);
double r105922 = r105915 * r105921;
double r105923 = r105922 * r105922;
double r105924 = r105916 - r105917;
double r105925 = r105924 * r105924;
double r105926 = r105923 + r105925;
double r105927 = sqrt(r105926);
double r105928 = r105912 * r105927;
double r105929 = -inf.0;
bool r105930 = r105928 <= r105929;
double r105931 = 2.3226400874537922e+306;
bool r105932 = r105928 <= r105931;
double r105933 = !r105932;
bool r105934 = r105930 || r105933;
double r105935 = r105917 - r105916;
double r105936 = r105912 * r105935;
double r105937 = r105934 ? r105936 : r105928;
return r105937;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < -inf.0 or 2.3226400874537922e+306 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 63.9
Taylor expanded around 0 47.0
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 2.3226400874537922e+306Initial program 1.9
Final simplification29.2
herbie shell --seed 2019322
(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))))))