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)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 \log \left(e^{\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\lambda_1 - \lambda_2}{2}\right)\right)\right)}\right)\right)}}\right)double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r93638 = R;
double r93639 = 2.0;
double r93640 = phi1;
double r93641 = phi2;
double r93642 = r93640 - r93641;
double r93643 = r93642 / r93639;
double r93644 = sin(r93643);
double r93645 = pow(r93644, r93639);
double r93646 = cos(r93640);
double r93647 = cos(r93641);
double r93648 = r93646 * r93647;
double r93649 = lambda1;
double r93650 = lambda2;
double r93651 = r93649 - r93650;
double r93652 = r93651 / r93639;
double r93653 = sin(r93652);
double r93654 = r93648 * r93653;
double r93655 = r93654 * r93653;
double r93656 = r93645 + r93655;
double r93657 = sqrt(r93656);
double r93658 = 1.0;
double r93659 = r93658 - r93656;
double r93660 = sqrt(r93659);
double r93661 = atan2(r93657, r93660);
double r93662 = r93639 * r93661;
double r93663 = r93638 * r93662;
return r93663;
}
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
double r93664 = R;
double r93665 = 2.0;
double r93666 = phi1;
double r93667 = phi2;
double r93668 = r93666 - r93667;
double r93669 = r93668 / r93665;
double r93670 = sin(r93669);
double r93671 = pow(r93670, r93665);
double r93672 = cos(r93666);
double r93673 = cos(r93667);
double r93674 = r93672 * r93673;
double r93675 = lambda1;
double r93676 = lambda2;
double r93677 = r93675 - r93676;
double r93678 = r93677 / r93665;
double r93679 = sin(r93678);
double r93680 = r93674 * r93679;
double r93681 = r93680 * r93679;
double r93682 = r93671 + r93681;
double r93683 = sqrt(r93682);
double r93684 = 1.0;
double r93685 = expm1(r93679);
double r93686 = log1p(r93685);
double r93687 = exp(r93686);
double r93688 = log(r93687);
double r93689 = r93680 * r93688;
double r93690 = r93671 + r93689;
double r93691 = r93684 - r93690;
double r93692 = sqrt(r93691);
double r93693 = atan2(r93683, r93692);
double r93694 = r93665 * r93693;
double r93695 = r93664 * r93694;
return r93695;
}



Bits error versus R



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 24.0
rmApplied add-log-exp24.0
rmApplied log1p-expm1-u24.0
Final simplification24.0
herbie shell --seed 2020062 +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))))))))))