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 9.965865341093246413832474961728324947405 \cdot 10^{302}:\\
\;\;\;\;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 r366903 = R;
double r366904 = lambda1;
double r366905 = lambda2;
double r366906 = r366904 - r366905;
double r366907 = phi1;
double r366908 = phi2;
double r366909 = r366907 + r366908;
double r366910 = 2.0;
double r366911 = r366909 / r366910;
double r366912 = cos(r366911);
double r366913 = r366906 * r366912;
double r366914 = r366913 * r366913;
double r366915 = r366907 - r366908;
double r366916 = r366915 * r366915;
double r366917 = r366914 + r366916;
double r366918 = sqrt(r366917);
double r366919 = r366903 * r366918;
return r366919;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r366920 = lambda1;
double r366921 = lambda2;
double r366922 = r366920 - r366921;
double r366923 = phi1;
double r366924 = phi2;
double r366925 = r366923 + r366924;
double r366926 = 2.0;
double r366927 = r366925 / r366926;
double r366928 = cos(r366927);
double r366929 = r366922 * r366928;
double r366930 = r366929 * r366929;
double r366931 = r366923 - r366924;
double r366932 = r366931 * r366931;
double r366933 = r366930 + r366932;
double r366934 = 9.965865341093246e+302;
bool r366935 = r366933 <= r366934;
double r366936 = R;
double r366937 = sqrt(r366933);
double r366938 = r366936 * r366937;
double r366939 = r366924 - r366923;
double r366940 = r366936 * r366939;
double r366941 = r366935 ? r366938 : r366940;
return r366941;
}



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))) < 9.965865341093246e+302Initial program 1.4
if 9.965865341093246e+302 < (+ (* (* (- 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.0
Final simplification29.8
herbie shell --seed 2019305
(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))))))