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.605055345730565045055879951608156666024 \cdot 10^{305}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \frac{\left(\lambda_1 \cdot \lambda_1 - \lambda_2 \cdot \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)}{\lambda_1 + \lambda_2} + \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 r95770 = R;
double r95771 = lambda1;
double r95772 = lambda2;
double r95773 = r95771 - r95772;
double r95774 = phi1;
double r95775 = phi2;
double r95776 = r95774 + r95775;
double r95777 = 2.0;
double r95778 = r95776 / r95777;
double r95779 = cos(r95778);
double r95780 = r95773 * r95779;
double r95781 = r95780 * r95780;
double r95782 = r95774 - r95775;
double r95783 = r95782 * r95782;
double r95784 = r95781 + r95783;
double r95785 = sqrt(r95784);
double r95786 = r95770 * r95785;
return r95786;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r95787 = lambda1;
double r95788 = lambda2;
double r95789 = r95787 - r95788;
double r95790 = phi1;
double r95791 = phi2;
double r95792 = r95790 + r95791;
double r95793 = 2.0;
double r95794 = r95792 / r95793;
double r95795 = cos(r95794);
double r95796 = r95789 * r95795;
double r95797 = r95796 * r95796;
double r95798 = r95790 - r95791;
double r95799 = r95798 * r95798;
double r95800 = r95797 + r95799;
double r95801 = 4.605055345730565e+305;
bool r95802 = r95800 <= r95801;
double r95803 = R;
double r95804 = r95787 * r95787;
double r95805 = r95788 * r95788;
double r95806 = r95804 - r95805;
double r95807 = r95806 * r95795;
double r95808 = r95787 + r95788;
double r95809 = r95807 / r95808;
double r95810 = r95796 * r95809;
double r95811 = r95810 + r95799;
double r95812 = sqrt(r95811);
double r95813 = r95803 * r95812;
double r95814 = r95791 - r95790;
double r95815 = r95803 * r95814;
double r95816 = r95802 ? r95813 : r95815;
return r95816;
}



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.605055345730565e+305Initial program 1.8
rmApplied flip--1.8
Applied associate-*l/1.8
if 4.605055345730565e+305 < (+ (* (* (- 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 46.4
Final simplification28.6
herbie shell --seed 2019325
(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))))))