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}\;\phi_2 \le 7.088685391289955 \cdot 10^{+65}:\\
\;\;\;\;R \cdot \sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2 + \phi_1}{2}\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;\left(\phi_2 - \phi_1\right) \cdot R\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r15852928 = R;
double r15852929 = lambda1;
double r15852930 = lambda2;
double r15852931 = r15852929 - r15852930;
double r15852932 = phi1;
double r15852933 = phi2;
double r15852934 = r15852932 + r15852933;
double r15852935 = 2.0;
double r15852936 = r15852934 / r15852935;
double r15852937 = cos(r15852936);
double r15852938 = r15852931 * r15852937;
double r15852939 = r15852938 * r15852938;
double r15852940 = r15852932 - r15852933;
double r15852941 = r15852940 * r15852940;
double r15852942 = r15852939 + r15852941;
double r15852943 = sqrt(r15852942);
double r15852944 = r15852928 * r15852943;
return r15852944;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r15852945 = phi2;
double r15852946 = 7.088685391289955e+65;
bool r15852947 = r15852945 <= r15852946;
double r15852948 = R;
double r15852949 = phi1;
double r15852950 = r15852949 - r15852945;
double r15852951 = r15852950 * r15852950;
double r15852952 = lambda1;
double r15852953 = lambda2;
double r15852954 = r15852952 - r15852953;
double r15852955 = r15852954 * r15852954;
double r15852956 = r15852945 + r15852949;
double r15852957 = 2.0;
double r15852958 = r15852956 / r15852957;
double r15852959 = cos(r15852958);
double r15852960 = r15852959 * r15852959;
double r15852961 = r15852955 * r15852960;
double r15852962 = r15852951 + r15852961;
double r15852963 = sqrt(r15852962);
double r15852964 = r15852948 * r15852963;
double r15852965 = r15852945 - r15852949;
double r15852966 = r15852965 * r15852948;
double r15852967 = r15852947 ? r15852964 : r15852966;
return r15852967;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if phi2 < 7.088685391289955e+65Initial program 34.3
rmApplied swap-sqr34.3
if 7.088685391289955e+65 < phi2 Initial program 49.4
Taylor expanded around 0 21.9
Final simplification32.1
herbie shell --seed 2019164
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))