\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 \left(-\lambda_2\right)\right) \cdot \cos \phi_2}{\cos \phi_1 \cdot \sin \phi_2 - \left(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right) + \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \phi_1 \cdot \cos \phi_2\right)\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r86188 = lambda1;
double r86189 = lambda2;
double r86190 = r86188 - r86189;
double r86191 = sin(r86190);
double r86192 = phi2;
double r86193 = cos(r86192);
double r86194 = r86191 * r86193;
double r86195 = phi1;
double r86196 = cos(r86195);
double r86197 = sin(r86192);
double r86198 = r86196 * r86197;
double r86199 = sin(r86195);
double r86200 = r86199 * r86193;
double r86201 = cos(r86190);
double r86202 = r86200 * r86201;
double r86203 = r86198 - r86202;
double r86204 = atan2(r86194, r86203);
return r86204;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r86205 = lambda1;
double r86206 = sin(r86205);
double r86207 = lambda2;
double r86208 = cos(r86207);
double r86209 = r86206 * r86208;
double r86210 = cos(r86205);
double r86211 = -r86207;
double r86212 = sin(r86211);
double r86213 = r86210 * r86212;
double r86214 = r86209 + r86213;
double r86215 = phi2;
double r86216 = cos(r86215);
double r86217 = r86214 * r86216;
double r86218 = phi1;
double r86219 = cos(r86218);
double r86220 = sin(r86215);
double r86221 = r86219 * r86220;
double r86222 = sin(r86218);
double r86223 = r86222 * r86216;
double r86224 = r86210 * r86208;
double r86225 = r86223 * r86224;
double r86226 = expm1(r86223);
double r86227 = log1p(r86226);
double r86228 = sin(r86207);
double r86229 = r86206 * r86228;
double r86230 = r86227 * r86229;
double r86231 = r86225 + r86230;
double r86232 = r86221 - r86231;
double r86233 = atan2(r86217, r86232);
return r86233;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.2
rmApplied sub-neg13.2
Applied sin-sum6.8
Simplified6.8
rmApplied cos-diff0.2
Applied distribute-lft-in0.2
rmApplied log1p-expm1-u0.2
Final simplification0.2
herbie shell --seed 2020018 +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))))))