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.46094685773737205 \cdot 10^{262}\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 r108841 = R;
double r108842 = lambda1;
double r108843 = lambda2;
double r108844 = r108842 - r108843;
double r108845 = phi1;
double r108846 = phi2;
double r108847 = r108845 + r108846;
double r108848 = 2.0;
double r108849 = r108847 / r108848;
double r108850 = cos(r108849);
double r108851 = r108844 * r108850;
double r108852 = r108851 * r108851;
double r108853 = r108845 - r108846;
double r108854 = r108853 * r108853;
double r108855 = r108852 + r108854;
double r108856 = sqrt(r108855);
double r108857 = r108841 * r108856;
return r108857;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r108858 = R;
double r108859 = lambda1;
double r108860 = lambda2;
double r108861 = r108859 - r108860;
double r108862 = phi1;
double r108863 = phi2;
double r108864 = r108862 + r108863;
double r108865 = 2.0;
double r108866 = r108864 / r108865;
double r108867 = cos(r108866);
double r108868 = r108861 * r108867;
double r108869 = r108868 * r108868;
double r108870 = r108862 - r108863;
double r108871 = r108870 * r108870;
double r108872 = r108869 + r108871;
double r108873 = sqrt(r108872);
double r108874 = r108858 * r108873;
double r108875 = -inf.0;
bool r108876 = r108874 <= r108875;
double r108877 = 2.460946857737372e+262;
bool r108878 = r108874 <= r108877;
double r108879 = !r108878;
bool r108880 = r108876 || r108879;
double r108881 = r108863 - r108862;
double r108882 = r108858 * r108881;
double r108883 = r108880 ? r108882 : r108874;
return r108883;
}



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.460946857737372e+262 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 62.5
Taylor expanded around 0 46.5
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 2.460946857737372e+262Initial program 1.9
Final simplification29.4
herbie shell --seed 2020046
(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))))))