\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{\cos \phi_2 \cdot \left(\cos \lambda_2 \cdot \sin \lambda_1 - \mathsf{expm1}\left(\mathsf{log1p}\left(\cos \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}{\cos \phi_1 \cdot \sin \phi_2 - \left(\left(\cos \phi_2 \cdot \sin \phi_1\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1\right) + \left(\sin \lambda_2 \cdot \sin \lambda_1\right) \cdot \left(\cos \phi_2 \cdot \sin \phi_1\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r4241673 = lambda1;
double r4241674 = lambda2;
double r4241675 = r4241673 - r4241674;
double r4241676 = sin(r4241675);
double r4241677 = phi2;
double r4241678 = cos(r4241677);
double r4241679 = r4241676 * r4241678;
double r4241680 = phi1;
double r4241681 = cos(r4241680);
double r4241682 = sin(r4241677);
double r4241683 = r4241681 * r4241682;
double r4241684 = sin(r4241680);
double r4241685 = r4241684 * r4241678;
double r4241686 = cos(r4241675);
double r4241687 = r4241685 * r4241686;
double r4241688 = r4241683 - r4241687;
double r4241689 = atan2(r4241679, r4241688);
return r4241689;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r4241690 = phi2;
double r4241691 = cos(r4241690);
double r4241692 = lambda2;
double r4241693 = cos(r4241692);
double r4241694 = lambda1;
double r4241695 = sin(r4241694);
double r4241696 = r4241693 * r4241695;
double r4241697 = cos(r4241694);
double r4241698 = sin(r4241692);
double r4241699 = r4241697 * r4241698;
double r4241700 = log1p(r4241699);
double r4241701 = expm1(r4241700);
double r4241702 = r4241696 - r4241701;
double r4241703 = r4241691 * r4241702;
double r4241704 = phi1;
double r4241705 = cos(r4241704);
double r4241706 = sin(r4241690);
double r4241707 = r4241705 * r4241706;
double r4241708 = sin(r4241704);
double r4241709 = r4241691 * r4241708;
double r4241710 = r4241693 * r4241697;
double r4241711 = r4241709 * r4241710;
double r4241712 = r4241698 * r4241695;
double r4241713 = r4241712 * r4241709;
double r4241714 = r4241711 + r4241713;
double r4241715 = r4241707 - r4241714;
double r4241716 = atan2(r4241703, r4241715);
return r4241716;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.2
rmApplied sin-diff6.8
rmApplied cos-diff0.2
Applied distribute-rgt-in0.2
rmApplied expm1-log1p-u0.2
Final simplification0.2
herbie shell --seed 2019164 +o rules:numerics
(FPCore (lambda1 lambda2 phi1 phi2)
:name "Bearing on a great circle"
(atan2 (* (sin (- lambda1 lambda2)) (cos phi2)) (- (* (cos phi1) (sin phi2)) (* (* (sin phi1) (cos phi2)) (cos (- lambda1 lambda2))))))