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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}}{\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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r115473 = R;
double r115474 = 2.0;
double r115475 = phi1;
double r115476 = phi2;
double r115477 = r115475 - r115476;
double r115478 = r115477 / r115474;
double r115479 = sin(r115478);
double r115480 = pow(r115479, r115474);
double r115481 = cos(r115475);
double r115482 = cos(r115476);
double r115483 = r115481 * r115482;
double r115484 = lambda1;
double r115485 = lambda2;
double r115486 = r115484 - r115485;
double r115487 = r115486 / r115474;
double r115488 = sin(r115487);
double r115489 = r115483 * r115488;
double r115490 = r115489 * r115488;
double r115491 = r115480 + r115490;
double r115492 = sqrt(r115491);
double r115493 = 1.0;
double r115494 = r115493 - r115491;
double r115495 = sqrt(r115494);
double r115496 = atan2(r115492, r115495);
double r115497 = r115474 * r115496;
double r115498 = r115473 * r115497;
return r115498;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r115499 = R;
double r115500 = 2.0;
double r115501 = phi1;
double r115502 = r115501 / r115500;
double r115503 = sin(r115502);
double r115504 = phi2;
double r115505 = r115504 / r115500;
double r115506 = cos(r115505);
double r115507 = r115503 * r115506;
double r115508 = cos(r115502);
double r115509 = sin(r115505);
double r115510 = r115508 * r115509;
double r115511 = r115507 - r115510;
double r115512 = pow(r115511, r115500);
double r115513 = cos(r115501);
double r115514 = cos(r115504);
double r115515 = r115513 * r115514;
double r115516 = lambda1;
double r115517 = lambda2;
double r115518 = r115516 - r115517;
double r115519 = r115518 / r115500;
double r115520 = sin(r115519);
double r115521 = 3.0;
double r115522 = pow(r115520, r115521);
double r115523 = cbrt(r115522);
double r115524 = r115515 * r115523;
double r115525 = r115524 * r115523;
double r115526 = r115512 + r115525;
double r115527 = sqrt(r115526);
double r115528 = 1.0;
double r115529 = r115515 * r115520;
double r115530 = r115529 * r115520;
double r115531 = r115512 + r115530;
double r115532 = r115528 - r115531;
double r115533 = sqrt(r115532);
double r115534 = atan2(r115527, r115533);
double r115535 = r115500 * r115534;
double r115536 = r115499 * r115535;
return r115536;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 23.8
rmApplied div-sub23.8
Applied sin-diff23.3
rmApplied div-sub23.3
Applied sin-diff13.9
rmApplied add-cbrt-cube14.1
Simplified14.1
rmApplied add-cbrt-cube14.1
Simplified14.1
Final simplification14.1
herbie shell --seed 2020003
(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))))))))))