\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 - \left(\left(\cos \phi_2 \cdot \sin \phi_1\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1\right) + \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_2 \cdot \sin \lambda_1\right)\right) \cdot \left(\cos \phi_2 \cdot \sin \phi_1\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r5131198 = lambda1;
double r5131199 = lambda2;
double r5131200 = r5131198 - r5131199;
double r5131201 = sin(r5131200);
double r5131202 = phi2;
double r5131203 = cos(r5131202);
double r5131204 = r5131201 * r5131203;
double r5131205 = phi1;
double r5131206 = cos(r5131205);
double r5131207 = sin(r5131202);
double r5131208 = r5131206 * r5131207;
double r5131209 = sin(r5131205);
double r5131210 = r5131209 * r5131203;
double r5131211 = cos(r5131200);
double r5131212 = r5131210 * r5131211;
double r5131213 = r5131208 - r5131212;
double r5131214 = atan2(r5131204, r5131213);
return r5131214;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r5131215 = phi2;
double r5131216 = cos(r5131215);
double r5131217 = lambda2;
double r5131218 = cos(r5131217);
double r5131219 = lambda1;
double r5131220 = sin(r5131219);
double r5131221 = r5131218 * r5131220;
double r5131222 = cos(r5131219);
double r5131223 = sin(r5131217);
double r5131224 = r5131222 * r5131223;
double r5131225 = log1p(r5131224);
double r5131226 = expm1(r5131225);
double r5131227 = r5131221 - r5131226;
double r5131228 = r5131216 * r5131227;
double r5131229 = phi1;
double r5131230 = cos(r5131229);
double r5131231 = sin(r5131215);
double r5131232 = r5131230 * r5131231;
double r5131233 = sin(r5131229);
double r5131234 = r5131216 * r5131233;
double r5131235 = r5131218 * r5131222;
double r5131236 = r5131234 * r5131235;
double r5131237 = r5131223 * r5131220;
double r5131238 = expm1(r5131237);
double r5131239 = log1p(r5131238);
double r5131240 = r5131239 * r5131234;
double r5131241 = r5131236 + r5131240;
double r5131242 = r5131232 - r5131241;
double r5131243 = atan2(r5131228, r5131242);
return r5131243;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.7
rmApplied sin-diff7.1
rmApplied cos-diff0.2
Applied distribute-rgt-in0.2
rmApplied expm1-log1p-u0.2
rmApplied log1p-expm1-u0.2
Final simplification0.2
herbie shell --seed 2019165 +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))))))