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 4.605055345730565045055879951608156666024 \cdot 10^{305}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \frac{\left(\lambda_1 \cdot \lambda_1 - \lambda_2 \cdot \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)}{\lambda_1 + \lambda_2} + \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 r104963 = R;
double r104964 = lambda1;
double r104965 = lambda2;
double r104966 = r104964 - r104965;
double r104967 = phi1;
double r104968 = phi2;
double r104969 = r104967 + r104968;
double r104970 = 2.0;
double r104971 = r104969 / r104970;
double r104972 = cos(r104971);
double r104973 = r104966 * r104972;
double r104974 = r104973 * r104973;
double r104975 = r104967 - r104968;
double r104976 = r104975 * r104975;
double r104977 = r104974 + r104976;
double r104978 = sqrt(r104977);
double r104979 = r104963 * r104978;
return r104979;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r104980 = lambda1;
double r104981 = lambda2;
double r104982 = r104980 - r104981;
double r104983 = phi1;
double r104984 = phi2;
double r104985 = r104983 + r104984;
double r104986 = 2.0;
double r104987 = r104985 / r104986;
double r104988 = cos(r104987);
double r104989 = r104982 * r104988;
double r104990 = r104989 * r104989;
double r104991 = r104983 - r104984;
double r104992 = r104991 * r104991;
double r104993 = r104990 + r104992;
double r104994 = 4.605055345730565e+305;
bool r104995 = r104993 <= r104994;
double r104996 = R;
double r104997 = r104980 * r104980;
double r104998 = r104981 * r104981;
double r104999 = r104997 - r104998;
double r105000 = r104999 * r104988;
double r105001 = r104980 + r104981;
double r105002 = r105000 / r105001;
double r105003 = r104989 * r105002;
double r105004 = r105003 + r104992;
double r105005 = sqrt(r105004);
double r105006 = r104996 * r105005;
double r105007 = r104984 - r104983;
double r105008 = r104996 * r105007;
double r105009 = r104995 ? r105006 : r105008;
return r105009;
}



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))) < 4.605055345730565e+305Initial program 1.8
rmApplied flip--1.8
Applied associate-*l/1.8
if 4.605055345730565e+305 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.5
Taylor expanded around 0 46.4
Final simplification28.6
herbie shell --seed 2019325
(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))))))