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 7.81813644704752662 \cdot 10^{301}:\\
\;\;\;\;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)}\\
\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 r87016 = R;
double r87017 = lambda1;
double r87018 = lambda2;
double r87019 = r87017 - r87018;
double r87020 = phi1;
double r87021 = phi2;
double r87022 = r87020 + r87021;
double r87023 = 2.0;
double r87024 = r87022 / r87023;
double r87025 = cos(r87024);
double r87026 = r87019 * r87025;
double r87027 = r87026 * r87026;
double r87028 = r87020 - r87021;
double r87029 = r87028 * r87028;
double r87030 = r87027 + r87029;
double r87031 = sqrt(r87030);
double r87032 = r87016 * r87031;
return r87032;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r87033 = lambda1;
double r87034 = lambda2;
double r87035 = r87033 - r87034;
double r87036 = phi1;
double r87037 = phi2;
double r87038 = r87036 + r87037;
double r87039 = 2.0;
double r87040 = r87038 / r87039;
double r87041 = cos(r87040);
double r87042 = r87035 * r87041;
double r87043 = r87042 * r87042;
double r87044 = r87036 - r87037;
double r87045 = r87044 * r87044;
double r87046 = r87043 + r87045;
double r87047 = 7.818136447047527e+301;
bool r87048 = r87046 <= r87047;
double r87049 = R;
double r87050 = sqrt(r87046);
double r87051 = r87049 * r87050;
double r87052 = r87037 - r87036;
double r87053 = r87049 * r87052;
double r87054 = r87048 ? r87051 : r87053;
return r87054;
}



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))) < 7.818136447047527e+301Initial program 1.5
if 7.818136447047527e+301 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.1
Taylor expanded around 0 47.1
Final simplification29.1
herbie shell --seed 2020021
(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))))))