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 3.699690755050847180665521236686852888781 \cdot 10^{295}\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 r92060 = R;
double r92061 = lambda1;
double r92062 = lambda2;
double r92063 = r92061 - r92062;
double r92064 = phi1;
double r92065 = phi2;
double r92066 = r92064 + r92065;
double r92067 = 2.0;
double r92068 = r92066 / r92067;
double r92069 = cos(r92068);
double r92070 = r92063 * r92069;
double r92071 = r92070 * r92070;
double r92072 = r92064 - r92065;
double r92073 = r92072 * r92072;
double r92074 = r92071 + r92073;
double r92075 = sqrt(r92074);
double r92076 = r92060 * r92075;
return r92076;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r92077 = R;
double r92078 = lambda1;
double r92079 = lambda2;
double r92080 = r92078 - r92079;
double r92081 = phi1;
double r92082 = phi2;
double r92083 = r92081 + r92082;
double r92084 = 2.0;
double r92085 = r92083 / r92084;
double r92086 = cos(r92085);
double r92087 = r92080 * r92086;
double r92088 = r92087 * r92087;
double r92089 = r92081 - r92082;
double r92090 = r92089 * r92089;
double r92091 = r92088 + r92090;
double r92092 = sqrt(r92091);
double r92093 = r92077 * r92092;
double r92094 = -inf.0;
bool r92095 = r92093 <= r92094;
double r92096 = 3.699690755050847e+295;
bool r92097 = r92093 <= r92096;
double r92098 = !r92097;
bool r92099 = r92095 || r92098;
double r92100 = r92082 - r92081;
double r92101 = r92077 * r92100;
double r92102 = r92099 ? r92101 : r92093;
return r92102;
}



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 3.699690755050847e+295 < (* R (sqrt (+ (* (* (- 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 47.2
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 3.699690755050847e+295Initial program 2.0
Final simplification29.4
herbie shell --seed 2019347
(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))))))