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{\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(\log \left(e^{\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 \left(\sin \left(\frac{\lambda_1 - \lambda_2}{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) \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}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2560807 = R;
double r2560808 = 2.0;
double r2560809 = phi1;
double r2560810 = phi2;
double r2560811 = r2560809 - r2560810;
double r2560812 = r2560811 / r2560808;
double r2560813 = sin(r2560812);
double r2560814 = pow(r2560813, r2560808);
double r2560815 = cos(r2560809);
double r2560816 = cos(r2560810);
double r2560817 = r2560815 * r2560816;
double r2560818 = lambda1;
double r2560819 = lambda2;
double r2560820 = r2560818 - r2560819;
double r2560821 = r2560820 / r2560808;
double r2560822 = sin(r2560821);
double r2560823 = r2560817 * r2560822;
double r2560824 = r2560823 * r2560822;
double r2560825 = r2560814 + r2560824;
double r2560826 = sqrt(r2560825);
double r2560827 = 1.0;
double r2560828 = r2560827 - r2560825;
double r2560829 = sqrt(r2560828);
double r2560830 = atan2(r2560826, r2560829);
double r2560831 = r2560808 * r2560830;
double r2560832 = r2560807 * r2560831;
return r2560832;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2560833 = R;
double r2560834 = 2.0;
double r2560835 = lambda1;
double r2560836 = lambda2;
double r2560837 = r2560835 - r2560836;
double r2560838 = r2560837 / r2560834;
double r2560839 = sin(r2560838);
double r2560840 = phi2;
double r2560841 = cos(r2560840);
double r2560842 = phi1;
double r2560843 = cos(r2560842);
double r2560844 = r2560841 * r2560843;
double r2560845 = r2560844 * r2560839;
double r2560846 = r2560839 * r2560845;
double r2560847 = r2560842 - r2560840;
double r2560848 = r2560847 / r2560834;
double r2560849 = sin(r2560848);
double r2560850 = pow(r2560849, r2560834);
double r2560851 = r2560846 + r2560850;
double r2560852 = sqrt(r2560851);
double r2560853 = 1.0;
double r2560854 = r2560839 * r2560839;
double r2560855 = r2560839 * r2560854;
double r2560856 = cbrt(r2560855);
double r2560857 = r2560856 * r2560839;
double r2560858 = r2560839 * r2560857;
double r2560859 = cbrt(r2560858);
double r2560860 = exp(r2560859);
double r2560861 = log(r2560860);
double r2560862 = r2560861 * r2560845;
double r2560863 = r2560862 + r2560850;
double r2560864 = r2560853 - r2560863;
double r2560865 = sqrt(r2560864);
double r2560866 = atan2(r2560852, r2560865);
double r2560867 = r2560834 * r2560866;
double r2560868 = r2560833 * r2560867;
return r2560868;
}



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-log-exp24.5
rmApplied add-cbrt-cube24.5
rmApplied add-cbrt-cube24.5
Final simplification24.5
herbie shell --seed 2019172
(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))))))))))