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, \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\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)}}{\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 \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 r71522 = R;
double r71523 = 2.0;
double r71524 = phi1;
double r71525 = phi2;
double r71526 = r71524 - r71525;
double r71527 = r71526 / r71523;
double r71528 = sin(r71527);
double r71529 = pow(r71528, r71523);
double r71530 = cos(r71524);
double r71531 = cos(r71525);
double r71532 = r71530 * r71531;
double r71533 = lambda1;
double r71534 = lambda2;
double r71535 = r71533 - r71534;
double r71536 = r71535 / r71523;
double r71537 = sin(r71536);
double r71538 = r71532 * r71537;
double r71539 = r71538 * r71537;
double r71540 = r71529 + r71539;
double r71541 = sqrt(r71540);
double r71542 = 1.0;
double r71543 = r71542 - r71540;
double r71544 = sqrt(r71543);
double r71545 = atan2(r71541, r71544);
double r71546 = r71523 * r71545;
double r71547 = r71522 * r71546;
return r71547;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r71548 = R;
double r71549 = 2.0;
double r71550 = r71548 * r71549;
double r71551 = phi1;
double r71552 = cos(r71551);
double r71553 = phi2;
double r71554 = cos(r71553);
double r71555 = r71552 * r71554;
double r71556 = lambda1;
double r71557 = lambda2;
double r71558 = r71556 - r71557;
double r71559 = r71558 / r71549;
double r71560 = sin(r71559);
double r71561 = expm1(r71560);
double r71562 = log1p(r71561);
double r71563 = r71562 * r71560;
double r71564 = r71551 / r71549;
double r71565 = sin(r71564);
double r71566 = r71553 / r71549;
double r71567 = cos(r71566);
double r71568 = r71565 * r71567;
double r71569 = cos(r71564);
double r71570 = sin(r71566);
double r71571 = r71569 * r71570;
double r71572 = r71568 - r71571;
double r71573 = pow(r71572, r71549);
double r71574 = fma(r71555, r71563, r71573);
double r71575 = sqrt(r71574);
double r71576 = 1.0;
double r71577 = exp(r71560);
double r71578 = log(r71577);
double r71579 = r71578 * r71560;
double r71580 = fma(r71555, r71579, r71573);
double r71581 = r71576 - r71580;
double r71582 = sqrt(r71581);
double r71583 = atan2(r71575, r71582);
double r71584 = r71550 * r71583;
return r71584;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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