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(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right) + \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) \le 1.85335802842088590346712744457318896647 \cdot 10^{302}:\\
\;\;\;\;\sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \log \left(e^{\cos \left(\frac{\phi_1 + \phi_2}{2}\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)} \cdot R\\
\mathbf{else}:\\
\;\;\;\;\left(\phi_2 - \phi_1\right) \cdot R\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r10396569 = R;
double r10396570 = lambda1;
double r10396571 = lambda2;
double r10396572 = r10396570 - r10396571;
double r10396573 = phi1;
double r10396574 = phi2;
double r10396575 = r10396573 + r10396574;
double r10396576 = 2.0;
double r10396577 = r10396575 / r10396576;
double r10396578 = cos(r10396577);
double r10396579 = r10396572 * r10396578;
double r10396580 = r10396579 * r10396579;
double r10396581 = r10396573 - r10396574;
double r10396582 = r10396581 * r10396581;
double r10396583 = r10396580 + r10396582;
double r10396584 = sqrt(r10396583);
double r10396585 = r10396569 * r10396584;
return r10396585;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r10396586 = phi1;
double r10396587 = phi2;
double r10396588 = r10396586 - r10396587;
double r10396589 = r10396588 * r10396588;
double r10396590 = lambda1;
double r10396591 = lambda2;
double r10396592 = r10396590 - r10396591;
double r10396593 = r10396586 + r10396587;
double r10396594 = 2.0;
double r10396595 = r10396593 / r10396594;
double r10396596 = cos(r10396595);
double r10396597 = r10396592 * r10396596;
double r10396598 = r10396597 * r10396597;
double r10396599 = r10396589 + r10396598;
double r10396600 = 1.853358028420886e+302;
bool r10396601 = r10396599 <= r10396600;
double r10396602 = exp(r10396596);
double r10396603 = log(r10396602);
double r10396604 = r10396592 * r10396603;
double r10396605 = r10396604 * r10396597;
double r10396606 = r10396605 + r10396589;
double r10396607 = sqrt(r10396606);
double r10396608 = R;
double r10396609 = r10396607 * r10396608;
double r10396610 = r10396587 - r10396586;
double r10396611 = r10396610 * r10396608;
double r10396612 = r10396601 ? r10396609 : r10396611;
return r10396612;
}



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))) < 1.853358028420886e+302Initial program 2.0
rmApplied add-log-exp2.0
if 1.853358028420886e+302 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.1
Taylor expanded around 0 47.0
Final simplification29.6
herbie shell --seed 2019171
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Equirectangular approximation to distance on a great circle"
(* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))))