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.784282782945174464637469429127975911088 \cdot 10^{306}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\left(\lambda_1 - \lambda_2\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right) \cdot \left(\lambda_1 - \lambda_2\right) + \left(\phi_1 - \phi_2\right) \cdot \left(\phi_1 - \phi_2\right)}\\
\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 r10794916 = R;
double r10794917 = lambda1;
double r10794918 = lambda2;
double r10794919 = r10794917 - r10794918;
double r10794920 = phi1;
double r10794921 = phi2;
double r10794922 = r10794920 + r10794921;
double r10794923 = 2.0;
double r10794924 = r10794922 / r10794923;
double r10794925 = cos(r10794924);
double r10794926 = r10794919 * r10794925;
double r10794927 = r10794926 * r10794926;
double r10794928 = r10794920 - r10794921;
double r10794929 = r10794928 * r10794928;
double r10794930 = r10794927 + r10794929;
double r10794931 = sqrt(r10794930);
double r10794932 = r10794916 * r10794931;
return r10794932;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r10794933 = phi1;
double r10794934 = phi2;
double r10794935 = r10794933 - r10794934;
double r10794936 = r10794935 * r10794935;
double r10794937 = lambda1;
double r10794938 = lambda2;
double r10794939 = r10794937 - r10794938;
double r10794940 = r10794933 + r10794934;
double r10794941 = 2.0;
double r10794942 = r10794940 / r10794941;
double r10794943 = cos(r10794942);
double r10794944 = r10794939 * r10794943;
double r10794945 = r10794944 * r10794944;
double r10794946 = r10794936 + r10794945;
double r10794947 = 1.7842827829451745e+306;
bool r10794948 = r10794946 <= r10794947;
double r10794949 = R;
double r10794950 = r10794944 * r10794943;
double r10794951 = r10794950 * r10794939;
double r10794952 = r10794951 + r10794936;
double r10794953 = sqrt(r10794952);
double r10794954 = r10794949 * r10794953;
double r10794955 = r10794934 - r10794933;
double r10794956 = r10794955 * r10794949;
double r10794957 = r10794948 ? r10794954 : r10794956;
return r10794957;
}



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.7842827829451745e+306Initial program 2.0
rmApplied associate-*l*2.0
if 1.7842827829451745e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.7
Taylor expanded around 0 46.2
Final simplification28.8
herbie shell --seed 2019169
(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))))))