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{{\left(\cos \left(\frac{\phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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 \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)}}{\sqrt{1 - \left({\left(\cos \left(\frac{\phi_2}{2}\right) \cdot \sin \left(\frac{\phi_1}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\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 \mathsf{expm1}\left(\mathsf{log1p}\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)\right)\right)}} \cdot 2\right) \cdot Rdouble f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4131259 = R;
double r4131260 = 2.0;
double r4131261 = phi1;
double r4131262 = phi2;
double r4131263 = r4131261 - r4131262;
double r4131264 = r4131263 / r4131260;
double r4131265 = sin(r4131264);
double r4131266 = pow(r4131265, r4131260);
double r4131267 = cos(r4131261);
double r4131268 = cos(r4131262);
double r4131269 = r4131267 * r4131268;
double r4131270 = lambda1;
double r4131271 = lambda2;
double r4131272 = r4131270 - r4131271;
double r4131273 = r4131272 / r4131260;
double r4131274 = sin(r4131273);
double r4131275 = r4131269 * r4131274;
double r4131276 = r4131275 * r4131274;
double r4131277 = r4131266 + r4131276;
double r4131278 = sqrt(r4131277);
double r4131279 = 1.0;
double r4131280 = r4131279 - r4131277;
double r4131281 = sqrt(r4131280);
double r4131282 = atan2(r4131278, r4131281);
double r4131283 = r4131260 * r4131282;
double r4131284 = r4131259 * r4131283;
return r4131284;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r4131285 = phi2;
double r4131286 = 2.0;
double r4131287 = r4131285 / r4131286;
double r4131288 = cos(r4131287);
double r4131289 = phi1;
double r4131290 = r4131289 / r4131286;
double r4131291 = sin(r4131290);
double r4131292 = r4131288 * r4131291;
double r4131293 = cos(r4131290);
double r4131294 = sin(r4131287);
double r4131295 = r4131293 * r4131294;
double r4131296 = r4131292 - r4131295;
double r4131297 = pow(r4131296, r4131286);
double r4131298 = lambda1;
double r4131299 = lambda2;
double r4131300 = r4131298 - r4131299;
double r4131301 = r4131300 / r4131286;
double r4131302 = sin(r4131301);
double r4131303 = cos(r4131285);
double r4131304 = cos(r4131289);
double r4131305 = r4131303 * r4131304;
double r4131306 = r4131305 * r4131302;
double r4131307 = r4131302 * r4131306;
double r4131308 = r4131297 + r4131307;
double r4131309 = sqrt(r4131308);
double r4131310 = 1.0;
double r4131311 = exp(r4131302);
double r4131312 = log(r4131311);
double r4131313 = log1p(r4131312);
double r4131314 = expm1(r4131313);
double r4131315 = r4131306 * r4131314;
double r4131316 = r4131297 + r4131315;
double r4131317 = r4131310 - r4131316;
double r4131318 = sqrt(r4131317);
double r4131319 = atan2(r4131309, r4131318);
double r4131320 = r4131319 * r4131286;
double r4131321 = R;
double r4131322 = r4131320 * r4131321;
return r4131322;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.4
rmApplied div-sub24.4
Applied sin-diff23.8
rmApplied div-sub23.8
Applied sin-diff13.7
rmApplied expm1-log1p-u13.7
rmApplied add-log-exp13.7
Final simplification13.7
herbie shell --seed 2019163 +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))))))))))