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 \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r77400 = R;
double r77401 = 2.0;
double r77402 = phi1;
double r77403 = phi2;
double r77404 = r77402 - r77403;
double r77405 = r77404 / r77401;
double r77406 = sin(r77405);
double r77407 = pow(r77406, r77401);
double r77408 = cos(r77402);
double r77409 = cos(r77403);
double r77410 = r77408 * r77409;
double r77411 = lambda1;
double r77412 = lambda2;
double r77413 = r77411 - r77412;
double r77414 = r77413 / r77401;
double r77415 = sin(r77414);
double r77416 = r77410 * r77415;
double r77417 = r77416 * r77415;
double r77418 = r77407 + r77417;
double r77419 = sqrt(r77418);
double r77420 = 1.0;
double r77421 = r77420 - r77418;
double r77422 = sqrt(r77421);
double r77423 = atan2(r77419, r77422);
double r77424 = r77401 * r77423;
double r77425 = r77400 * r77424;
return r77425;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r77426 = R;
double r77427 = 2.0;
double r77428 = phi1;
double r77429 = r77428 / r77427;
double r77430 = sin(r77429);
double r77431 = phi2;
double r77432 = r77431 / r77427;
double r77433 = cos(r77432);
double r77434 = r77430 * r77433;
double r77435 = cos(r77429);
double r77436 = sin(r77432);
double r77437 = r77435 * r77436;
double r77438 = r77434 - r77437;
double r77439 = pow(r77438, r77427);
double r77440 = cos(r77428);
double r77441 = cos(r77431);
double r77442 = r77440 * r77441;
double r77443 = lambda1;
double r77444 = lambda2;
double r77445 = r77443 - r77444;
double r77446 = r77445 / r77427;
double r77447 = sin(r77446);
double r77448 = r77442 * r77447;
double r77449 = r77448 * r77447;
double r77450 = r77439 + r77449;
double r77451 = sqrt(r77450);
double r77452 = 1.0;
double r77453 = exp(r77447);
double r77454 = log(r77453);
double r77455 = r77442 * r77454;
double r77456 = r77455 * r77454;
double r77457 = r77439 + r77456;
double r77458 = r77452 - r77457;
double r77459 = sqrt(r77458);
double r77460 = atan2(r77451, r77459);
double r77461 = r77427 * r77460;
double r77462 = r77426 * r77461;
return r77462;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied div-sub24.4
Applied sin-diff23.8
rmApplied div-sub23.8
Applied sin-diff14.1
rmApplied add-log-exp14.1
rmApplied add-log-exp14.1
Final simplification14.1
herbie shell --seed 2019350
(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))))))))))