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 5.03012472402946357 \cdot 10^{304}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\left(\sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)} \cdot \sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\right) \cdot \sqrt[3]{\cos \left(\frac{\phi_1 + \phi_2}{2}\right)}\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 r64059 = R;
double r64060 = lambda1;
double r64061 = lambda2;
double r64062 = r64060 - r64061;
double r64063 = phi1;
double r64064 = phi2;
double r64065 = r64063 + r64064;
double r64066 = 2.0;
double r64067 = r64065 / r64066;
double r64068 = cos(r64067);
double r64069 = r64062 * r64068;
double r64070 = r64069 * r64069;
double r64071 = r64063 - r64064;
double r64072 = r64071 * r64071;
double r64073 = r64070 + r64072;
double r64074 = sqrt(r64073);
double r64075 = r64059 * r64074;
return r64075;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r64076 = lambda1;
double r64077 = lambda2;
double r64078 = r64076 - r64077;
double r64079 = phi1;
double r64080 = phi2;
double r64081 = r64079 + r64080;
double r64082 = 2.0;
double r64083 = r64081 / r64082;
double r64084 = cos(r64083);
double r64085 = r64078 * r64084;
double r64086 = r64085 * r64085;
double r64087 = r64079 - r64080;
double r64088 = r64087 * r64087;
double r64089 = r64086 + r64088;
double r64090 = 5.030124724029464e+304;
bool r64091 = r64089 <= r64090;
double r64092 = R;
double r64093 = cbrt(r64084);
double r64094 = r64093 * r64093;
double r64095 = r64094 * r64093;
double r64096 = r64078 * r64095;
double r64097 = r64096 * r64085;
double r64098 = r64097 + r64088;
double r64099 = sqrt(r64098);
double r64100 = r64092 * r64099;
double r64101 = r64080 - r64079;
double r64102 = r64092 * r64101;
double r64103 = r64091 ? r64100 : r64102;
return r64103;
}



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))) < 5.030124724029464e+304Initial program 2.0
rmApplied add-cube-cbrt2.1
if 5.030124724029464e+304 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.3
Taylor expanded around 0 47.1
Final simplification29.6
herbie shell --seed 2020042
(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))))))