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 6.466406828195175629982671451676570961003 \cdot 10^{303}:\\
\;\;\;\;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 \cos \left(\frac{\phi_1 + \phi_2}{2}\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 r58654 = R;
double r58655 = lambda1;
double r58656 = lambda2;
double r58657 = r58655 - r58656;
double r58658 = phi1;
double r58659 = phi2;
double r58660 = r58658 + r58659;
double r58661 = 2.0;
double r58662 = r58660 / r58661;
double r58663 = cos(r58662);
double r58664 = r58657 * r58663;
double r58665 = r58664 * r58664;
double r58666 = r58658 - r58659;
double r58667 = r58666 * r58666;
double r58668 = r58665 + r58667;
double r58669 = sqrt(r58668);
double r58670 = r58654 * r58669;
return r58670;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r58671 = lambda1;
double r58672 = lambda2;
double r58673 = r58671 - r58672;
double r58674 = phi1;
double r58675 = phi2;
double r58676 = r58674 + r58675;
double r58677 = 2.0;
double r58678 = r58676 / r58677;
double r58679 = cos(r58678);
double r58680 = r58673 * r58679;
double r58681 = r58680 * r58680;
double r58682 = r58674 - r58675;
double r58683 = r58682 * r58682;
double r58684 = r58681 + r58683;
double r58685 = 6.466406828195176e+303;
bool r58686 = r58684 <= r58685;
double r58687 = R;
double r58688 = r58679 * r58680;
double r58689 = r58673 * r58688;
double r58690 = r58689 + r58683;
double r58691 = sqrt(r58690);
double r58692 = r58687 * r58691;
double r58693 = r58675 - r58674;
double r58694 = r58687 * r58693;
double r58695 = r58686 ? r58692 : r58694;
return r58695;
}



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))) < 6.466406828195176e+303Initial program 1.8
rmApplied associate-*l*1.8
if 6.466406828195176e+303 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.5
Taylor expanded around 0 47.1
Final simplification29.0
herbie shell --seed 2019326
(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))))))