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.46157184292388996 \cdot 10^{307}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\left(\sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)} \cdot \sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\right) \cdot \sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\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 r93874 = R;
double r93875 = lambda1;
double r93876 = lambda2;
double r93877 = r93875 - r93876;
double r93878 = phi1;
double r93879 = phi2;
double r93880 = r93878 + r93879;
double r93881 = 2.0;
double r93882 = r93880 / r93881;
double r93883 = cos(r93882);
double r93884 = r93877 * r93883;
double r93885 = r93884 * r93884;
double r93886 = r93878 - r93879;
double r93887 = r93886 * r93886;
double r93888 = r93885 + r93887;
double r93889 = sqrt(r93888);
double r93890 = r93874 * r93889;
return r93890;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r93891 = lambda1;
double r93892 = lambda2;
double r93893 = r93891 - r93892;
double r93894 = phi1;
double r93895 = phi2;
double r93896 = r93894 + r93895;
double r93897 = 2.0;
double r93898 = r93896 / r93897;
double r93899 = cos(r93898);
double r93900 = r93893 * r93899;
double r93901 = r93900 * r93900;
double r93902 = r93894 - r93895;
double r93903 = r93902 * r93902;
double r93904 = r93901 + r93903;
double r93905 = 1.46157184292389e+307;
bool r93906 = r93904 <= r93905;
double r93907 = R;
double r93908 = cbrt(r93899);
double r93909 = r93908 * r93908;
double r93910 = r93909 * r93908;
double r93911 = r93893 * r93910;
double r93912 = r93911 * r93900;
double r93913 = r93912 + r93903;
double r93914 = sqrt(r93913);
double r93915 = r93907 * r93914;
double r93916 = r93895 - r93894;
double r93917 = r93907 * r93916;
double r93918 = r93906 ? r93915 : r93917;
return r93918;
}



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.46157184292389e+307Initial program 1.8
rmApplied add-cube-cbrt1.8
if 1.46157184292389e+307 < (+ (* (* (- 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 46.4
Final simplification28.8
herbie shell --seed 2020027
(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))))))