Average Error: 13.7 → 0.2
Time: 38.4s
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(\cos \lambda_2 \cdot \sin \lambda_1 - \cos \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}{\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(\cos \phi_1, \sin \phi_2, \sin \phi_1 \cdot \left(\left(-\cos \phi_2\right) \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right)\right)\right) + \mathsf{fma}\left(-\sin \phi_1, \cos \phi_2 \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right), \left(\cos \phi_2 \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right)\right) \cdot \sin \phi_1\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(\cos \lambda_2 \cdot \sin \lambda_1 - \cos \lambda_1 \cdot \sin \lambda_2\right) \cdot \cos \phi_2}{\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(\cos \phi_1, \sin \phi_2, \sin \phi_1 \cdot \left(\left(-\cos \phi_2\right) \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right)\right)\right) + \mathsf{fma}\left(-\sin \phi_1, \cos \phi_2 \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right), \left(\cos \phi_2 \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right)\right) \cdot \sin \phi_1\right)\right)\right)}
double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r5916500 = lambda1;
        double r5916501 = lambda2;
        double r5916502 = r5916500 - r5916501;
        double r5916503 = sin(r5916502);
        double r5916504 = phi2;
        double r5916505 = cos(r5916504);
        double r5916506 = r5916503 * r5916505;
        double r5916507 = phi1;
        double r5916508 = cos(r5916507);
        double r5916509 = sin(r5916504);
        double r5916510 = r5916508 * r5916509;
        double r5916511 = sin(r5916507);
        double r5916512 = r5916511 * r5916505;
        double r5916513 = cos(r5916502);
        double r5916514 = r5916512 * r5916513;
        double r5916515 = r5916510 - r5916514;
        double r5916516 = atan2(r5916506, r5916515);
        return r5916516;
}

double f(double lambda1, double lambda2, double phi1, double phi2) {
        double r5916517 = lambda2;
        double r5916518 = cos(r5916517);
        double r5916519 = lambda1;
        double r5916520 = sin(r5916519);
        double r5916521 = r5916518 * r5916520;
        double r5916522 = cos(r5916519);
        double r5916523 = sin(r5916517);
        double r5916524 = r5916522 * r5916523;
        double r5916525 = r5916521 - r5916524;
        double r5916526 = phi2;
        double r5916527 = cos(r5916526);
        double r5916528 = r5916525 * r5916527;
        double r5916529 = phi1;
        double r5916530 = cos(r5916529);
        double r5916531 = sin(r5916526);
        double r5916532 = sin(r5916529);
        double r5916533 = -r5916527;
        double r5916534 = r5916518 * r5916522;
        double r5916535 = fma(r5916523, r5916520, r5916534);
        double r5916536 = r5916533 * r5916535;
        double r5916537 = r5916532 * r5916536;
        double r5916538 = fma(r5916530, r5916531, r5916537);
        double r5916539 = -r5916532;
        double r5916540 = r5916527 * r5916535;
        double r5916541 = r5916540 * r5916532;
        double r5916542 = fma(r5916539, r5916540, r5916541);
        double r5916543 = r5916538 + r5916542;
        double r5916544 = log1p(r5916543);
        double r5916545 = expm1(r5916544);
        double r5916546 = atan2(r5916528, r5916545);
        return r5916546;
}

Error

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 13.7

    \[\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.9

    \[\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. Applied distribute-rgt-in0.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}{\left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\sin \phi_1 \cdot \cos \phi_2\right) + \left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \left(\sin \phi_1 \cdot \cos \phi_2\right)\right)}}\]
  7. Using strategy rm
  8. Applied expm1-log1p-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}{\color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\cos \phi_1 \cdot \sin \phi_2 - \left(\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\sin \phi_1 \cdot \cos \phi_2\right) + \left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \left(\sin \phi_1 \cdot \cos \phi_2\right)\right)\right)\right)}}\]
  9. Simplified0.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}{\mathsf{expm1}\left(\color{blue}{\mathsf{log1p}\left(\cos \phi_1 \cdot \sin \phi_2 - \left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2\right) \cdot \sin \phi_1\right)}\right)}\]
  10. Using strategy rm
  11. Applied prod-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}{\mathsf{expm1}\left(\mathsf{log1p}\left(\color{blue}{\mathsf{fma}\left(\cos \phi_1, \sin \phi_2, -\sin \phi_1 \cdot \left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2\right)\right) + \mathsf{fma}\left(-\sin \phi_1, \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2, \sin \phi_1 \cdot \left(\mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_2 \cdot \cos \lambda_1\right) \cdot \cos \phi_2\right)\right)}\right)\right)}\]
  12. Final simplification0.2

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

Reproduce

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