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 5.61089502609331893171645532303445928427 \cdot 10^{283}\right):\\
\;\;\;\;R \cdot \left(\phi_2 - \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 r64798 = R;
double r64799 = lambda1;
double r64800 = lambda2;
double r64801 = r64799 - r64800;
double r64802 = phi1;
double r64803 = phi2;
double r64804 = r64802 + r64803;
double r64805 = 2.0;
double r64806 = r64804 / r64805;
double r64807 = cos(r64806);
double r64808 = r64801 * r64807;
double r64809 = r64808 * r64808;
double r64810 = r64802 - r64803;
double r64811 = r64810 * r64810;
double r64812 = r64809 + r64811;
double r64813 = sqrt(r64812);
double r64814 = r64798 * r64813;
return r64814;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r64815 = R;
double r64816 = lambda1;
double r64817 = lambda2;
double r64818 = r64816 - r64817;
double r64819 = phi1;
double r64820 = phi2;
double r64821 = r64819 + r64820;
double r64822 = 2.0;
double r64823 = r64821 / r64822;
double r64824 = cos(r64823);
double r64825 = r64818 * r64824;
double r64826 = r64825 * r64825;
double r64827 = r64819 - r64820;
double r64828 = r64827 * r64827;
double r64829 = r64826 + r64828;
double r64830 = sqrt(r64829);
double r64831 = r64815 * r64830;
double r64832 = -inf.0;
bool r64833 = r64831 <= r64832;
double r64834 = 5.610895026093319e+283;
bool r64835 = r64831 <= r64834;
double r64836 = !r64835;
bool r64837 = r64833 || r64836;
double r64838 = r64820 - r64819;
double r64839 = r64815 * r64838;
double r64840 = r64837 ? r64839 : r64831;
return r64840;
}



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 5.610895026093319e+283 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 63.2
Taylor expanded around 0 46.9
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 5.610895026093319e+283Initial program 1.9
Final simplification29.3
herbie shell --seed 2019291
(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))))))