\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 - \mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r121572 = lambda1;
double r121573 = lambda2;
double r121574 = r121572 - r121573;
double r121575 = sin(r121574);
double r121576 = phi2;
double r121577 = cos(r121576);
double r121578 = r121575 * r121577;
double r121579 = phi1;
double r121580 = cos(r121579);
double r121581 = sin(r121576);
double r121582 = r121580 * r121581;
double r121583 = sin(r121579);
double r121584 = r121583 * r121577;
double r121585 = cos(r121574);
double r121586 = r121584 * r121585;
double r121587 = r121582 - r121586;
double r121588 = atan2(r121578, r121587);
return r121588;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r121589 = lambda1;
double r121590 = sin(r121589);
double r121591 = lambda2;
double r121592 = cos(r121591);
double r121593 = r121590 * r121592;
double r121594 = cos(r121589);
double r121595 = sin(r121591);
double r121596 = r121594 * r121595;
double r121597 = r121593 - r121596;
double r121598 = phi2;
double r121599 = cos(r121598);
double r121600 = r121597 * r121599;
double r121601 = phi1;
double r121602 = cos(r121601);
double r121603 = sin(r121598);
double r121604 = r121602 * r121603;
double r121605 = sin(r121601);
double r121606 = r121605 * r121599;
double r121607 = r121594 * r121592;
double r121608 = r121590 * r121595;
double r121609 = r121607 + r121608;
double r121610 = r121606 * r121609;
double r121611 = expm1(r121610);
double r121612 = log1p(r121611);
double r121613 = r121604 - r121612;
double r121614 = atan2(r121600, r121613);
return r121614;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 12.8
rmApplied sin-diff6.8
rmApplied cos-diff0.2
rmApplied log1p-expm1-u0.2
Final simplification0.2
herbie shell --seed 2020065 +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))))))