\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(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \lambda_1 \cdot \cos \lambda_2\right)\right) + \cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \cos \phi_2}{\left(\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\right)\right) - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r74791 = lambda1;
double r74792 = lambda2;
double r74793 = r74791 - r74792;
double r74794 = sin(r74793);
double r74795 = phi2;
double r74796 = cos(r74795);
double r74797 = r74794 * r74796;
double r74798 = phi1;
double r74799 = cos(r74798);
double r74800 = sin(r74795);
double r74801 = r74799 * r74800;
double r74802 = sin(r74798);
double r74803 = r74802 * r74796;
double r74804 = cos(r74793);
double r74805 = r74803 * r74804;
double r74806 = r74801 - r74805;
double r74807 = atan2(r74797, r74806);
return r74807;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r74808 = lambda1;
double r74809 = sin(r74808);
double r74810 = lambda2;
double r74811 = cos(r74810);
double r74812 = r74809 * r74811;
double r74813 = log1p(r74812);
double r74814 = expm1(r74813);
double r74815 = cos(r74808);
double r74816 = -r74810;
double r74817 = sin(r74816);
double r74818 = r74815 * r74817;
double r74819 = r74814 + r74818;
double r74820 = phi2;
double r74821 = cos(r74820);
double r74822 = r74819 * r74821;
double r74823 = phi1;
double r74824 = cos(r74823);
double r74825 = sin(r74820);
double r74826 = r74824 * r74825;
double r74827 = sin(r74823);
double r74828 = r74827 * r74821;
double r74829 = r74815 * r74811;
double r74830 = r74828 * r74829;
double r74831 = r74826 - r74830;
double r74832 = sin(r74810);
double r74833 = r74809 * r74832;
double r74834 = r74828 * r74833;
double r74835 = r74831 - r74834;
double r74836 = atan2(r74822, r74835);
return r74836;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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