\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(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\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 r144799 = lambda1;
double r144800 = lambda2;
double r144801 = r144799 - r144800;
double r144802 = sin(r144801);
double r144803 = phi2;
double r144804 = cos(r144803);
double r144805 = r144802 * r144804;
double r144806 = phi1;
double r144807 = cos(r144806);
double r144808 = sin(r144803);
double r144809 = r144807 * r144808;
double r144810 = sin(r144806);
double r144811 = r144810 * r144804;
double r144812 = cos(r144801);
double r144813 = r144811 * r144812;
double r144814 = r144809 - r144813;
double r144815 = atan2(r144805, r144814);
return r144815;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r144816 = lambda1;
double r144817 = sin(r144816);
double r144818 = lambda2;
double r144819 = cos(r144818);
double r144820 = r144817 * r144819;
double r144821 = cos(r144816);
double r144822 = -r144818;
double r144823 = sin(r144822);
double r144824 = r144821 * r144823;
double r144825 = r144820 + r144824;
double r144826 = phi2;
double r144827 = cos(r144826);
double r144828 = r144825 * r144827;
double r144829 = phi1;
double r144830 = cos(r144829);
double r144831 = sin(r144826);
double r144832 = r144830 * r144831;
double r144833 = sin(r144829);
double r144834 = r144833 * r144827;
double r144835 = r144821 * r144819;
double r144836 = r144834 * r144835;
double r144837 = expm1(r144836);
double r144838 = log1p(r144837);
double r144839 = sin(r144818);
double r144840 = r144817 * r144839;
double r144841 = r144834 * r144840;
double r144842 = r144838 + r144841;
double r144843 = r144832 - r144842;
double r144844 = atan2(r144828, r144843);
return r144844;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.0
rmApplied sub-neg13.0
Applied sin-sum6.8
Simplified6.8
rmApplied cos-diff0.2
Applied distribute-lft-in0.2
rmApplied log1p-expm1-u0.2
Final simplification0.2
herbie shell --seed 2020035 +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))))))