\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(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right) + \left(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \sin \lambda_1\right) \cdot \sin \lambda_2\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r127304 = lambda1;
double r127305 = lambda2;
double r127306 = r127304 - r127305;
double r127307 = sin(r127306);
double r127308 = phi2;
double r127309 = cos(r127308);
double r127310 = r127307 * r127309;
double r127311 = phi1;
double r127312 = cos(r127311);
double r127313 = sin(r127308);
double r127314 = r127312 * r127313;
double r127315 = sin(r127311);
double r127316 = r127315 * r127309;
double r127317 = cos(r127306);
double r127318 = r127316 * r127317;
double r127319 = r127314 - r127318;
double r127320 = atan2(r127310, r127319);
return r127320;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r127321 = lambda1;
double r127322 = sin(r127321);
double r127323 = lambda2;
double r127324 = cos(r127323);
double r127325 = r127322 * r127324;
double r127326 = cos(r127321);
double r127327 = sin(r127323);
double r127328 = r127326 * r127327;
double r127329 = r127325 - r127328;
double r127330 = phi2;
double r127331 = cos(r127330);
double r127332 = r127329 * r127331;
double r127333 = phi1;
double r127334 = cos(r127333);
double r127335 = sin(r127330);
double r127336 = r127334 * r127335;
double r127337 = log1p(r127336);
double r127338 = expm1(r127337);
double r127339 = sin(r127333);
double r127340 = r127339 * r127331;
double r127341 = r127326 * r127324;
double r127342 = r127340 * r127341;
double r127343 = r127340 * r127322;
double r127344 = r127343 * r127327;
double r127345 = r127342 + r127344;
double r127346 = r127338 - r127345;
double r127347 = atan2(r127332, r127346);
return r127347;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



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