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 \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)}}{\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 r103647 = R;
double r103648 = 2.0;
double r103649 = phi1;
double r103650 = phi2;
double r103651 = r103649 - r103650;
double r103652 = r103651 / r103648;
double r103653 = sin(r103652);
double r103654 = pow(r103653, r103648);
double r103655 = cos(r103649);
double r103656 = cos(r103650);
double r103657 = r103655 * r103656;
double r103658 = lambda1;
double r103659 = lambda2;
double r103660 = r103658 - r103659;
double r103661 = r103660 / r103648;
double r103662 = sin(r103661);
double r103663 = r103657 * r103662;
double r103664 = r103663 * r103662;
double r103665 = r103654 + r103664;
double r103666 = sqrt(r103665);
double r103667 = 1.0;
double r103668 = r103667 - r103665;
double r103669 = sqrt(r103668);
double r103670 = atan2(r103666, r103669);
double r103671 = r103648 * r103670;
double r103672 = r103647 * r103671;
return r103672;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r103673 = R;
double r103674 = 2.0;
double r103675 = phi1;
double r103676 = r103675 / r103674;
double r103677 = sin(r103676);
double r103678 = phi2;
double r103679 = r103678 / r103674;
double r103680 = cos(r103679);
double r103681 = r103677 * r103680;
double r103682 = cos(r103676);
double r103683 = sin(r103679);
double r103684 = r103682 * r103683;
double r103685 = r103681 - r103684;
double r103686 = pow(r103685, r103674);
double r103687 = cos(r103675);
double r103688 = cos(r103678);
double r103689 = r103687 * r103688;
double r103690 = lambda1;
double r103691 = lambda2;
double r103692 = r103690 - r103691;
double r103693 = r103692 / r103674;
double r103694 = sin(r103693);
double r103695 = 3.0;
double r103696 = pow(r103694, r103695);
double r103697 = cbrt(r103696);
double r103698 = r103689 * r103697;
double r103699 = r103698 * r103694;
double r103700 = r103686 + r103699;
double r103701 = sqrt(r103700);
double r103702 = 1.0;
double r103703 = r103689 * r103694;
double r103704 = r103703 * r103694;
double r103705 = r103686 + r103704;
double r103706 = r103702 - r103705;
double r103707 = sqrt(r103706);
double r103708 = atan2(r103701, r103707);
double r103709 = r103674 * r103708;
double r103710 = r103673 * r103709;
return r103710;
}



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 div-sub24.0
Applied sin-diff23.5
rmApplied div-sub23.5
Applied sin-diff13.9
rmApplied add-cbrt-cube14.2
Simplified14.2
Final simplification14.2
herbie shell --seed 2020024
(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))))))))))