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.781261941740702 \cdot 10^{307}:\\
\;\;\;\;R \cdot \sqrt{\left(\lambda_1 - \lambda_2\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\left(\lambda_1 - \lambda_2\right) \cdot \log \left(e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\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 r135384 = R;
double r135385 = lambda1;
double r135386 = lambda2;
double r135387 = r135385 - r135386;
double r135388 = phi1;
double r135389 = phi2;
double r135390 = r135388 + r135389;
double r135391 = 2.0;
double r135392 = r135390 / r135391;
double r135393 = cos(r135392);
double r135394 = r135387 * r135393;
double r135395 = r135394 * r135394;
double r135396 = r135388 - r135389;
double r135397 = r135396 * r135396;
double r135398 = r135395 + r135397;
double r135399 = sqrt(r135398);
double r135400 = r135384 * r135399;
return r135400;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r135401 = lambda1;
double r135402 = lambda2;
double r135403 = r135401 - r135402;
double r135404 = phi1;
double r135405 = phi2;
double r135406 = r135404 + r135405;
double r135407 = 2.0;
double r135408 = r135406 / r135407;
double r135409 = cos(r135408);
double r135410 = r135403 * r135409;
double r135411 = r135410 * r135410;
double r135412 = r135404 - r135405;
double r135413 = r135412 * r135412;
double r135414 = r135411 + r135413;
double r135415 = 2.781261941740702e+307;
bool r135416 = r135414 <= r135415;
double r135417 = R;
double r135418 = exp(r135409);
double r135419 = log(r135418);
double r135420 = r135403 * r135419;
double r135421 = r135409 * r135420;
double r135422 = r135403 * r135421;
double r135423 = r135422 + r135413;
double r135424 = sqrt(r135423);
double r135425 = r135417 * r135424;
double r135426 = r135405 - r135404;
double r135427 = r135417 * r135426;
double r135428 = r135416 ? r135425 : r135427;
return r135428;
}



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.781261941740702e+307Initial program 2.0
rmApplied associate-*l*2.0
rmApplied add-log-exp2.0
if 2.781261941740702e+307 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.8
Taylor expanded around 0 47.0
Final simplification29.0
herbie shell --seed 2020064
(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))))))