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 2.1882668992969003 \cdot 10^{+304}:\\
\;\;\;\;R \cdot \sqrt{\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)}\\
\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 r3446217 = R;
double r3446218 = lambda1;
double r3446219 = lambda2;
double r3446220 = r3446218 - r3446219;
double r3446221 = phi1;
double r3446222 = phi2;
double r3446223 = r3446221 + r3446222;
double r3446224 = 2.0;
double r3446225 = r3446223 / r3446224;
double r3446226 = cos(r3446225);
double r3446227 = r3446220 * r3446226;
double r3446228 = r3446227 * r3446227;
double r3446229 = r3446221 - r3446222;
double r3446230 = r3446229 * r3446229;
double r3446231 = r3446228 + r3446230;
double r3446232 = sqrt(r3446231);
double r3446233 = r3446217 * r3446232;
return r3446233;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3446234 = phi1;
double r3446235 = phi2;
double r3446236 = r3446234 - r3446235;
double r3446237 = r3446236 * r3446236;
double r3446238 = lambda1;
double r3446239 = lambda2;
double r3446240 = r3446238 - r3446239;
double r3446241 = r3446234 + r3446235;
double r3446242 = 2.0;
double r3446243 = r3446241 / r3446242;
double r3446244 = cos(r3446243);
double r3446245 = r3446240 * r3446244;
double r3446246 = r3446245 * r3446245;
double r3446247 = r3446237 + r3446246;
double r3446248 = 2.1882668992969003e+304;
bool r3446249 = r3446247 <= r3446248;
double r3446250 = R;
double r3446251 = sqrt(r3446247);
double r3446252 = r3446250 * r3446251;
double r3446253 = r3446235 - r3446234;
double r3446254 = r3446250 * r3446253;
double r3446255 = r3446249 ? r3446252 : r3446254;
return r3446255;
}



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))) < 2.1882668992969003e+304Initial program 1.9
if 2.1882668992969003e+304 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 60.3
Taylor expanded around 0 46.8
Final simplification29.2
herbie shell --seed 2019139
(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))))))