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 \left(\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\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 r102692 = R;
double r102693 = 2.0;
double r102694 = phi1;
double r102695 = phi2;
double r102696 = r102694 - r102695;
double r102697 = r102696 / r102693;
double r102698 = sin(r102697);
double r102699 = pow(r102698, r102693);
double r102700 = cos(r102694);
double r102701 = cos(r102695);
double r102702 = r102700 * r102701;
double r102703 = lambda1;
double r102704 = lambda2;
double r102705 = r102703 - r102704;
double r102706 = r102705 / r102693;
double r102707 = sin(r102706);
double r102708 = r102702 * r102707;
double r102709 = r102708 * r102707;
double r102710 = r102699 + r102709;
double r102711 = sqrt(r102710);
double r102712 = 1.0;
double r102713 = r102712 - r102710;
double r102714 = sqrt(r102713);
double r102715 = atan2(r102711, r102714);
double r102716 = r102693 * r102715;
double r102717 = r102692 * r102716;
return r102717;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r102718 = R;
double r102719 = 2.0;
double r102720 = phi1;
double r102721 = r102720 / r102719;
double r102722 = sin(r102721);
double r102723 = phi2;
double r102724 = r102723 / r102719;
double r102725 = cos(r102724);
double r102726 = r102722 * r102725;
double r102727 = cos(r102721);
double r102728 = sin(r102724);
double r102729 = r102727 * r102728;
double r102730 = r102726 - r102729;
double r102731 = pow(r102730, r102719);
double r102732 = cos(r102720);
double r102733 = cos(r102723);
double r102734 = r102732 * r102733;
double r102735 = lambda1;
double r102736 = lambda2;
double r102737 = r102735 - r102736;
double r102738 = r102737 / r102719;
double r102739 = sin(r102738);
double r102740 = cbrt(r102739);
double r102741 = r102740 * r102740;
double r102742 = r102741 * r102740;
double r102743 = r102734 * r102742;
double r102744 = r102743 * r102739;
double r102745 = r102731 + r102744;
double r102746 = sqrt(r102745);
double r102747 = 1.0;
double r102748 = r102734 * r102739;
double r102749 = r102748 * r102739;
double r102750 = r102731 + r102749;
double r102751 = r102747 - r102750;
double r102752 = sqrt(r102751);
double r102753 = atan2(r102746, r102752);
double r102754 = r102719 * r102753;
double r102755 = r102718 * r102754;
return r102755;
}



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 div-sub24.6
Applied sin-diff24.0
rmApplied div-sub24.0
Applied sin-diff14.6
rmApplied add-cube-cbrt14.7
Final simplification14.7
herbie shell --seed 2019353
(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))))))))))