\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 \left(-\lambda_2\right)\right) \cdot \cos \phi_2}{\cos \phi_1 \cdot \sin \phi_2 - \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \phi_1 \cdot \left(\cos \phi_2 \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right)\right)\right)\right) + \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r92852 = lambda1;
double r92853 = lambda2;
double r92854 = r92852 - r92853;
double r92855 = sin(r92854);
double r92856 = phi2;
double r92857 = cos(r92856);
double r92858 = r92855 * r92857;
double r92859 = phi1;
double r92860 = cos(r92859);
double r92861 = sin(r92856);
double r92862 = r92860 * r92861;
double r92863 = sin(r92859);
double r92864 = r92863 * r92857;
double r92865 = cos(r92854);
double r92866 = r92864 * r92865;
double r92867 = r92862 - r92866;
double r92868 = atan2(r92858, r92867);
return r92868;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r92869 = lambda1;
double r92870 = sin(r92869);
double r92871 = lambda2;
double r92872 = cos(r92871);
double r92873 = r92870 * r92872;
double r92874 = cos(r92869);
double r92875 = -r92871;
double r92876 = sin(r92875);
double r92877 = r92874 * r92876;
double r92878 = r92873 + r92877;
double r92879 = phi2;
double r92880 = cos(r92879);
double r92881 = r92878 * r92880;
double r92882 = phi1;
double r92883 = cos(r92882);
double r92884 = sin(r92879);
double r92885 = r92883 * r92884;
double r92886 = sin(r92882);
double r92887 = r92874 * r92872;
double r92888 = r92880 * r92887;
double r92889 = r92886 * r92888;
double r92890 = expm1(r92889);
double r92891 = log1p(r92890);
double r92892 = r92886 * r92880;
double r92893 = sin(r92871);
double r92894 = r92870 * r92893;
double r92895 = r92892 * r92894;
double r92896 = r92891 + r92895;
double r92897 = r92885 - r92896;
double r92898 = atan2(r92881, r92897);
return r92898;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 12.9
rmApplied sub-neg12.9
Applied sin-sum6.7
Simplified6.7
rmApplied cos-diff0.2
Applied distribute-lft-in0.2
rmApplied associate-*l*0.2
rmApplied log1p-expm1-u0.2
Final simplification0.2
herbie shell --seed 2020083 +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))))))