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 1.0126203179114608 \cdot 10^{307}\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 r97429 = R;
double r97430 = lambda1;
double r97431 = lambda2;
double r97432 = r97430 - r97431;
double r97433 = phi1;
double r97434 = phi2;
double r97435 = r97433 + r97434;
double r97436 = 2.0;
double r97437 = r97435 / r97436;
double r97438 = cos(r97437);
double r97439 = r97432 * r97438;
double r97440 = r97439 * r97439;
double r97441 = r97433 - r97434;
double r97442 = r97441 * r97441;
double r97443 = r97440 + r97442;
double r97444 = sqrt(r97443);
double r97445 = r97429 * r97444;
return r97445;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r97446 = R;
double r97447 = lambda1;
double r97448 = lambda2;
double r97449 = r97447 - r97448;
double r97450 = phi1;
double r97451 = phi2;
double r97452 = r97450 + r97451;
double r97453 = 2.0;
double r97454 = r97452 / r97453;
double r97455 = cos(r97454);
double r97456 = r97449 * r97455;
double r97457 = r97456 * r97456;
double r97458 = r97450 - r97451;
double r97459 = r97458 * r97458;
double r97460 = r97457 + r97459;
double r97461 = sqrt(r97460);
double r97462 = r97446 * r97461;
double r97463 = -inf.0;
bool r97464 = r97462 <= r97463;
double r97465 = 1.0126203179114608e+307;
bool r97466 = r97462 <= r97465;
double r97467 = !r97466;
bool r97468 = r97464 || r97467;
double r97469 = r97451 - r97450;
double r97470 = r97446 * r97469;
double r97471 = r97468 ? r97470 : r97462;
return r97471;
}



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 1.0126203179114608e+307 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 64.0
Taylor expanded around 0 47.0
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 1.0126203179114608e+307Initial program 1.9
Final simplification28.8
herbie shell --seed 2020033
(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))))))