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)2 \cdot \left(\tan^{-1}_* \frac{\sqrt{\sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sqrt[3]{\sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)} + \left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_2\right) \cdot \left(\cos \phi_1 \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}{\sqrt{\cos \left(\frac{\phi_1 - \phi_2}{2}\right) \cdot \cos \left(\frac{\phi_1 - \phi_2}{2}\right) - \left(\cos \phi_1 \cdot \log \left(e^{\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)}\right)\right) \cdot \left(\cos \phi_2 \cdot \left(\cos \left(\frac{\lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1}{2}\right) - \cos \left(\frac{\lambda_1}{2}\right) \cdot \sin \left(\frac{\lambda_2}{2}\right)\right)\right)}} \cdot R\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3253806 = R;
double r3253807 = 2.0;
double r3253808 = phi1;
double r3253809 = phi2;
double r3253810 = r3253808 - r3253809;
double r3253811 = r3253810 / r3253807;
double r3253812 = sin(r3253811);
double r3253813 = pow(r3253812, r3253807);
double r3253814 = cos(r3253808);
double r3253815 = cos(r3253809);
double r3253816 = r3253814 * r3253815;
double r3253817 = lambda1;
double r3253818 = lambda2;
double r3253819 = r3253817 - r3253818;
double r3253820 = r3253819 / r3253807;
double r3253821 = sin(r3253820);
double r3253822 = r3253816 * r3253821;
double r3253823 = r3253822 * r3253821;
double r3253824 = r3253813 + r3253823;
double r3253825 = sqrt(r3253824);
double r3253826 = 1.0;
double r3253827 = r3253826 - r3253824;
double r3253828 = sqrt(r3253827);
double r3253829 = atan2(r3253825, r3253828);
double r3253830 = r3253807 * r3253829;
double r3253831 = r3253806 * r3253830;
return r3253831;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3253832 = 2.0;
double r3253833 = phi1;
double r3253834 = phi2;
double r3253835 = r3253833 - r3253834;
double r3253836 = r3253835 / r3253832;
double r3253837 = sin(r3253836);
double r3253838 = r3253837 * r3253837;
double r3253839 = r3253837 * r3253838;
double r3253840 = cbrt(r3253839);
double r3253841 = r3253837 * r3253840;
double r3253842 = lambda1;
double r3253843 = lambda2;
double r3253844 = r3253842 - r3253843;
double r3253845 = r3253844 / r3253832;
double r3253846 = sin(r3253845);
double r3253847 = cos(r3253834);
double r3253848 = r3253846 * r3253847;
double r3253849 = cos(r3253833);
double r3253850 = r3253849 * r3253846;
double r3253851 = r3253848 * r3253850;
double r3253852 = r3253841 + r3253851;
double r3253853 = sqrt(r3253852);
double r3253854 = cos(r3253836);
double r3253855 = r3253854 * r3253854;
double r3253856 = r3253843 / r3253832;
double r3253857 = cos(r3253856);
double r3253858 = r3253842 / r3253832;
double r3253859 = sin(r3253858);
double r3253860 = r3253857 * r3253859;
double r3253861 = cos(r3253858);
double r3253862 = sin(r3253856);
double r3253863 = r3253861 * r3253862;
double r3253864 = r3253860 - r3253863;
double r3253865 = exp(r3253864);
double r3253866 = log(r3253865);
double r3253867 = r3253849 * r3253866;
double r3253868 = r3253847 * r3253864;
double r3253869 = r3253867 * r3253868;
double r3253870 = r3253855 - r3253869;
double r3253871 = sqrt(r3253870);
double r3253872 = atan2(r3253853, r3253871);
double r3253873 = R;
double r3253874 = r3253872 * r3253873;
double r3253875 = r3253832 * r3253874;
return r3253875;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
Simplified24.3
rmApplied add-log-exp24.3
rmApplied div-sub24.3
Applied sin-diff24.5
rmApplied div-sub24.5
Applied sin-diff24.1
rmApplied add-cbrt-cube24.3
Final simplification24.3
herbie shell --seed 2019163
(FPCore (R lambda1 lambda2 phi1 phi2)
:name "Distance on a great circle"
(* 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))))))))))