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}\;\phi_1 \le -2.50401835654202499 \cdot 10^{59} \lor \neg \left(\phi_1 \le 6.95681086624963382 \cdot 10^{104}\right):\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{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 r82445 = R;
double r82446 = lambda1;
double r82447 = lambda2;
double r82448 = r82446 - r82447;
double r82449 = phi1;
double r82450 = phi2;
double r82451 = r82449 + r82450;
double r82452 = 2.0;
double r82453 = r82451 / r82452;
double r82454 = cos(r82453);
double r82455 = r82448 * r82454;
double r82456 = r82455 * r82455;
double r82457 = r82449 - r82450;
double r82458 = r82457 * r82457;
double r82459 = r82456 + r82458;
double r82460 = sqrt(r82459);
double r82461 = r82445 * r82460;
return r82461;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82462 = phi1;
double r82463 = -2.504018356542025e+59;
bool r82464 = r82462 <= r82463;
double r82465 = 6.956810866249634e+104;
bool r82466 = r82462 <= r82465;
double r82467 = !r82466;
bool r82468 = r82464 || r82467;
double r82469 = R;
double r82470 = phi2;
double r82471 = r82470 - r82462;
double r82472 = r82469 * r82471;
double r82473 = lambda1;
double r82474 = lambda2;
double r82475 = r82473 - r82474;
double r82476 = r82475 * r82475;
double r82477 = r82462 + r82470;
double r82478 = 2.0;
double r82479 = r82477 / r82478;
double r82480 = cos(r82479);
double r82481 = r82480 * r82480;
double r82482 = r82476 * r82481;
double r82483 = r82462 - r82470;
double r82484 = r82483 * r82483;
double r82485 = r82482 + r82484;
double r82486 = sqrt(r82485);
double r82487 = r82469 * r82486;
double r82488 = r82468 ? r82472 : r82487;
return r82488;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if phi1 < -2.504018356542025e+59 or 6.956810866249634e+104 < phi1 Initial program 53.7
Taylor expanded around 0 38.9
if -2.504018356542025e+59 < phi1 < 6.956810866249634e+104Initial program 31.7
rmApplied swap-sqr31.7
Final simplification34.1
herbie shell --seed 2020047
(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))))))