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 \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}}{\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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r71571 = R;
double r71572 = 2.0;
double r71573 = phi1;
double r71574 = phi2;
double r71575 = r71573 - r71574;
double r71576 = r71575 / r71572;
double r71577 = sin(r71576);
double r71578 = pow(r71577, r71572);
double r71579 = cos(r71573);
double r71580 = cos(r71574);
double r71581 = r71579 * r71580;
double r71582 = lambda1;
double r71583 = lambda2;
double r71584 = r71582 - r71583;
double r71585 = r71584 / r71572;
double r71586 = sin(r71585);
double r71587 = r71581 * r71586;
double r71588 = r71587 * r71586;
double r71589 = r71578 + r71588;
double r71590 = sqrt(r71589);
double r71591 = 1.0;
double r71592 = r71591 - r71589;
double r71593 = sqrt(r71592);
double r71594 = atan2(r71590, r71593);
double r71595 = r71572 * r71594;
double r71596 = r71571 * r71595;
return r71596;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r71597 = R;
double r71598 = 2.0;
double r71599 = phi1;
double r71600 = phi2;
double r71601 = r71599 - r71600;
double r71602 = r71601 / r71598;
double r71603 = sin(r71602);
double r71604 = pow(r71603, r71598);
double r71605 = cos(r71599);
double r71606 = cos(r71600);
double r71607 = r71605 * r71606;
double r71608 = lambda1;
double r71609 = lambda2;
double r71610 = r71608 - r71609;
double r71611 = r71610 / r71598;
double r71612 = sin(r71611);
double r71613 = r71607 * r71612;
double r71614 = 3.0;
double r71615 = pow(r71612, r71614);
double r71616 = cbrt(r71615);
double r71617 = r71613 * r71616;
double r71618 = r71604 + r71617;
double r71619 = sqrt(r71618);
double r71620 = 1.0;
double r71621 = r71607 * r71616;
double r71622 = r71621 * r71612;
double r71623 = r71604 + r71622;
double r71624 = r71620 - r71623;
double r71625 = sqrt(r71624);
double r71626 = atan2(r71619, r71625);
double r71627 = r71598 * r71626;
double r71628 = r71597 * r71627;
return r71628;
}



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.9
Simplified24.9
Final simplification24.9
herbie shell --seed 2020064
(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))))))))))