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}\;\phi_2 \le 0.1234906905453276027007092352505424059927:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \sqrt[3]{{\left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)}^{3}}\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 r80781 = R;
double r80782 = lambda1;
double r80783 = lambda2;
double r80784 = r80782 - r80783;
double r80785 = phi1;
double r80786 = phi2;
double r80787 = r80785 + r80786;
double r80788 = 2.0;
double r80789 = r80787 / r80788;
double r80790 = cos(r80789);
double r80791 = r80784 * r80790;
double r80792 = r80791 * r80791;
double r80793 = r80785 - r80786;
double r80794 = r80793 * r80793;
double r80795 = r80792 + r80794;
double r80796 = sqrt(r80795);
double r80797 = r80781 * r80796;
return r80797;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80798 = phi2;
double r80799 = 0.1234906905453276;
bool r80800 = r80798 <= r80799;
double r80801 = R;
double r80802 = lambda1;
double r80803 = lambda2;
double r80804 = r80802 - r80803;
double r80805 = phi1;
double r80806 = r80805 + r80798;
double r80807 = 2.0;
double r80808 = r80806 / r80807;
double r80809 = cos(r80808);
double r80810 = 3.0;
double r80811 = pow(r80809, r80810);
double r80812 = cbrt(r80811);
double r80813 = r80804 * r80812;
double r80814 = r80804 * r80809;
double r80815 = r80813 * r80814;
double r80816 = r80805 - r80798;
double r80817 = r80816 * r80816;
double r80818 = r80815 + r80817;
double r80819 = sqrt(r80818);
double r80820 = r80801 * r80819;
double r80821 = r80798 - r80805;
double r80822 = r80801 * r80821;
double r80823 = r80800 ? r80820 : r80822;
return r80823;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if phi2 < 0.1234906905453276Initial program 36.6
rmApplied add-cbrt-cube36.6
Simplified36.6
if 0.1234906905453276 < phi2 Initial program 47.2
Taylor expanded around 0 27.6
Final simplification34.5
herbie shell --seed 2019294
(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))))))