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 7.897228082610540854058934787173913906989 \cdot 10^{284}\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 r80391 = R;
double r80392 = lambda1;
double r80393 = lambda2;
double r80394 = r80392 - r80393;
double r80395 = phi1;
double r80396 = phi2;
double r80397 = r80395 + r80396;
double r80398 = 2.0;
double r80399 = r80397 / r80398;
double r80400 = cos(r80399);
double r80401 = r80394 * r80400;
double r80402 = r80401 * r80401;
double r80403 = r80395 - r80396;
double r80404 = r80403 * r80403;
double r80405 = r80402 + r80404;
double r80406 = sqrt(r80405);
double r80407 = r80391 * r80406;
return r80407;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80408 = R;
double r80409 = lambda1;
double r80410 = lambda2;
double r80411 = r80409 - r80410;
double r80412 = phi1;
double r80413 = phi2;
double r80414 = r80412 + r80413;
double r80415 = 2.0;
double r80416 = r80414 / r80415;
double r80417 = cos(r80416);
double r80418 = r80411 * r80417;
double r80419 = r80418 * r80418;
double r80420 = r80412 - r80413;
double r80421 = r80420 * r80420;
double r80422 = r80419 + r80421;
double r80423 = sqrt(r80422);
double r80424 = r80408 * r80423;
double r80425 = -inf.0;
bool r80426 = r80424 <= r80425;
double r80427 = 7.897228082610541e+284;
bool r80428 = r80424 <= r80427;
double r80429 = !r80428;
bool r80430 = r80426 || r80429;
double r80431 = r80413 - r80412;
double r80432 = r80408 * r80431;
double r80433 = r80430 ? r80432 : r80424;
return r80433;
}



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 7.897228082610541e+284 < (* R (sqrt (+ (* (* (- 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.5
if -inf.0 < (* R (sqrt (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))))) < 7.897228082610541e+284Initial program 1.7
Final simplification29.1
herbie shell --seed 2019303
(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))))))