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 \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)}}{\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 r63632 = R;
double r63633 = 2.0;
double r63634 = phi1;
double r63635 = phi2;
double r63636 = r63634 - r63635;
double r63637 = r63636 / r63633;
double r63638 = sin(r63637);
double r63639 = pow(r63638, r63633);
double r63640 = cos(r63634);
double r63641 = cos(r63635);
double r63642 = r63640 * r63641;
double r63643 = lambda1;
double r63644 = lambda2;
double r63645 = r63643 - r63644;
double r63646 = r63645 / r63633;
double r63647 = sin(r63646);
double r63648 = r63642 * r63647;
double r63649 = r63648 * r63647;
double r63650 = r63639 + r63649;
double r63651 = sqrt(r63650);
double r63652 = 1.0;
double r63653 = r63652 - r63650;
double r63654 = sqrt(r63653);
double r63655 = atan2(r63651, r63654);
double r63656 = r63633 * r63655;
double r63657 = r63632 * r63656;
return r63657;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r63658 = R;
double r63659 = 2.0;
double r63660 = r63658 * r63659;
double r63661 = phi1;
double r63662 = cos(r63661);
double r63663 = phi2;
double r63664 = cos(r63663);
double r63665 = r63662 * r63664;
double r63666 = lambda1;
double r63667 = lambda2;
double r63668 = r63666 - r63667;
double r63669 = r63668 / r63659;
double r63670 = sin(r63669);
double r63671 = expm1(r63670);
double r63672 = log1p(r63671);
double r63673 = r63670 * r63672;
double r63674 = r63661 / r63659;
double r63675 = sin(r63674);
double r63676 = r63663 / r63659;
double r63677 = cos(r63676);
double r63678 = r63675 * r63677;
double r63679 = cos(r63674);
double r63680 = sin(r63676);
double r63681 = r63679 * r63680;
double r63682 = r63678 - r63681;
double r63683 = pow(r63682, r63659);
double r63684 = fma(r63665, r63673, r63683);
double r63685 = sqrt(r63684);
double r63686 = 1.0;
double r63687 = exp(r63670);
double r63688 = log(r63687);
double r63689 = r63688 * r63670;
double r63690 = fma(r63665, r63689, r63683);
double r63691 = r63686 - r63690;
double r63692 = sqrt(r63691);
double r63693 = atan2(r63685, r63692);
double r63694 = r63660 * r63693;
return r63694;
}



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))))))))))