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(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \sqrt[3]{\sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}}\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 r67691 = R;
double r67692 = 2.0;
double r67693 = phi1;
double r67694 = phi2;
double r67695 = r67693 - r67694;
double r67696 = r67695 / r67692;
double r67697 = sin(r67696);
double r67698 = pow(r67697, r67692);
double r67699 = cos(r67693);
double r67700 = cos(r67694);
double r67701 = r67699 * r67700;
double r67702 = lambda1;
double r67703 = lambda2;
double r67704 = r67702 - r67703;
double r67705 = r67704 / r67692;
double r67706 = sin(r67705);
double r67707 = r67701 * r67706;
double r67708 = r67707 * r67706;
double r67709 = r67698 + r67708;
double r67710 = sqrt(r67709);
double r67711 = 1.0;
double r67712 = r67711 - r67709;
double r67713 = sqrt(r67712);
double r67714 = atan2(r67710, r67713);
double r67715 = r67692 * r67714;
double r67716 = r67691 * r67715;
return r67716;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r67717 = R;
double r67718 = 2.0;
double r67719 = phi1;
double r67720 = phi2;
double r67721 = r67719 - r67720;
double r67722 = r67721 / r67718;
double r67723 = sin(r67722);
double r67724 = pow(r67723, r67718);
double r67725 = cos(r67719);
double r67726 = cos(r67720);
double r67727 = r67725 * r67726;
double r67728 = lambda1;
double r67729 = lambda2;
double r67730 = r67728 - r67729;
double r67731 = r67730 / r67718;
double r67732 = sin(r67731);
double r67733 = r67727 * r67732;
double r67734 = r67733 * r67732;
double r67735 = r67724 + r67734;
double r67736 = sqrt(r67735);
double r67737 = 1.0;
double r67738 = r67732 * r67732;
double r67739 = cbrt(r67738);
double r67740 = 3.0;
double r67741 = pow(r67732, r67740);
double r67742 = cbrt(r67741);
double r67743 = cbrt(r67742);
double r67744 = r67739 * r67743;
double r67745 = pow(r67744, r67740);
double r67746 = cbrt(r67745);
double r67747 = r67727 * r67746;
double r67748 = r67747 * r67732;
double r67749 = r67724 + r67748;
double r67750 = r67737 - r67749;
double r67751 = sqrt(r67750);
double r67752 = atan2(r67736, r67751);
double r67753 = r67718 * r67752;
double r67754 = r67717 * r67753;
return r67754;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.5
rmApplied add-cbrt-cube24.5
Simplified24.5
rmApplied add-cube-cbrt24.5
Simplified24.5
rmApplied add-cbrt-cube24.5
Simplified24.5
Final simplification24.5
herbie shell --seed 2019297
(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))))))))))