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.94628321762693042 \cdot 10^{297}:\\
\;\;\;\;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 \left(\left(\sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)} \cdot \sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\right) \cdot \sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\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 r77486 = R;
double r77487 = lambda1;
double r77488 = lambda2;
double r77489 = r77487 - r77488;
double r77490 = phi1;
double r77491 = phi2;
double r77492 = r77490 + r77491;
double r77493 = 2.0;
double r77494 = r77492 / r77493;
double r77495 = cos(r77494);
double r77496 = r77489 * r77495;
double r77497 = r77496 * r77496;
double r77498 = r77490 - r77491;
double r77499 = r77498 * r77498;
double r77500 = r77497 + r77499;
double r77501 = sqrt(r77500);
double r77502 = r77486 * r77501;
return r77502;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r77503 = lambda1;
double r77504 = lambda2;
double r77505 = r77503 - r77504;
double r77506 = phi1;
double r77507 = phi2;
double r77508 = r77506 + r77507;
double r77509 = 2.0;
double r77510 = r77508 / r77509;
double r77511 = cos(r77510);
double r77512 = r77505 * r77511;
double r77513 = r77512 * r77512;
double r77514 = r77506 - r77507;
double r77515 = r77514 * r77514;
double r77516 = r77513 + r77515;
double r77517 = 2.9462832176269304e+297;
bool r77518 = r77516 <= r77517;
double r77519 = R;
double r77520 = cbrt(r77511);
double r77521 = r77520 * r77520;
double r77522 = r77521 * r77520;
double r77523 = r77505 * r77522;
double r77524 = r77512 * r77523;
double r77525 = r77524 + r77515;
double r77526 = sqrt(r77525);
double r77527 = r77519 * r77526;
double r77528 = r77507 - r77506;
double r77529 = r77519 * r77528;
double r77530 = r77518 ? r77527 : r77529;
return r77530;
}



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.9462832176269304e+297Initial program 1.8
rmApplied add-cube-cbrt1.9
if 2.9462832176269304e+297 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 62.3
Taylor expanded around 0 46.9
Final simplification29.5
herbie shell --seed 2020024
(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))))))