R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)R \cdot \left(2 \cdot \tan^{-1}_* \frac{\sqrt{{\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt{1 - \left({\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \log \left(e^{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68425 = R;
double r68426 = 2.0;
double r68427 = phi1;
double r68428 = phi2;
double r68429 = r68427 - r68428;
double r68430 = r68429 / r68426;
double r68431 = sin(r68430);
double r68432 = pow(r68431, r68426);
double r68433 = cos(r68427);
double r68434 = cos(r68428);
double r68435 = r68433 * r68434;
double r68436 = lambda1;
double r68437 = lambda2;
double r68438 = r68436 - r68437;
double r68439 = r68438 / r68426;
double r68440 = sin(r68439);
double r68441 = r68435 * r68440;
double r68442 = r68441 * r68440;
double r68443 = r68432 + r68442;
double r68444 = sqrt(r68443);
double r68445 = 1.0;
double r68446 = r68445 - r68443;
double r68447 = sqrt(r68446);
double r68448 = atan2(r68444, r68447);
double r68449 = r68426 * r68448;
double r68450 = r68425 * r68449;
return r68450;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r68451 = R;
double r68452 = 2.0;
double r68453 = phi1;
double r68454 = r68453 / r68452;
double r68455 = sin(r68454);
double r68456 = phi2;
double r68457 = r68456 / r68452;
double r68458 = cos(r68457);
double r68459 = r68455 * r68458;
double r68460 = cos(r68454);
double r68461 = sin(r68457);
double r68462 = r68460 * r68461;
double r68463 = r68459 - r68462;
double r68464 = pow(r68463, r68452);
double r68465 = cos(r68453);
double r68466 = cos(r68456);
double r68467 = r68465 * r68466;
double r68468 = lambda1;
double r68469 = lambda2;
double r68470 = r68468 - r68469;
double r68471 = r68470 / r68452;
double r68472 = sin(r68471);
double r68473 = r68467 * r68472;
double r68474 = r68473 * r68472;
double r68475 = r68464 + r68474;
double r68476 = sqrt(r68475);
double r68477 = 1.0;
double r68478 = 3.0;
double r68479 = pow(r68472, r68478);
double r68480 = cbrt(r68479);
double r68481 = exp(r68480);
double r68482 = log(r68481);
double r68483 = r68473 * r68482;
double r68484 = r68464 + r68483;
double r68485 = r68477 - r68484;
double r68486 = sqrt(r68485);
double r68487 = atan2(r68476, r68486);
double r68488 = r68452 * r68487;
double r68489 = r68451 * r68488;
return r68489;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.3
rmApplied div-sub24.3
Applied sin-diff23.7
rmApplied div-sub23.7
Applied sin-diff14.0
rmApplied add-log-exp14.0
rmApplied add-cbrt-cube14.0
Simplified14.0
Final simplification14.0
herbie shell --seed 2019303
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
:precision binary64
(* R (* 2 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))) (sqrt (- 1 (+ (pow (sin (/ (- phi1 phi2) 2)) 2) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2))) (sin (/ (- lambda1 lambda2) 2))))))))))