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 r86679 = R;
double r86680 = 2.0;
double r86681 = phi1;
double r86682 = phi2;
double r86683 = r86681 - r86682;
double r86684 = r86683 / r86680;
double r86685 = sin(r86684);
double r86686 = pow(r86685, r86680);
double r86687 = cos(r86681);
double r86688 = cos(r86682);
double r86689 = r86687 * r86688;
double r86690 = lambda1;
double r86691 = lambda2;
double r86692 = r86690 - r86691;
double r86693 = r86692 / r86680;
double r86694 = sin(r86693);
double r86695 = r86689 * r86694;
double r86696 = r86695 * r86694;
double r86697 = r86686 + r86696;
double r86698 = sqrt(r86697);
double r86699 = 1.0;
double r86700 = r86699 - r86697;
double r86701 = sqrt(r86700);
double r86702 = atan2(r86698, r86701);
double r86703 = r86680 * r86702;
double r86704 = r86679 * r86703;
return r86704;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r86705 = R;
double r86706 = 2.0;
double r86707 = phi1;
double r86708 = phi2;
double r86709 = r86707 - r86708;
double r86710 = r86709 / r86706;
double r86711 = sin(r86710);
double r86712 = pow(r86711, r86706);
double r86713 = cos(r86707);
double r86714 = cos(r86708);
double r86715 = r86713 * r86714;
double r86716 = lambda1;
double r86717 = lambda2;
double r86718 = r86716 - r86717;
double r86719 = r86718 / r86706;
double r86720 = sin(r86719);
double r86721 = r86715 * r86720;
double r86722 = r86721 * r86720;
double r86723 = r86712 + r86722;
double r86724 = sqrt(r86723);
double r86725 = 1.0;
double r86726 = 3.0;
double r86727 = pow(r86720, r86726);
double r86728 = cbrt(r86727);
double r86729 = r86715 * r86728;
double r86730 = r86729 * r86728;
double r86731 = r86712 + r86730;
double r86732 = r86725 - r86731;
double r86733 = sqrt(r86732);
double r86734 = atan2(r86724, r86733);
double r86735 = r86706 * r86734;
double r86736 = r86705 * r86735;
return r86736;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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