\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(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \lambda_1 \cdot \cos \lambda_2\right)\right) + \cos \lambda_1 \cdot \sin \left(-\lambda_2\right)\right) \cdot \cos \phi_2}{\left(\cos \phi_1 \cdot \sin \phi_2 - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2\right)\right) - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)}double f(double lambda1, double lambda2, double phi1, double phi2) {
double r82175 = lambda1;
double r82176 = lambda2;
double r82177 = r82175 - r82176;
double r82178 = sin(r82177);
double r82179 = phi2;
double r82180 = cos(r82179);
double r82181 = r82178 * r82180;
double r82182 = phi1;
double r82183 = cos(r82182);
double r82184 = sin(r82179);
double r82185 = r82183 * r82184;
double r82186 = sin(r82182);
double r82187 = r82186 * r82180;
double r82188 = cos(r82177);
double r82189 = r82187 * r82188;
double r82190 = r82185 - r82189;
double r82191 = atan2(r82181, r82190);
return r82191;
}
double f(double lambda1, double lambda2, double phi1, double phi2) {
double r82192 = lambda1;
double r82193 = sin(r82192);
double r82194 = lambda2;
double r82195 = cos(r82194);
double r82196 = r82193 * r82195;
double r82197 = log1p(r82196);
double r82198 = expm1(r82197);
double r82199 = cos(r82192);
double r82200 = -r82194;
double r82201 = sin(r82200);
double r82202 = r82199 * r82201;
double r82203 = r82198 + r82202;
double r82204 = phi2;
double r82205 = cos(r82204);
double r82206 = r82203 * r82205;
double r82207 = phi1;
double r82208 = cos(r82207);
double r82209 = sin(r82204);
double r82210 = r82208 * r82209;
double r82211 = sin(r82207);
double r82212 = r82211 * r82205;
double r82213 = r82199 * r82195;
double r82214 = r82212 * r82213;
double r82215 = r82210 - r82214;
double r82216 = sin(r82194);
double r82217 = r82193 * r82216;
double r82218 = r82212 * r82217;
double r82219 = r82215 - r82218;
double r82220 = atan2(r82206, r82219);
return r82220;
}



Bits error versus lambda1



Bits error versus lambda2



Bits error versus phi1



Bits error versus phi2
Results
Initial program 13.5
rmApplied sub-neg13.5
Applied sin-sum6.9
Simplified6.9
rmApplied cos-diff0.2
Applied distribute-lft-in0.2
Applied associate--r+0.2
rmApplied expm1-log1p-u0.2
Final simplification0.2
herbie shell --seed 2019323 +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))))))