\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 - \mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \left(\sin \phi_1 \cdot \cos \phi_2\right)\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r4518216 = lambda1;
double r4518217 = lambda2;
double r4518218 = r4518216 - r4518217;
double r4518219 = sin(r4518218);
double r4518220 = phi2;
double r4518221 = cos(r4518220);
double r4518222 = r4518219 * r4518221;
double r4518223 = phi1;
double r4518224 = cos(r4518223);
double r4518225 = sin(r4518220);
double r4518226 = r4518224 * r4518225;
double r4518227 = sin(r4518223);
double r4518228 = r4518227 * r4518221;
double r4518229 = cos(r4518218);
double r4518230 = r4518228 * r4518229;
double r4518231 = r4518226 - r4518230;
double r4518232 = atan2(r4518222, r4518231);
return r4518232;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r4518233 = phi2;
double r4518234 = cos(r4518233);
double r4518235 = lambda2;
double r4518236 = cos(r4518235);
double r4518237 = lambda1;
double r4518238 = sin(r4518237);
double r4518239 = r4518236 * r4518238;
double r4518240 = cos(r4518237);
double r4518241 = sin(r4518235);
double r4518242 = r4518240 * r4518241;
double r4518243 = log1p(r4518242);
double r4518244 = expm1(r4518243);
double r4518245 = r4518239 - r4518244;
double r4518246 = r4518234 * r4518245;
double r4518247 = phi1;
double r4518248 = cos(r4518247);
double r4518249 = sin(r4518233);
double r4518250 = r4518248 * r4518249;
double r4518251 = r4518236 * r4518240;
double r4518252 = fma(r4518241, r4518238, r4518251);
double r4518253 = sin(r4518247);
double r4518254 = r4518253 * r4518234;
double r4518255 = r4518252 * r4518254;
double r4518256 = expm1(r4518255);
double r4518257 = log1p(r4518256);
double r4518258 = r4518250 - r4518257;
double r4518259 = atan2(r4518246, r4518258);
return r4518259;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Initial program 13.6
rmApplied sin-diff7.0
rmApplied cos-diff0.2
rmApplied expm1-log1p-u0.2
rmApplied log1p-expm1-u0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019171 +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))))))