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{\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \mathsf{expm1}\left(\mathsf{log1p}\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)\right) \cdot \sqrt[3]{{\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}^{3}}, {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}} \cdot R\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r108971 = R;
double r108972 = 2.0;
double r108973 = phi1;
double r108974 = phi2;
double r108975 = r108973 - r108974;
double r108976 = r108975 / r108972;
double r108977 = sin(r108976);
double r108978 = pow(r108977, r108972);
double r108979 = cos(r108973);
double r108980 = cos(r108974);
double r108981 = r108979 * r108980;
double r108982 = lambda1;
double r108983 = lambda2;
double r108984 = r108982 - r108983;
double r108985 = r108984 / r108972;
double r108986 = sin(r108985);
double r108987 = r108981 * r108986;
double r108988 = r108987 * r108986;
double r108989 = r108978 + r108988;
double r108990 = sqrt(r108989);
double r108991 = 1.0;
double r108992 = r108991 - r108989;
double r108993 = sqrt(r108992);
double r108994 = atan2(r108990, r108993);
double r108995 = r108972 * r108994;
double r108996 = r108971 * r108995;
return r108996;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r108997 = 2.0;
double r108998 = phi1;
double r108999 = cos(r108998);
double r109000 = phi2;
double r109001 = cos(r109000);
double r109002 = r108999 * r109001;
double r109003 = lambda1;
double r109004 = lambda2;
double r109005 = r109003 - r109004;
double r109006 = r109005 / r108997;
double r109007 = sin(r109006);
double r109008 = r109007 * r109007;
double r109009 = r108998 - r109000;
double r109010 = r109009 / r108997;
double r109011 = sin(r109010);
double r109012 = pow(r109011, r108997);
double r109013 = fma(r109002, r109008, r109012);
double r109014 = sqrt(r109013);
double r109015 = 1.0;
double r109016 = exp(r109007);
double r109017 = log(r109016);
double r109018 = log1p(r109017);
double r109019 = expm1(r109018);
double r109020 = 3.0;
double r109021 = pow(r109007, r109020);
double r109022 = cbrt(r109021);
double r109023 = r109019 * r109022;
double r109024 = fma(r109002, r109023, r109012);
double r109025 = r109015 - r109024;
double r109026 = sqrt(r109025);
double r109027 = atan2(r109014, r109026);
double r109028 = R;
double r109029 = r109027 * r109028;
double r109030 = r108997 * r109029;
return r109030;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.6
Simplified24.6
rmApplied add-cbrt-cube24.6
Simplified24.6
rmApplied expm1-log1p-u24.6
rmApplied add-log-exp24.6
Final simplification24.6
herbie shell --seed 2020047 +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))))))))))