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 - \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 \left({\left(\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)}^{2} \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)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r60880 = R;
double r60881 = 2.0;
double r60882 = phi1;
double r60883 = phi2;
double r60884 = r60882 - r60883;
double r60885 = r60884 / r60881;
double r60886 = sin(r60885);
double r60887 = pow(r60886, r60881);
double r60888 = cos(r60882);
double r60889 = cos(r60883);
double r60890 = r60888 * r60889;
double r60891 = lambda1;
double r60892 = lambda2;
double r60893 = r60891 - r60892;
double r60894 = r60893 / r60881;
double r60895 = sin(r60894);
double r60896 = r60890 * r60895;
double r60897 = r60896 * r60895;
double r60898 = r60887 + r60897;
double r60899 = sqrt(r60898);
double r60900 = 1.0;
double r60901 = r60900 - r60898;
double r60902 = sqrt(r60901);
double r60903 = atan2(r60899, r60902);
double r60904 = r60881 * r60903;
double r60905 = r60880 * r60904;
return r60905;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r60906 = R;
double r60907 = 2.0;
double r60908 = phi1;
double r60909 = phi2;
double r60910 = r60908 - r60909;
double r60911 = r60910 / r60907;
double r60912 = sin(r60911);
double r60913 = pow(r60912, r60907);
double r60914 = cos(r60908);
double r60915 = cos(r60909);
double r60916 = r60914 * r60915;
double r60917 = lambda1;
double r60918 = lambda2;
double r60919 = r60917 - r60918;
double r60920 = r60919 / r60907;
double r60921 = sin(r60920);
double r60922 = r60916 * r60921;
double r60923 = r60922 * r60921;
double r60924 = r60913 + r60923;
double r60925 = sqrt(r60924);
double r60926 = 1.0;
double r60927 = cbrt(r60921);
double r60928 = 2.0;
double r60929 = pow(r60927, r60928);
double r60930 = r60929 * r60927;
double r60931 = r60916 * r60930;
double r60932 = r60931 * r60921;
double r60933 = r60913 + r60932;
double r60934 = r60926 - r60933;
double r60935 = sqrt(r60934);
double r60936 = atan2(r60925, r60935);
double r60937 = r60907 * r60936;
double r60938 = r60906 * r60937;
return r60938;
}



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.6
Simplified24.6
rmApplied add-cube-cbrt24.6
Applied unpow-prod-down24.6
Applied cbrt-prod24.6
Simplified24.6
Simplified24.6
Final simplification24.6
herbie shell --seed 2019304 +o rules:numerics
(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))))))))))