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(R \cdot 2\right) \cdot \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}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2}\right)}}{\sqrt{1 - \mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \mathsf{log1p}\left(\mathsf{expm1}\left(\log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right)\right)\right) \cdot \sin \left(\frac{\lambda_1 - \lambda_2}{2}\right), {\left(\sin \left(\frac{\phi_1}{2}\right) \cdot \cos \left(\frac{\phi_2}{2}\right) - \cos \left(\frac{\phi_1}{2}\right) \cdot \sin \left(\frac{\phi_2}{2}\right)\right)}^{2}\right)}}double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79370 = R;
double r79371 = 2.0;
double r79372 = phi1;
double r79373 = phi2;
double r79374 = r79372 - r79373;
double r79375 = r79374 / r79371;
double r79376 = sin(r79375);
double r79377 = pow(r79376, r79371);
double r79378 = cos(r79372);
double r79379 = cos(r79373);
double r79380 = r79378 * r79379;
double r79381 = lambda1;
double r79382 = lambda2;
double r79383 = r79381 - r79382;
double r79384 = r79383 / r79371;
double r79385 = sin(r79384);
double r79386 = r79380 * r79385;
double r79387 = r79386 * r79385;
double r79388 = r79377 + r79387;
double r79389 = sqrt(r79388);
double r79390 = 1.0;
double r79391 = r79390 - r79388;
double r79392 = sqrt(r79391);
double r79393 = atan2(r79389, r79392);
double r79394 = r79371 * r79393;
double r79395 = r79370 * r79394;
return r79395;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r79396 = R;
double r79397 = 2.0;
double r79398 = r79396 * r79397;
double r79399 = phi1;
double r79400 = cos(r79399);
double r79401 = phi2;
double r79402 = cos(r79401);
double r79403 = r79400 * r79402;
double r79404 = lambda1;
double r79405 = lambda2;
double r79406 = r79404 - r79405;
double r79407 = r79406 / r79397;
double r79408 = sin(r79407);
double r79409 = r79408 * r79408;
double r79410 = r79399 / r79397;
double r79411 = sin(r79410);
double r79412 = r79401 / r79397;
double r79413 = cos(r79412);
double r79414 = r79411 * r79413;
double r79415 = cos(r79410);
double r79416 = sin(r79412);
double r79417 = r79415 * r79416;
double r79418 = r79414 - r79417;
double r79419 = pow(r79418, r79397);
double r79420 = fma(r79403, r79409, r79419);
double r79421 = sqrt(r79420);
double r79422 = 1.0;
double r79423 = exp(r79408);
double r79424 = log(r79423);
double r79425 = expm1(r79424);
double r79426 = log1p(r79425);
double r79427 = r79426 * r79408;
double r79428 = fma(r79403, r79427, r79419);
double r79429 = r79422 - r79428;
double r79430 = sqrt(r79429);
double r79431 = atan2(r79421, r79430);
double r79432 = r79398 * r79431;
return r79432;
}



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 div-sub24.7
Applied sin-diff24.1
rmApplied div-sub24.1
Applied sin-diff14.4
rmApplied log1p-expm1-u14.5
rmApplied add-log-exp14.5
Final simplification14.5
herbie shell --seed 2019306 +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))))))))))