\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}{\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \phi_1 \cdot \sin \phi_2\right)\right) - \mathsf{expm1}\left(\mathsf{log1p}\left(\left(\mathsf{fma}\left(\cos \lambda_1, \cos \lambda_2, \sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \sin \phi_1\right) \cdot \cos \phi_2\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r84701 = lambda1;
double r84702 = lambda2;
double r84703 = r84701 - r84702;
double r84704 = sin(r84703);
double r84705 = phi2;
double r84706 = cos(r84705);
double r84707 = r84704 * r84706;
double r84708 = phi1;
double r84709 = cos(r84708);
double r84710 = sin(r84705);
double r84711 = r84709 * r84710;
double r84712 = sin(r84708);
double r84713 = r84712 * r84706;
double r84714 = cos(r84703);
double r84715 = r84713 * r84714;
double r84716 = r84711 - r84715;
double r84717 = atan2(r84707, r84716);
return r84717;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r84718 = lambda1;
double r84719 = sin(r84718);
double r84720 = lambda2;
double r84721 = cos(r84720);
double r84722 = r84719 * r84721;
double r84723 = cos(r84718);
double r84724 = -r84720;
double r84725 = sin(r84724);
double r84726 = r84723 * r84725;
double r84727 = r84722 + r84726;
double r84728 = phi2;
double r84729 = cos(r84728);
double r84730 = r84727 * r84729;
double r84731 = phi1;
double r84732 = cos(r84731);
double r84733 = sin(r84728);
double r84734 = r84732 * r84733;
double r84735 = log1p(r84734);
double r84736 = expm1(r84735);
double r84737 = sin(r84720);
double r84738 = r84719 * r84737;
double r84739 = fma(r84723, r84721, r84738);
double r84740 = sin(r84731);
double r84741 = r84739 * r84740;
double r84742 = r84741 * r84729;
double r84743 = log1p(r84742);
double r84744 = expm1(r84743);
double r84745 = r84736 - r84744;
double r84746 = atan2(r84730, r84745);
return r84746;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 13.0
rmApplied sub-neg13.0
Applied sin-sum6.6
Simplified6.6
rmApplied sub-neg6.6
Applied cos-sum0.2
Simplified0.2
rmApplied expm1-log1p-u0.2
rmApplied expm1-log1p-u0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019208 +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))))))