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.6245432028787778 \cdot 10^{+308}:\\
\;\;\;\;R \cdot \sqrt{\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)}\\
\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 r8014780 = R;
double r8014781 = lambda1;
double r8014782 = lambda2;
double r8014783 = r8014781 - r8014782;
double r8014784 = phi1;
double r8014785 = phi2;
double r8014786 = r8014784 + r8014785;
double r8014787 = 2.0;
double r8014788 = r8014786 / r8014787;
double r8014789 = cos(r8014788);
double r8014790 = r8014783 * r8014789;
double r8014791 = r8014790 * r8014790;
double r8014792 = r8014784 - r8014785;
double r8014793 = r8014792 * r8014792;
double r8014794 = r8014791 + r8014793;
double r8014795 = sqrt(r8014794);
double r8014796 = r8014780 * r8014795;
return r8014796;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r8014797 = phi1;
double r8014798 = phi2;
double r8014799 = r8014797 - r8014798;
double r8014800 = r8014799 * r8014799;
double r8014801 = lambda1;
double r8014802 = lambda2;
double r8014803 = r8014801 - r8014802;
double r8014804 = r8014797 + r8014798;
double r8014805 = 2.0;
double r8014806 = r8014804 / r8014805;
double r8014807 = cos(r8014806);
double r8014808 = r8014803 * r8014807;
double r8014809 = r8014808 * r8014808;
double r8014810 = r8014800 + r8014809;
double r8014811 = 1.6245432028787778e+308;
bool r8014812 = r8014810 <= r8014811;
double r8014813 = R;
double r8014814 = sqrt(r8014810);
double r8014815 = r8014813 * r8014814;
double r8014816 = r8014798 - r8014797;
double r8014817 = r8014813 * r8014816;
double r8014818 = r8014812 ? r8014815 : r8014817;
return r8014818;
}



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))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))) < 1.6245432028787778e+308Initial program 1.7
if 1.6245432028787778e+308 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 60.8
Taylor expanded around 0 46.9
Final simplification28.6
herbie shell --seed 2019146
(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))))))