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 - \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 \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}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82506 = R;
double r82507 = 2.0;
double r82508 = phi1;
double r82509 = phi2;
double r82510 = r82508 - r82509;
double r82511 = r82510 / r82507;
double r82512 = sin(r82511);
double r82513 = pow(r82512, r82507);
double r82514 = cos(r82508);
double r82515 = cos(r82509);
double r82516 = r82514 * r82515;
double r82517 = lambda1;
double r82518 = lambda2;
double r82519 = r82517 - r82518;
double r82520 = r82519 / r82507;
double r82521 = sin(r82520);
double r82522 = r82516 * r82521;
double r82523 = r82522 * r82521;
double r82524 = r82513 + r82523;
double r82525 = sqrt(r82524);
double r82526 = 1.0;
double r82527 = r82526 - r82524;
double r82528 = sqrt(r82527);
double r82529 = atan2(r82525, r82528);
double r82530 = r82507 * r82529;
double r82531 = r82506 * r82530;
return r82531;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r82532 = R;
double r82533 = 2.0;
double r82534 = phi1;
double r82535 = phi2;
double r82536 = r82534 - r82535;
double r82537 = r82536 / r82533;
double r82538 = sin(r82537);
double r82539 = pow(r82538, r82533);
double r82540 = cos(r82534);
double r82541 = cos(r82535);
double r82542 = r82540 * r82541;
double r82543 = lambda1;
double r82544 = lambda2;
double r82545 = r82543 - r82544;
double r82546 = r82545 / r82533;
double r82547 = sin(r82546);
double r82548 = r82542 * r82547;
double r82549 = r82548 * r82547;
double r82550 = r82539 + r82549;
double r82551 = sqrt(r82550);
double r82552 = 1.0;
double r82553 = 3.0;
double r82554 = pow(r82547, r82553);
double r82555 = cbrt(r82554);
double r82556 = r82542 * r82555;
double r82557 = r82556 * r82555;
double r82558 = r82539 + r82557;
double r82559 = r82552 - r82558;
double r82560 = sqrt(r82559);
double r82561 = atan2(r82551, r82560);
double r82562 = r82533 * r82561;
double r82563 = r82532 * r82562;
return r82563;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
Final simplification24.6
herbie shell --seed 2019326
(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))))))))))