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 4.321129580240060876714015364199417813533 \cdot 10^{306}:\\
\;\;\;\;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)}\\
\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 r693658 = R;
double r693659 = lambda1;
double r693660 = lambda2;
double r693661 = r693659 - r693660;
double r693662 = phi1;
double r693663 = phi2;
double r693664 = r693662 + r693663;
double r693665 = 2.0;
double r693666 = r693664 / r693665;
double r693667 = cos(r693666);
double r693668 = r693661 * r693667;
double r693669 = r693668 * r693668;
double r693670 = r693662 - r693663;
double r693671 = r693670 * r693670;
double r693672 = r693669 + r693671;
double r693673 = sqrt(r693672);
double r693674 = r693658 * r693673;
return r693674;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r693675 = lambda1;
double r693676 = lambda2;
double r693677 = r693675 - r693676;
double r693678 = phi1;
double r693679 = phi2;
double r693680 = r693678 + r693679;
double r693681 = 2.0;
double r693682 = r693680 / r693681;
double r693683 = cos(r693682);
double r693684 = r693677 * r693683;
double r693685 = r693684 * r693684;
double r693686 = r693678 - r693679;
double r693687 = r693686 * r693686;
double r693688 = r693685 + r693687;
double r693689 = 4.321129580240061e+306;
bool r693690 = r693688 <= r693689;
double r693691 = R;
double r693692 = sqrt(r693688);
double r693693 = r693691 * r693692;
double r693694 = r693679 - r693678;
double r693695 = r693691 * r693694;
double r693696 = r693690 ? r693693 : r693695;
return r693696;
}



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))) < 4.321129580240061e+306Initial program 1.8
if 4.321129580240061e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.6
Taylor expanded around 0 47.1
Final simplification29.2
herbie shell --seed 2019353
(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))))))