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 2.48523448830210136 \cdot 10^{304}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \frac{\left(\lambda_1 \cdot \lambda_1 - \lambda_2 \cdot \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)}{\lambda_1 + \lambda_2} + \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 r120459 = R;
double r120460 = lambda1;
double r120461 = lambda2;
double r120462 = r120460 - r120461;
double r120463 = phi1;
double r120464 = phi2;
double r120465 = r120463 + r120464;
double r120466 = 2.0;
double r120467 = r120465 / r120466;
double r120468 = cos(r120467);
double r120469 = r120462 * r120468;
double r120470 = r120469 * r120469;
double r120471 = r120463 - r120464;
double r120472 = r120471 * r120471;
double r120473 = r120470 + r120472;
double r120474 = sqrt(r120473);
double r120475 = r120459 * r120474;
return r120475;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r120476 = lambda1;
double r120477 = lambda2;
double r120478 = r120476 - r120477;
double r120479 = phi1;
double r120480 = phi2;
double r120481 = r120479 + r120480;
double r120482 = 2.0;
double r120483 = r120481 / r120482;
double r120484 = cos(r120483);
double r120485 = r120478 * r120484;
double r120486 = r120485 * r120485;
double r120487 = r120479 - r120480;
double r120488 = r120487 * r120487;
double r120489 = r120486 + r120488;
double r120490 = 2.4852344883021014e+304;
bool r120491 = r120489 <= r120490;
double r120492 = R;
double r120493 = r120476 * r120476;
double r120494 = r120477 * r120477;
double r120495 = r120493 - r120494;
double r120496 = r120495 * r120484;
double r120497 = r120476 + r120477;
double r120498 = r120496 / r120497;
double r120499 = r120485 * r120498;
double r120500 = r120499 + r120488;
double r120501 = sqrt(r120500);
double r120502 = r120492 * r120501;
double r120503 = r120480 - r120479;
double r120504 = r120492 * r120503;
double r120505 = r120491 ? r120502 : r120504;
return r120505;
}



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))) < 2.4852344883021014e+304Initial program 2.0
rmApplied flip--2.0
Applied associate-*l/2.0
if 2.4852344883021014e+304 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.4
Taylor expanded around 0 46.9
Final simplification29.2
herbie shell --seed 2020034
(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))))))