\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(\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 r114806 = lambda1;
double r114807 = lambda2;
double r114808 = r114806 - r114807;
double r114809 = sin(r114808);
double r114810 = phi2;
double r114811 = cos(r114810);
double r114812 = r114809 * r114811;
double r114813 = phi1;
double r114814 = cos(r114813);
double r114815 = sin(r114810);
double r114816 = r114814 * r114815;
double r114817 = sin(r114813);
double r114818 = r114817 * r114811;
double r114819 = cos(r114808);
double r114820 = r114818 * r114819;
double r114821 = r114816 - r114820;
double r114822 = atan2(r114812, r114821);
return r114822;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r114823 = lambda1;
double r114824 = sin(r114823);
double r114825 = lambda2;
double r114826 = cos(r114825);
double r114827 = r114824 * r114826;
double r114828 = cos(r114823);
double r114829 = sin(r114825);
double r114830 = r114828 * r114829;
double r114831 = r114827 - r114830;
double r114832 = phi2;
double r114833 = cos(r114832);
double r114834 = r114831 * r114833;
double r114835 = phi1;
double r114836 = cos(r114835);
double r114837 = sin(r114832);
double r114838 = r114836 * r114837;
double r114839 = sin(r114835);
double r114840 = r114828 * r114826;
double r114841 = r114833 * r114840;
double r114842 = r114839 * r114841;
double r114843 = expm1(r114842);
double r114844 = log1p(r114843);
double r114845 = r114839 * r114833;
double r114846 = r114824 * r114829;
double r114847 = r114845 * r114846;
double r114848 = r114844 + r114847;
double r114849 = r114838 - r114848;
double r114850 = atan2(r114834, r114849);
return r114850;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 14.0
rmApplied sin-diff7.2
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 2020060 +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))))))