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}\;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)} = -\infty \lor \neg \left(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)} \le 1.337675935923557317708336276671866676719 \cdot 10^{290}\right):\\
\;\;\;\;R \cdot \left(\phi_2 - \phi_1\right)\\
\mathbf{else}:\\
\;\;\;\;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)}\\
\end{array}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r91313 = R;
double r91314 = lambda1;
double r91315 = lambda2;
double r91316 = r91314 - r91315;
double r91317 = phi1;
double r91318 = phi2;
double r91319 = r91317 + r91318;
double r91320 = 2.0;
double r91321 = r91319 / r91320;
double r91322 = cos(r91321);
double r91323 = r91316 * r91322;
double r91324 = r91323 * r91323;
double r91325 = r91317 - r91318;
double r91326 = r91325 * r91325;
double r91327 = r91324 + r91326;
double r91328 = sqrt(r91327);
double r91329 = r91313 * r91328;
return r91329;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r91330 = R;
double r91331 = lambda1;
double r91332 = lambda2;
double r91333 = r91331 - r91332;
double r91334 = phi1;
double r91335 = phi2;
double r91336 = r91334 + r91335;
double r91337 = 2.0;
double r91338 = r91336 / r91337;
double r91339 = cos(r91338);
double r91340 = r91333 * r91339;
double r91341 = r91340 * r91340;
double r91342 = r91334 - r91335;
double r91343 = r91342 * r91342;
double r91344 = r91341 + r91343;
double r91345 = sqrt(r91344);
double r91346 = r91330 * r91345;
double r91347 = -inf.0;
bool r91348 = r91346 <= r91347;
double r91349 = 1.3376759359235573e+290;
bool r91350 = r91346 <= r91349;
double r91351 = !r91350;
bool r91352 = r91348 || r91351;
double r91353 = r91335 - r91334;
double r91354 = r91330 * r91353;
double r91355 = r91352 ? r91354 : r91346;
return r91355;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
if (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < -inf.0 or 1.3376759359235573e+290 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) Initial program 63.4
Taylor expanded around 0 47.0
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 1.3376759359235573e+290Initial program 1.8
Final simplification29.1
herbie shell --seed 2019354
(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))))))