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_2 \le 1.400742996618376 \cdot 10^{-20}:\\
\;\;\;\;\sqrt{\left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \left(\cos \left(\frac{\phi_2 + \phi_1}{2}\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\log \left(e^{\cos \left(\frac{\phi_2 + \phi_1}{2}\right)}\right) \cdot \left(\lambda_1 - \lambda_2\right)\right)} \cdot R\\
\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 r5083528 = R;
double r5083529 = lambda1;
double r5083530 = lambda2;
double r5083531 = r5083529 - r5083530;
double r5083532 = phi1;
double r5083533 = phi2;
double r5083534 = r5083532 + r5083533;
double r5083535 = 2.0;
double r5083536 = r5083534 / r5083535;
double r5083537 = cos(r5083536);
double r5083538 = r5083531 * r5083537;
double r5083539 = r5083538 * r5083538;
double r5083540 = r5083532 - r5083533;
double r5083541 = r5083540 * r5083540;
double r5083542 = r5083539 + r5083541;
double r5083543 = sqrt(r5083542);
double r5083544 = r5083528 * r5083543;
return r5083544;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r5083545 = phi2;
double r5083546 = 1.400742996618376e-20;
bool r5083547 = r5083545 <= r5083546;
double r5083548 = phi1;
double r5083549 = r5083548 - r5083545;
double r5083550 = r5083549 * r5083549;
double r5083551 = r5083545 + r5083548;
double r5083552 = 2.0;
double r5083553 = r5083551 / r5083552;
double r5083554 = cos(r5083553);
double r5083555 = lambda1;
double r5083556 = lambda2;
double r5083557 = r5083555 - r5083556;
double r5083558 = r5083554 * r5083557;
double r5083559 = exp(r5083554);
double r5083560 = log(r5083559);
double r5083561 = r5083560 * r5083557;
double r5083562 = r5083558 * r5083561;
double r5083563 = r5083550 + r5083562;
double r5083564 = sqrt(r5083563);
double r5083565 = R;
double r5083566 = r5083564 * r5083565;
double r5083567 = r5083545 - r5083548;
double r5083568 = r5083565 * r5083567;
double r5083569 = r5083547 ? r5083566 : r5083568;
return r5083569;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if phi2 < 1.400742996618376e-20Initial program 34.4
rmApplied add-log-exp34.4
if 1.400742996618376e-20 < phi2 Initial program 45.5
Taylor expanded around 0 27.6
Final simplification32.8
herbie shell --seed 2019158
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))))))