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)\left(\tan^{-1}_* \frac{\sqrt{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}}}{\sqrt{1 - \left(\left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)} \cdot \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)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}\right) \cdot \sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)} + {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}} \cdot 2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3074749 = R;
double r3074750 = 2.0;
double r3074751 = phi1;
double r3074752 = phi2;
double r3074753 = r3074751 - r3074752;
double r3074754 = r3074753 / r3074750;
double r3074755 = sin(r3074754);
double r3074756 = pow(r3074755, r3074750);
double r3074757 = cos(r3074751);
double r3074758 = cos(r3074752);
double r3074759 = r3074757 * r3074758;
double r3074760 = lambda1;
double r3074761 = lambda2;
double r3074762 = r3074760 - r3074761;
double r3074763 = r3074762 / r3074750;
double r3074764 = sin(r3074763);
double r3074765 = r3074759 * r3074764;
double r3074766 = r3074765 * r3074764;
double r3074767 = r3074756 + r3074766;
double r3074768 = sqrt(r3074767);
double r3074769 = 1.0;
double r3074770 = r3074769 - r3074767;
double r3074771 = sqrt(r3074770);
double r3074772 = atan2(r3074768, r3074771);
double r3074773 = r3074750 * r3074772;
double r3074774 = r3074749 * r3074773;
return r3074774;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3074775 = lambda1;
double r3074776 = lambda2;
double r3074777 = r3074775 - r3074776;
double r3074778 = 2.0;
double r3074779 = r3074777 / r3074778;
double r3074780 = sin(r3074779);
double r3074781 = phi2;
double r3074782 = cos(r3074781);
double r3074783 = phi1;
double r3074784 = cos(r3074783);
double r3074785 = r3074782 * r3074784;
double r3074786 = r3074785 * r3074780;
double r3074787 = r3074780 * r3074786;
double r3074788 = r3074783 - r3074781;
double r3074789 = r3074788 / r3074778;
double r3074790 = sin(r3074789);
double r3074791 = pow(r3074790, r3074778);
double r3074792 = r3074787 + r3074791;
double r3074793 = sqrt(r3074792);
double r3074794 = 1.0;
double r3074795 = cbrt(r3074780);
double r3074796 = r3074795 * r3074795;
double r3074797 = r3074795 * r3074796;
double r3074798 = r3074797 * r3074780;
double r3074799 = r3074780 * r3074798;
double r3074800 = cbrt(r3074799);
double r3074801 = r3074785 * r3074800;
double r3074802 = exp(r3074780);
double r3074803 = log(r3074802);
double r3074804 = r3074780 * r3074803;
double r3074805 = r3074780 * r3074804;
double r3074806 = cbrt(r3074805);
double r3074807 = r3074801 * r3074806;
double r3074808 = r3074807 + r3074791;
double r3074809 = r3074794 - r3074808;
double r3074810 = sqrt(r3074809);
double r3074811 = atan2(r3074793, r3074810);
double r3074812 = r3074811 * r3074778;
double r3074813 = R;
double r3074814 = r3074812 * r3074813;
return r3074814;
}



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
rmApplied add-cube-cbrt24.5
rmApplied add-cbrt-cube24.5
rmApplied add-log-exp24.5
Final simplification24.5
herbie shell --seed 2019192
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* R (* 2.0 (atan2 (sqrt (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))) (sqrt (- 1.0 (+ (pow (sin (/ (- phi1 phi2) 2.0)) 2.0) (* (* (* (cos phi1) (cos phi2)) (sin (/ (- lambda1 lambda2) 2.0))) (sin (/ (- lambda1 lambda2) 2.0))))))))))