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 5.466521274699001643849483913378653845116 \cdot 10^{306}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \sqrt[3]{{\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)}^{3}}\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 r69974 = R;
double r69975 = lambda1;
double r69976 = lambda2;
double r69977 = r69975 - r69976;
double r69978 = phi1;
double r69979 = phi2;
double r69980 = r69978 + r69979;
double r69981 = 2.0;
double r69982 = r69980 / r69981;
double r69983 = cos(r69982);
double r69984 = r69977 * r69983;
double r69985 = r69984 * r69984;
double r69986 = r69978 - r69979;
double r69987 = r69986 * r69986;
double r69988 = r69985 + r69987;
double r69989 = sqrt(r69988);
double r69990 = r69974 * r69989;
return r69990;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r69991 = lambda1;
double r69992 = lambda2;
double r69993 = r69991 - r69992;
double r69994 = phi1;
double r69995 = phi2;
double r69996 = r69994 + r69995;
double r69997 = 2.0;
double r69998 = r69996 / r69997;
double r69999 = cos(r69998);
double r70000 = r69993 * r69999;
double r70001 = r70000 * r70000;
double r70002 = r69994 - r69995;
double r70003 = r70002 * r70002;
double r70004 = r70001 + r70003;
double r70005 = 5.4665212746990016e+306;
bool r70006 = r70004 <= r70005;
double r70007 = R;
double r70008 = 3.0;
double r70009 = pow(r69999, r70008);
double r70010 = cbrt(r70009);
double r70011 = r69993 * r70010;
double r70012 = r70011 * r70000;
double r70013 = r70012 + r70003;
double r70014 = sqrt(r70013);
double r70015 = r70007 * r70014;
double r70016 = r69995 - r69994;
double r70017 = r70007 * r70016;
double r70018 = r70006 ? r70015 : r70017;
return r70018;
}



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))) < 5.4665212746990016e+306Initial program 1.9
rmApplied add-cbrt-cube1.9
Simplified1.9
if 5.4665212746990016e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.8
Taylor expanded around 0 46.9
Final simplification29.3
herbie shell --seed 2019297
(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))))))