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 4.9917044087838145 \cdot 10^{273}\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 r120103 = R;
double r120104 = lambda1;
double r120105 = lambda2;
double r120106 = r120104 - r120105;
double r120107 = phi1;
double r120108 = phi2;
double r120109 = r120107 + r120108;
double r120110 = 2.0;
double r120111 = r120109 / r120110;
double r120112 = cos(r120111);
double r120113 = r120106 * r120112;
double r120114 = r120113 * r120113;
double r120115 = r120107 - r120108;
double r120116 = r120115 * r120115;
double r120117 = r120114 + r120116;
double r120118 = sqrt(r120117);
double r120119 = r120103 * r120118;
return r120119;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r120120 = R;
double r120121 = lambda1;
double r120122 = lambda2;
double r120123 = r120121 - r120122;
double r120124 = phi1;
double r120125 = phi2;
double r120126 = r120124 + r120125;
double r120127 = 2.0;
double r120128 = r120126 / r120127;
double r120129 = cos(r120128);
double r120130 = r120123 * r120129;
double r120131 = r120130 * r120130;
double r120132 = r120124 - r120125;
double r120133 = r120132 * r120132;
double r120134 = r120131 + r120133;
double r120135 = sqrt(r120134);
double r120136 = r120120 * r120135;
double r120137 = -inf.0;
bool r120138 = r120136 <= r120137;
double r120139 = 4.9917044087838145e+273;
bool r120140 = r120136 <= r120139;
double r120141 = !r120140;
bool r120142 = r120138 || r120141;
double r120143 = r120125 - r120124;
double r120144 = r120120 * r120143;
double r120145 = r120142 ? r120144 : r120136;
return r120145;
}



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 4.9917044087838145e+273 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 62.8
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))))) < 4.9917044087838145e+273Initial program 2.0
Final simplification29.2
herbie shell --seed 2020036
(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))))))