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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right) \cdot \sqrt[3]{{\left(\sqrt[3]{{\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)}^{3}}\right)}^{3}}\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80911 = R;
double r80912 = 2.0;
double r80913 = phi1;
double r80914 = phi2;
double r80915 = r80913 - r80914;
double r80916 = r80915 / r80912;
double r80917 = sin(r80916);
double r80918 = pow(r80917, r80912);
double r80919 = cos(r80913);
double r80920 = cos(r80914);
double r80921 = r80919 * r80920;
double r80922 = lambda1;
double r80923 = lambda2;
double r80924 = r80922 - r80923;
double r80925 = r80924 / r80912;
double r80926 = sin(r80925);
double r80927 = r80921 * r80926;
double r80928 = r80927 * r80926;
double r80929 = r80918 + r80928;
double r80930 = sqrt(r80929);
double r80931 = 1.0;
double r80932 = r80931 - r80929;
double r80933 = sqrt(r80932);
double r80934 = atan2(r80930, r80933);
double r80935 = r80912 * r80934;
double r80936 = r80911 * r80935;
return r80936;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r80937 = R;
double r80938 = 2.0;
double r80939 = phi1;
double r80940 = phi2;
double r80941 = r80939 - r80940;
double r80942 = r80941 / r80938;
double r80943 = sin(r80942);
double r80944 = pow(r80943, r80938);
double r80945 = cos(r80939);
double r80946 = cos(r80940);
double r80947 = r80945 * r80946;
double r80948 = lambda1;
double r80949 = lambda2;
double r80950 = r80948 - r80949;
double r80951 = r80950 / r80938;
double r80952 = sin(r80951);
double r80953 = r80947 * r80952;
double r80954 = r80953 * r80952;
double r80955 = r80944 + r80954;
double r80956 = sqrt(r80955);
double r80957 = 1.0;
double r80958 = exp(r80952);
double r80959 = log(r80958);
double r80960 = 3.0;
double r80961 = pow(r80959, r80960);
double r80962 = cbrt(r80961);
double r80963 = pow(r80962, r80960);
double r80964 = cbrt(r80963);
double r80965 = r80953 * r80964;
double r80966 = r80944 + r80965;
double r80967 = r80957 - r80966;
double r80968 = sqrt(r80967);
double r80969 = atan2(r80956, r80968);
double r80970 = r80938 * r80969;
double r80971 = r80937 * r80970;
return r80971;
}



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