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(\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} + \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \left(\left(\cos \phi_2 \cdot \cos \phi_1\right) \cdot \frac{\sqrt[3]{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) - \cos \left(\frac{\lambda_1 - \lambda_2}{2} + \frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}}{\sqrt[3]{2}}\right)\right)}} \cdot 2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3487032 = R;
double r3487033 = 2.0;
double r3487034 = phi1;
double r3487035 = phi2;
double r3487036 = r3487034 - r3487035;
double r3487037 = r3487036 / r3487033;
double r3487038 = sin(r3487037);
double r3487039 = pow(r3487038, r3487033);
double r3487040 = cos(r3487034);
double r3487041 = cos(r3487035);
double r3487042 = r3487040 * r3487041;
double r3487043 = lambda1;
double r3487044 = lambda2;
double r3487045 = r3487043 - r3487044;
double r3487046 = r3487045 / r3487033;
double r3487047 = sin(r3487046);
double r3487048 = r3487042 * r3487047;
double r3487049 = r3487048 * r3487047;
double r3487050 = r3487039 + r3487049;
double r3487051 = sqrt(r3487050);
double r3487052 = 1.0;
double r3487053 = r3487052 - r3487050;
double r3487054 = sqrt(r3487053);
double r3487055 = atan2(r3487051, r3487054);
double r3487056 = r3487033 * r3487055;
double r3487057 = r3487032 * r3487056;
return r3487057;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r3487058 = lambda1;
double r3487059 = lambda2;
double r3487060 = r3487058 - r3487059;
double r3487061 = 2.0;
double r3487062 = r3487060 / r3487061;
double r3487063 = sin(r3487062);
double r3487064 = phi2;
double r3487065 = cos(r3487064);
double r3487066 = phi1;
double r3487067 = cos(r3487066);
double r3487068 = r3487065 * r3487067;
double r3487069 = r3487068 * r3487063;
double r3487070 = r3487063 * r3487069;
double r3487071 = r3487066 - r3487064;
double r3487072 = r3487071 / r3487061;
double r3487073 = sin(r3487072);
double r3487074 = pow(r3487073, r3487061);
double r3487075 = r3487070 + r3487074;
double r3487076 = sqrt(r3487075);
double r3487077 = 1.0;
double r3487078 = r3487062 + r3487062;
double r3487079 = cos(r3487078);
double r3487080 = r3487079 * r3487063;
double r3487081 = r3487063 - r3487080;
double r3487082 = cbrt(r3487081);
double r3487083 = 2.0;
double r3487084 = cbrt(r3487083);
double r3487085 = r3487082 / r3487084;
double r3487086 = r3487068 * r3487085;
double r3487087 = r3487063 * r3487086;
double r3487088 = r3487074 + r3487087;
double r3487089 = r3487077 - r3487088;
double r3487090 = sqrt(r3487089);
double r3487091 = atan2(r3487076, r3487090);
double r3487092 = r3487091 * r3487061;
double r3487093 = R;
double r3487094 = r3487092 * r3487093;
return r3487094;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.8
rmApplied add-cbrt-cube24.8
rmApplied log1p-expm1-u24.8
rmApplied sin-mult24.8
Applied associate-*l/24.8
Applied cbrt-div24.8
Simplified24.8
Final simplification24.8
herbie shell --seed 2019171 +o rules:numerics
(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))))))))))