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}\;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)} = -\infty \lor \neg \left(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)} \le 2.6174821950400801 \cdot 10^{286}\right):\\
\;\;\;\;R \cdot \phi_2 + R \cdot \left(-\phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;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)}\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r86976 = R;
double r86977 = lambda1;
double r86978 = lambda2;
double r86979 = r86977 - r86978;
double r86980 = phi1;
double r86981 = phi2;
double r86982 = r86980 + r86981;
double r86983 = 2.0;
double r86984 = r86982 / r86983;
double r86985 = cos(r86984);
double r86986 = r86979 * r86985;
double r86987 = r86986 * r86986;
double r86988 = r86980 - r86981;
double r86989 = r86988 * r86988;
double r86990 = r86987 + r86989;
double r86991 = sqrt(r86990);
double r86992 = r86976 * r86991;
return r86992;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r86993 = R;
double r86994 = lambda1;
double r86995 = lambda2;
double r86996 = r86994 - r86995;
double r86997 = phi1;
double r86998 = phi2;
double r86999 = r86997 + r86998;
double r87000 = 2.0;
double r87001 = r86999 / r87000;
double r87002 = cos(r87001);
double r87003 = r86996 * r87002;
double r87004 = r87003 * r87003;
double r87005 = r86997 - r86998;
double r87006 = r87005 * r87005;
double r87007 = r87004 + r87006;
double r87008 = sqrt(r87007);
double r87009 = r86993 * r87008;
double r87010 = -inf.0;
bool r87011 = r87009 <= r87010;
double r87012 = 2.61748219504008e+286;
bool r87013 = r87009 <= r87012;
double r87014 = !r87013;
bool r87015 = r87011 || r87014;
double r87016 = r86993 * r86998;
double r87017 = -r86997;
double r87018 = r86993 * r87017;
double r87019 = r87016 + r87018;
double r87020 = r87015 ? r87019 : r87009;
return r87020;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < -inf.0 or 2.61748219504008e+286 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 63.4
Taylor expanded around 0 46.7
rmApplied sub-neg46.7
Applied distribute-lft-in46.7
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 2.61748219504008e+286Initial program 1.8
Final simplification28.2
herbie shell --seed 2020056
(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))))))