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 1.080381427413534589194695339354407783058 \cdot 10^{303}:\\
\;\;\;\;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 r70316 = R;
double r70317 = lambda1;
double r70318 = lambda2;
double r70319 = r70317 - r70318;
double r70320 = phi1;
double r70321 = phi2;
double r70322 = r70320 + r70321;
double r70323 = 2.0;
double r70324 = r70322 / r70323;
double r70325 = cos(r70324);
double r70326 = r70319 * r70325;
double r70327 = r70326 * r70326;
double r70328 = r70320 - r70321;
double r70329 = r70328 * r70328;
double r70330 = r70327 + r70329;
double r70331 = sqrt(r70330);
double r70332 = r70316 * r70331;
return r70332;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r70333 = lambda1;
double r70334 = lambda2;
double r70335 = r70333 - r70334;
double r70336 = phi1;
double r70337 = phi2;
double r70338 = r70336 + r70337;
double r70339 = 2.0;
double r70340 = r70338 / r70339;
double r70341 = cos(r70340);
double r70342 = r70335 * r70341;
double r70343 = r70342 * r70342;
double r70344 = r70336 - r70337;
double r70345 = r70344 * r70344;
double r70346 = r70343 + r70345;
double r70347 = 1.0803814274135346e+303;
bool r70348 = r70346 <= r70347;
double r70349 = R;
double r70350 = r70335 * r70335;
double r70351 = r70341 * r70341;
double r70352 = r70350 * r70351;
double r70353 = r70352 + r70345;
double r70354 = sqrt(r70353);
double r70355 = r70349 * r70354;
double r70356 = r70337 - r70336;
double r70357 = r70349 * r70356;
double r70358 = r70348 ? r70355 : r70357;
return r70358;
}



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))) < 1.0803814274135346e+303Initial program 2.1
rmApplied swap-sqr2.1
if 1.0803814274135346e+303 < (+ (* (* (- 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.2
Final simplification29.5
herbie shell --seed 2019304
(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))))))