Average Error: 12.8 → 0.2
Time: 14.6s
Precision: 64
\[\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}{\cos \phi_1 \cdot \sin \phi_2 - \mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}\]
\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}{\cos \phi_1 \cdot \sin \phi_2 - \mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}
double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r121572 = lambda1;
        double r121573 = lambda2;
        double r121574 = r121572 - r121573;
        double r121575 = sin(r121574);
        double r121576 = phi2;
        double r121577 = cos(r121576);
        double r121578 = r121575 * r121577;
        double r121579 = phi1;
        double r121580 = cos(r121579);
        double r121581 = sin(r121576);
        double r121582 = r121580 * r121581;
        double r121583 = sin(r121579);
        double r121584 = r121583 * r121577;
        double r121585 = cos(r121574);
        double r121586 = r121584 * r121585;
        double r121587 = r121582 - r121586;
        double r121588 = atan2(r121578, r121587);
        return r121588;
}

double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r121589 = lambda1;
        double r121590 = sin(r121589);
        double r121591 = lambda2;
        double r121592 = cos(r121591);
        double r121593 = r121590 * r121592;
        double r121594 = cos(r121589);
        double r121595 = sin(r121591);
        double r121596 = r121594 * r121595;
        double r121597 = r121593 - r121596;
        double r121598 = phi2;
        double r121599 = cos(r121598);
        double r121600 = r121597 * r121599;
        double r121601 = phi1;
        double r121602 = cos(r121601);
        double r121603 = sin(r121598);
        double r121604 = r121602 * r121603;
        double r121605 = sin(r121601);
        double r121606 = r121605 * r121599;
        double r121607 = r121594 * r121592;
        double r121608 = r121590 * r121595;
        double r121609 = r121607 + r121608;
        double r121610 = r121606 * r121609;
        double r121611 = expm1(r121610);
        double r121612 = log1p(r121611);
        double r121613 = r121604 - r121612;
        double r121614 = atan2(r121600, r121613);
        return r121614;
}

Error

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Initial program 12.8

    \[\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)}\]
  2. Using strategy rm
  3. Applied sin-diff6.8

    \[\leadsto \tan^{-1}_* \frac{\color{blue}{\left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \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)}\]
  4. Using strategy rm
  5. Applied cos-diff0.2

    \[\leadsto \tan^{-1}_* \frac{\left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}{\cos \phi_1 \cdot \sin \phi_2 - \left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \color{blue}{\left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)}}\]
  6. Using strategy rm
  7. Applied log1p-expm1-u0.2

    \[\leadsto \tan^{-1}_* \frac{\left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}{\cos \phi_1 \cdot \sin \phi_2 - \color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}}\]
  8. Final simplification0.2

    \[\leadsto \tan^{-1}_* \frac{\left(\sin \lambda_1 \cdot \cos \lambda_2 - \cos \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}{\cos \phi_1 \cdot \sin \phi_2 - \mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)}\]

Reproduce

herbie shell --seed 2020065 +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))))))