\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}{\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \phi_1 \cdot \sin \phi_2\right)\right) - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \log \left(e^{\sin \lambda_2 \cdot \sin \lambda_1}\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r86283 = lambda1;
double r86284 = lambda2;
double r86285 = r86283 - r86284;
double r86286 = sin(r86285);
double r86287 = phi2;
double r86288 = cos(r86287);
double r86289 = r86286 * r86288;
double r86290 = phi1;
double r86291 = cos(r86290);
double r86292 = sin(r86287);
double r86293 = r86291 * r86292;
double r86294 = sin(r86290);
double r86295 = r86294 * r86288;
double r86296 = cos(r86285);
double r86297 = r86295 * r86296;
double r86298 = r86293 - r86297;
double r86299 = atan2(r86289, r86298);
return r86299;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r86300 = lambda1;
double r86301 = sin(r86300);
double r86302 = lambda2;
double r86303 = cos(r86302);
double r86304 = r86301 * r86303;
double r86305 = cos(r86300);
double r86306 = sin(r86302);
double r86307 = r86305 * r86306;
double r86308 = r86304 - r86307;
double r86309 = phi2;
double r86310 = cos(r86309);
double r86311 = r86308 * r86310;
double r86312 = phi1;
double r86313 = cos(r86312);
double r86314 = sin(r86309);
double r86315 = r86313 * r86314;
double r86316 = log1p(r86315);
double r86317 = expm1(r86316);
double r86318 = sin(r86312);
double r86319 = r86318 * r86310;
double r86320 = r86303 * r86305;
double r86321 = r86306 * r86301;
double r86322 = exp(r86321);
double r86323 = log(r86322);
double r86324 = r86320 + r86323;
double r86325 = r86319 * r86324;
double r86326 = r86317 - r86325;
double r86327 = atan2(r86311, r86326);
return r86327;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.0
rmApplied sin-diff6.6
rmApplied cos-diff0.2
Simplified0.2
Simplified0.2
rmApplied expm1-log1p-u0.2
rmApplied add-log-exp0.2
Final simplification0.2
herbie shell --seed 2019305 +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))))))