\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(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right) + \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\log \left(\sqrt{e^{\sin \lambda_1 \cdot \sin \lambda_2}}\right) + \log \left(\sqrt{e^{\sin \lambda_1 \cdot \sin \lambda_2}}\right)\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r90761 = lambda1;
double r90762 = lambda2;
double r90763 = r90761 - r90762;
double r90764 = sin(r90763);
double r90765 = phi2;
double r90766 = cos(r90765);
double r90767 = r90764 * r90766;
double r90768 = phi1;
double r90769 = cos(r90768);
double r90770 = sin(r90765);
double r90771 = r90769 * r90770;
double r90772 = sin(r90768);
double r90773 = r90772 * r90766;
double r90774 = cos(r90763);
double r90775 = r90773 * r90774;
double r90776 = r90771 - r90775;
double r90777 = atan2(r90767, r90776);
return r90777;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r90778 = lambda1;
double r90779 = sin(r90778);
double r90780 = lambda2;
double r90781 = cos(r90780);
double r90782 = r90779 * r90781;
double r90783 = cos(r90778);
double r90784 = sin(r90780);
double r90785 = r90783 * r90784;
double r90786 = r90782 - r90785;
double r90787 = phi2;
double r90788 = cos(r90787);
double r90789 = r90786 * r90788;
double r90790 = phi1;
double r90791 = cos(r90790);
double r90792 = sin(r90787);
double r90793 = r90791 * r90792;
double r90794 = sin(r90790);
double r90795 = r90794 * r90788;
double r90796 = r90783 * r90781;
double r90797 = r90795 * r90796;
double r90798 = r90779 * r90784;
double r90799 = exp(r90798);
double r90800 = sqrt(r90799);
double r90801 = log(r90800);
double r90802 = r90801 + r90801;
double r90803 = r90795 * r90802;
double r90804 = r90797 + r90803;
double r90805 = r90793 - r90804;
double r90806 = atan2(r90789, r90805);
return r90806;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.4
rmApplied sin-diff7.0
rmApplied cos-diff0.2
Applied distribute-lft-in0.2
rmApplied add-log-exp0.2
rmApplied add-sqr-sqrt0.2
Applied log-prod0.2
Final simplification0.2
herbie shell --seed 2019354 +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))))))