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 R\right) \cdot \tan^{-1}_* \frac{\sqrt{\mathsf{fma}\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right), \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right) \cdot \cos \phi_1\right) \cdot \cos \phi_2, {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), \left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right) \cdot \cos \phi_1\right) \cdot \cos \phi_2, {\left(\sin \left(\frac{\phi_1 - \phi_2}{2}\right)\right)}^{2}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r96080 = R;
double r96081 = 2.0;
double r96082 = phi1;
double r96083 = phi2;
double r96084 = r96082 - r96083;
double r96085 = r96084 / r96081;
double r96086 = sin(r96085);
double r96087 = pow(r96086, r96081);
double r96088 = cos(r96082);
double r96089 = cos(r96083);
double r96090 = r96088 * r96089;
double r96091 = lambda1;
double r96092 = lambda2;
double r96093 = r96091 - r96092;
double r96094 = r96093 / r96081;
double r96095 = sin(r96094);
double r96096 = r96090 * r96095;
double r96097 = r96096 * r96095;
double r96098 = r96087 + r96097;
double r96099 = sqrt(r96098);
double r96100 = 1.0;
double r96101 = r96100 - r96098;
double r96102 = sqrt(r96101);
double r96103 = atan2(r96099, r96102);
double r96104 = r96081 * r96103;
double r96105 = r96080 * r96104;
return r96105;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r96106 = 2.0;
double r96107 = R;
double r96108 = r96106 * r96107;
double r96109 = lambda1;
double r96110 = lambda2;
double r96111 = r96109 - r96110;
double r96112 = r96111 / r96106;
double r96113 = sin(r96112);
double r96114 = log1p(r96113);
double r96115 = expm1(r96114);
double r96116 = expm1(r96113);
double r96117 = log1p(r96116);
double r96118 = phi1;
double r96119 = cos(r96118);
double r96120 = r96117 * r96119;
double r96121 = phi2;
double r96122 = cos(r96121);
double r96123 = r96120 * r96122;
double r96124 = r96118 - r96121;
double r96125 = r96124 / r96106;
double r96126 = sin(r96125);
double r96127 = pow(r96126, r96106);
double r96128 = fma(r96115, r96123, r96127);
double r96129 = sqrt(r96128);
double r96130 = 1.0;
double r96131 = r96113 * r96119;
double r96132 = r96131 * r96122;
double r96133 = fma(r96113, r96132, r96127);
double r96134 = r96130 - r96133;
double r96135 = sqrt(r96134);
double r96136 = atan2(r96129, r96135);
double r96137 = r96108 * r96136;
return r96137;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.7
Simplified24.7
rmApplied expm1-log1p-u24.7
rmApplied log1p-expm1-u24.7
Final simplification24.7
herbie shell --seed 2019194 +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))))))))))