\tan^{-1}_* \frac{\sin \left(\lambda_1 - \lambda_2\right) \cdot \cos \phi_2}{\cos \phi_1 \cdot \sin \phi_2 - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)}\tan^{-1}_* \frac{\left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}{\cos \phi_1 \cdot \sin \phi_2 - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 - \log \left(e^{\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_1 \cdot \sin \left(-\lambda_2\right)\right)\right)}\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r134776 = lambda1;
double r134777 = lambda2;
double r134778 = r134776 - r134777;
double r134779 = sin(r134778);
double r134780 = phi2;
double r134781 = cos(r134780);
double r134782 = r134779 * r134781;
double r134783 = phi1;
double r134784 = cos(r134783);
double r134785 = sin(r134780);
double r134786 = r134784 * r134785;
double r134787 = sin(r134783);
double r134788 = r134787 * r134781;
double r134789 = cos(r134778);
double r134790 = r134788 * r134789;
double r134791 = r134786 - r134790;
double r134792 = atan2(r134782, r134791);
return r134792;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r134793 = lambda1;
double r134794 = sin(r134793);
double r134795 = lambda2;
double r134796 = cos(r134795);
double r134797 = r134794 * r134796;
double r134798 = cos(r134793);
double r134799 = sin(r134795);
double r134800 = r134798 * r134799;
double r134801 = r134797 - r134800;
double r134802 = phi2;
double r134803 = cos(r134802);
double r134804 = r134801 * r134803;
double r134805 = phi1;
double r134806 = cos(r134805);
double r134807 = sin(r134802);
double r134808 = r134806 * r134807;
double r134809 = sin(r134805);
double r134810 = r134809 * r134803;
double r134811 = r134798 * r134796;
double r134812 = -r134795;
double r134813 = sin(r134812);
double r134814 = r134794 * r134813;
double r134815 = expm1(r134814);
double r134816 = log1p(r134815);
double r134817 = exp(r134816);
double r134818 = log(r134817);
double r134819 = r134811 - r134818;
double r134820 = r134810 * r134819;
double r134821 = r134808 - r134820;
double r134822 = atan2(r134804, r134821);
return r134822;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.4
rmApplied sin-diff6.7
rmApplied sub-neg6.7
Applied cos-sum0.2
Simplified0.2
rmApplied add-log-exp0.2
rmApplied log1p-expm1-u0.2
Final simplification0.2
herbie shell --seed 2020033 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Bearing on a great circle"
:precision binary64
(atan2 (* (sin (- lambda1 lambda2)) (cos phi2)) (- (* (cos phi1) (sin phi2)) (* (* (sin phi1) (cos phi2)) (cos (- lambda1 lambda2))))))