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 7.420853173801729078254565024893966733298 \cdot 10^{307}:\\
\;\;\;\;R \cdot \sqrt{\left(\left(\lambda_1 - \lambda_2\right) \cdot \left(\lambda_1 - \lambda_2\right)\right) \cdot \left(\cos \left(\frac{\phi_1 + \phi_2}{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 r95394 = R;
double r95395 = lambda1;
double r95396 = lambda2;
double r95397 = r95395 - r95396;
double r95398 = phi1;
double r95399 = phi2;
double r95400 = r95398 + r95399;
double r95401 = 2.0;
double r95402 = r95400 / r95401;
double r95403 = cos(r95402);
double r95404 = r95397 * r95403;
double r95405 = r95404 * r95404;
double r95406 = r95398 - r95399;
double r95407 = r95406 * r95406;
double r95408 = r95405 + r95407;
double r95409 = sqrt(r95408);
double r95410 = r95394 * r95409;
return r95410;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r95411 = lambda1;
double r95412 = lambda2;
double r95413 = r95411 - r95412;
double r95414 = phi1;
double r95415 = phi2;
double r95416 = r95414 + r95415;
double r95417 = 2.0;
double r95418 = r95416 / r95417;
double r95419 = cos(r95418);
double r95420 = r95413 * r95419;
double r95421 = r95420 * r95420;
double r95422 = r95414 - r95415;
double r95423 = r95422 * r95422;
double r95424 = r95421 + r95423;
double r95425 = 7.420853173801729e+307;
bool r95426 = r95424 <= r95425;
double r95427 = R;
double r95428 = r95413 * r95413;
double r95429 = r95419 * r95419;
double r95430 = r95428 * r95429;
double r95431 = r95430 + r95423;
double r95432 = sqrt(r95431);
double r95433 = r95427 * r95432;
double r95434 = r95415 - r95414;
double r95435 = r95427 * r95434;
double r95436 = r95426 ? r95433 : r95435;
return r95436;
}



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))) < 7.420853173801729e+307Initial program 2.0
rmApplied swap-sqr2.0
if 7.420853173801729e+307 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.9
Taylor expanded around 0 46.4
Final simplification28.7
herbie shell --seed 2019323
(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))))))