\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(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \lambda_1 \cdot \cos \lambda_2\right)\right) - \cos \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}{\left(\cos \phi_1 \cdot \sin \phi_2 - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right)\right) - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r81282 = lambda1;
double r81283 = lambda2;
double r81284 = r81282 - r81283;
double r81285 = sin(r81284);
double r81286 = phi2;
double r81287 = cos(r81286);
double r81288 = r81285 * r81287;
double r81289 = phi1;
double r81290 = cos(r81289);
double r81291 = sin(r81286);
double r81292 = r81290 * r81291;
double r81293 = sin(r81289);
double r81294 = r81293 * r81287;
double r81295 = cos(r81284);
double r81296 = r81294 * r81295;
double r81297 = r81292 - r81296;
double r81298 = atan2(r81288, r81297);
return r81298;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r81299 = lambda1;
double r81300 = sin(r81299);
double r81301 = lambda2;
double r81302 = cos(r81301);
double r81303 = r81300 * r81302;
double r81304 = log1p(r81303);
double r81305 = expm1(r81304);
double r81306 = cos(r81299);
double r81307 = sin(r81301);
double r81308 = r81306 * r81307;
double r81309 = r81305 - r81308;
double r81310 = phi2;
double r81311 = cos(r81310);
double r81312 = r81309 * r81311;
double r81313 = phi1;
double r81314 = cos(r81313);
double r81315 = sin(r81310);
double r81316 = r81314 * r81315;
double r81317 = sin(r81313);
double r81318 = r81317 * r81311;
double r81319 = r81306 * r81302;
double r81320 = r81318 * r81319;
double r81321 = r81316 - r81320;
double r81322 = r81300 * r81307;
double r81323 = r81318 * r81322;
double r81324 = r81321 - r81323;
double r81325 = atan2(r81312, r81324);
return r81325;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.5
rmApplied sin-diff6.9
rmApplied cos-diff0.2
Applied distribute-lft-in0.2
Applied associate--r+0.2
rmApplied expm1-log1p-u0.2
Final simplification0.2
herbie shell --seed 2019323 +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))))))