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 7.727116615399575 \cdot 10^{+304}:\\
\;\;\;\;R \cdot \sqrt{\left(\sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 + \phi_2}{2}\right)\right)} \cdot \left(\lambda_1 - \lambda_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)}\\
\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 r5046945 = R;
double r5046946 = lambda1;
double r5046947 = lambda2;
double r5046948 = r5046946 - r5046947;
double r5046949 = phi1;
double r5046950 = phi2;
double r5046951 = r5046949 + r5046950;
double r5046952 = 2.0;
double r5046953 = r5046951 / r5046952;
double r5046954 = cos(r5046953);
double r5046955 = r5046948 * r5046954;
double r5046956 = r5046955 * r5046955;
double r5046957 = r5046949 - r5046950;
double r5046958 = r5046957 * r5046957;
double r5046959 = r5046956 + r5046958;
double r5046960 = sqrt(r5046959);
double r5046961 = r5046945 * r5046960;
return r5046961;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r5046962 = phi1;
double r5046963 = phi2;
double r5046964 = r5046962 - r5046963;
double r5046965 = r5046964 * r5046964;
double r5046966 = lambda1;
double r5046967 = lambda2;
double r5046968 = r5046966 - r5046967;
double r5046969 = r5046962 + r5046963;
double r5046970 = 2.0;
double r5046971 = r5046969 / r5046970;
double r5046972 = cos(r5046971);
double r5046973 = r5046968 * r5046972;
double r5046974 = r5046973 * r5046973;
double r5046975 = r5046965 + r5046974;
double r5046976 = 7.727116615399575e+304;
bool r5046977 = r5046975 <= r5046976;
double r5046978 = R;
double r5046979 = r5046972 * r5046972;
double r5046980 = r5046972 * r5046979;
double r5046981 = cbrt(r5046980);
double r5046982 = r5046981 * r5046968;
double r5046983 = r5046982 * r5046973;
double r5046984 = r5046983 + r5046965;
double r5046985 = sqrt(r5046984);
double r5046986 = r5046978 * r5046985;
double r5046987 = r5046963 - r5046962;
double r5046988 = r5046987 * r5046978;
double r5046989 = r5046977 ? r5046986 : r5046988;
return r5046989;
}



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))) < 7.727116615399575e+304Initial program 1.7
rmApplied add-cbrt-cube1.8
if 7.727116615399575e+304 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 60.2
Taylor expanded around 0 46.7
Final simplification28.8
herbie shell --seed 2019152
(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))))))