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 2.347524003614899002603168442844380867003 \cdot 10^{299}:\\
\;\;\;\;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)}\\
\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 r99934 = R;
double r99935 = lambda1;
double r99936 = lambda2;
double r99937 = r99935 - r99936;
double r99938 = phi1;
double r99939 = phi2;
double r99940 = r99938 + r99939;
double r99941 = 2.0;
double r99942 = r99940 / r99941;
double r99943 = cos(r99942);
double r99944 = r99937 * r99943;
double r99945 = r99944 * r99944;
double r99946 = r99938 - r99939;
double r99947 = r99946 * r99946;
double r99948 = r99945 + r99947;
double r99949 = sqrt(r99948);
double r99950 = r99934 * r99949;
return r99950;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r99951 = lambda1;
double r99952 = lambda2;
double r99953 = r99951 - r99952;
double r99954 = phi1;
double r99955 = phi2;
double r99956 = r99954 + r99955;
double r99957 = 2.0;
double r99958 = r99956 / r99957;
double r99959 = cos(r99958);
double r99960 = r99953 * r99959;
double r99961 = r99960 * r99960;
double r99962 = r99954 - r99955;
double r99963 = r99962 * r99962;
double r99964 = r99961 + r99963;
double r99965 = 2.347524003614899e+299;
bool r99966 = r99964 <= r99965;
double r99967 = R;
double r99968 = sqrt(r99964);
double r99969 = r99967 * r99968;
double r99970 = r99955 - r99954;
double r99971 = r99967 * r99970;
double r99972 = r99966 ? r99969 : r99971;
return r99972;
}



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))) < 2.347524003614899e+299Initial program 1.7
if 2.347524003614899e+299 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 62.7
Taylor expanded around 0 46.9
Final simplification29.3
herbie shell --seed 2019362
(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))))))