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, \log \left(e^{\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)}\right) \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\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 r89473 = R;
double r89474 = 2.0;
double r89475 = phi1;
double r89476 = phi2;
double r89477 = r89475 - r89476;
double r89478 = r89477 / r89474;
double r89479 = sin(r89478);
double r89480 = pow(r89479, r89474);
double r89481 = cos(r89475);
double r89482 = cos(r89476);
double r89483 = r89481 * r89482;
double r89484 = lambda1;
double r89485 = lambda2;
double r89486 = r89484 - r89485;
double r89487 = r89486 / r89474;
double r89488 = sin(r89487);
double r89489 = r89483 * r89488;
double r89490 = r89489 * r89488;
double r89491 = r89480 + r89490;
double r89492 = sqrt(r89491);
double r89493 = 1.0;
double r89494 = r89493 - r89491;
double r89495 = sqrt(r89494);
double r89496 = atan2(r89492, r89495);
double r89497 = r89474 * r89496;
double r89498 = r89473 * r89497;
return r89498;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r89499 = R;
double r89500 = 2.0;
double r89501 = r89499 * r89500;
double r89502 = phi1;
double r89503 = cos(r89502);
double r89504 = phi2;
double r89505 = cos(r89504);
double r89506 = r89503 * r89505;
double r89507 = lambda1;
double r89508 = lambda2;
double r89509 = r89507 - r89508;
double r89510 = r89509 / r89500;
double r89511 = sin(r89510);
double r89512 = r89511 * r89511;
double r89513 = r89502 / r89500;
double r89514 = sin(r89513);
double r89515 = r89504 / r89500;
double r89516 = cos(r89515);
double r89517 = r89514 * r89516;
double r89518 = cos(r89513);
double r89519 = sin(r89515);
double r89520 = r89518 * r89519;
double r89521 = r89517 - r89520;
double r89522 = pow(r89521, r89500);
double r89523 = fma(r89506, r89512, r89522);
double r89524 = sqrt(r89523);
double r89525 = 1.0;
double r89526 = exp(r89511);
double r89527 = log(r89526);
double r89528 = expm1(r89511);
double r89529 = log1p(r89528);
double r89530 = r89527 * r89529;
double r89531 = fma(r89506, r89530, r89522);
double r89532 = r89525 - r89531;
double r89533 = sqrt(r89532);
double r89534 = atan2(r89524, r89533);
double r89535 = r89501 * r89534;
return r89535;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 24.4
Simplified24.4
rmApplied div-sub24.4
Applied sin-diff23.8
rmApplied div-sub23.8
Applied sin-diff14.1
rmApplied log1p-expm1-u14.1
rmApplied add-log-exp14.1
Final simplification14.1
herbie shell --seed 2019350 +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))))))))))