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(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({\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2} + \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}\right)}}\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2505991 = R;
double r2505992 = 2.0;
double r2505993 = phi1;
double r2505994 = phi2;
double r2505995 = r2505993 - r2505994;
double r2505996 = r2505995 / r2505992;
double r2505997 = sin(r2505996);
double r2505998 = pow(r2505997, r2505992);
double r2505999 = cos(r2505993);
double r2506000 = cos(r2505994);
double r2506001 = r2505999 * r2506000;
double r2506002 = lambda1;
double r2506003 = lambda2;
double r2506004 = r2506002 - r2506003;
double r2506005 = r2506004 / r2505992;
double r2506006 = sin(r2506005);
double r2506007 = r2506001 * r2506006;
double r2506008 = r2506007 * r2506006;
double r2506009 = r2505998 + r2506008;
double r2506010 = sqrt(r2506009);
double r2506011 = 1.0;
double r2506012 = r2506011 - r2506009;
double r2506013 = sqrt(r2506012);
double r2506014 = atan2(r2506010, r2506013);
double r2506015 = r2505992 * r2506014;
double r2506016 = r2505991 * r2506015;
return r2506016;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r2506017 = 2.0;
double r2506018 = lambda1;
double r2506019 = lambda2;
double r2506020 = r2506018 - r2506019;
double r2506021 = r2506020 / r2506017;
double r2506022 = sin(r2506021);
double r2506023 = phi2;
double r2506024 = cos(r2506023);
double r2506025 = phi1;
double r2506026 = cos(r2506025);
double r2506027 = r2506024 * r2506026;
double r2506028 = r2506027 * r2506022;
double r2506029 = r2506022 * r2506028;
double r2506030 = r2506025 - r2506023;
double r2506031 = r2506030 / r2506017;
double r2506032 = sin(r2506031);
double r2506033 = pow(r2506032, r2506017);
double r2506034 = r2506029 + r2506033;
double r2506035 = sqrt(r2506034);
double r2506036 = 1.0;
double r2506037 = r2506022 * r2506022;
double r2506038 = r2506022 * r2506037;
double r2506039 = cbrt(r2506038);
double r2506040 = r2506028 * r2506039;
double r2506041 = r2506033 + r2506040;
double r2506042 = r2506036 - r2506041;
double r2506043 = sqrt(r2506042);
double r2506044 = atan2(r2506035, r2506043);
double r2506045 = r2506017 * r2506044;
double r2506046 = R;
double r2506047 = r2506045 * r2506046;
return r2506047;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.1
rmApplied add-cbrt-cube24.2
Final simplification24.2
herbie shell --seed 2019149 +o rules:numerics
(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))))))))))