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 -7.31940438578337662982486339028864318973 \cdot 10^{46}:\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\log \left(\sqrt{e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}}\right) + \log \left(\sqrt{e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}}\right)\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 r96378 = R;
double r96379 = lambda1;
double r96380 = lambda2;
double r96381 = r96379 - r96380;
double r96382 = phi1;
double r96383 = phi2;
double r96384 = r96382 + r96383;
double r96385 = 2.0;
double r96386 = r96384 / r96385;
double r96387 = cos(r96386);
double r96388 = r96381 * r96387;
double r96389 = r96388 * r96388;
double r96390 = r96382 - r96383;
double r96391 = r96390 * r96390;
double r96392 = r96389 + r96391;
double r96393 = sqrt(r96392);
double r96394 = r96378 * r96393;
return r96394;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r96395 = phi1;
double r96396 = -7.319404385783377e+46;
bool r96397 = r96395 <= r96396;
double r96398 = R;
double r96399 = phi2;
double r96400 = r96399 - r96395;
double r96401 = r96398 * r96400;
double r96402 = lambda1;
double r96403 = lambda2;
double r96404 = r96402 - r96403;
double r96405 = r96395 + r96399;
double r96406 = 2.0;
double r96407 = r96405 / r96406;
double r96408 = cos(r96407);
double r96409 = exp(r96408);
double r96410 = sqrt(r96409);
double r96411 = log(r96410);
double r96412 = r96411 + r96411;
double r96413 = r96404 * r96412;
double r96414 = r96404 * r96408;
double r96415 = r96413 * r96414;
double r96416 = r96395 - r96399;
double r96417 = r96416 * r96416;
double r96418 = r96415 + r96417;
double r96419 = sqrt(r96418);
double r96420 = r96398 * r96419;
double r96421 = r96397 ? r96401 : r96420;
return r96421;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if phi1 < -7.319404385783377e+46Initial program 50.8
Taylor expanded around 0 24.1
if -7.319404385783377e+46 < phi1 Initial program 37.2
rmApplied add-log-exp37.2
rmApplied add-sqr-sqrt37.2
Applied log-prod37.2
Final simplification34.7
herbie shell --seed 2019308
(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))))))