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 r74466 = R;
double r74467 = 2.0;
double r74468 = phi1;
double r74469 = phi2;
double r74470 = r74468 - r74469;
double r74471 = r74470 / r74467;
double r74472 = sin(r74471);
double r74473 = pow(r74472, r74467);
double r74474 = cos(r74468);
double r74475 = cos(r74469);
double r74476 = r74474 * r74475;
double r74477 = lambda1;
double r74478 = lambda2;
double r74479 = r74477 - r74478;
double r74480 = r74479 / r74467;
double r74481 = sin(r74480);
double r74482 = r74476 * r74481;
double r74483 = r74482 * r74481;
double r74484 = r74473 + r74483;
double r74485 = sqrt(r74484);
double r74486 = 1.0;
double r74487 = r74486 - r74484;
double r74488 = sqrt(r74487);
double r74489 = atan2(r74485, r74488);
double r74490 = r74467 * r74489;
double r74491 = r74466 * r74490;
return r74491;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r74492 = R;
double r74493 = 2.0;
double r74494 = phi1;
double r74495 = r74494 / r74493;
double r74496 = sin(r74495);
double r74497 = phi2;
double r74498 = r74497 / r74493;
double r74499 = cos(r74498);
double r74500 = r74496 * r74499;
double r74501 = cos(r74495);
double r74502 = sin(r74498);
double r74503 = r74501 * r74502;
double r74504 = r74500 - r74503;
double r74505 = pow(r74504, r74493);
double r74506 = cos(r74494);
double r74507 = cos(r74497);
double r74508 = r74506 * r74507;
double r74509 = lambda1;
double r74510 = lambda2;
double r74511 = r74509 - r74510;
double r74512 = r74511 / r74493;
double r74513 = sin(r74512);
double r74514 = r74508 * r74513;
double r74515 = r74514 * r74513;
double r74516 = r74505 + r74515;
double r74517 = sqrt(r74516);
double r74518 = 1.0;
double r74519 = exp(r74513);
double r74520 = log(r74519);
double r74521 = r74508 * r74520;
double r74522 = r74521 * r74520;
double r74523 = r74505 + r74522;
double r74524 = r74518 - r74523;
double r74525 = sqrt(r74524);
double r74526 = atan2(r74517, r74525);
double r74527 = r74493 * r74526;
double r74528 = r74492 * r74527;
return r74528;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.9
rmApplied div-sub24.9
Applied sin-diff24.2
rmApplied div-sub24.2
Applied sin-diff14.3
rmApplied add-log-exp14.3
rmApplied add-log-exp14.3
Final simplification14.3
herbie shell --seed 2020025
(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))))))))))