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 2.115316274380832699443686658665147176045 \cdot 10^{306}:\\
\;\;\;\;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)}\\
\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 r63334 = R;
double r63335 = lambda1;
double r63336 = lambda2;
double r63337 = r63335 - r63336;
double r63338 = phi1;
double r63339 = phi2;
double r63340 = r63338 + r63339;
double r63341 = 2.0;
double r63342 = r63340 / r63341;
double r63343 = cos(r63342);
double r63344 = r63337 * r63343;
double r63345 = r63344 * r63344;
double r63346 = r63338 - r63339;
double r63347 = r63346 * r63346;
double r63348 = r63345 + r63347;
double r63349 = sqrt(r63348);
double r63350 = r63334 * r63349;
return r63350;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63351 = lambda1;
double r63352 = lambda2;
double r63353 = r63351 - r63352;
double r63354 = phi1;
double r63355 = phi2;
double r63356 = r63354 + r63355;
double r63357 = 2.0;
double r63358 = r63356 / r63357;
double r63359 = cos(r63358);
double r63360 = r63353 * r63359;
double r63361 = r63360 * r63360;
double r63362 = r63354 - r63355;
double r63363 = r63362 * r63362;
double r63364 = r63361 + r63363;
double r63365 = 2.1153162743808327e+306;
bool r63366 = r63364 <= r63365;
double r63367 = R;
double r63368 = sqrt(r63364);
double r63369 = r63367 * r63368;
double r63370 = r63355 - r63354;
double r63371 = r63367 * r63370;
double r63372 = r63366 ? r63369 : r63371;
return r63372;
}



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))) < 2.1153162743808327e+306Initial program 2.4
if 2.1153162743808327e+306 < (+ (* (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0))) (* (- lambda1 lambda2) (cos (/ (+ phi1 phi2) 2.0)))) (* (- phi1 phi2) (- phi1 phi2))) Initial program 63.5
Taylor expanded around 0 46.9
Final simplification28.9
herbie shell --seed 2019212
(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))))))