Average Error: 16.3 → 3.7
Time: 47.3s
Precision: 64
\[\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R\]
\[\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sqrt[3]{{\left(\sin \lambda_1 \cdot \sin \lambda_2\right)}^{3}}\right)\right)\right) \cdot R\]
\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R
\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sqrt[3]{{\left(\sin \lambda_1 \cdot \sin \lambda_2\right)}^{3}}\right)\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r25430 = phi1;
        double r25431 = sin(r25430);
        double r25432 = phi2;
        double r25433 = sin(r25432);
        double r25434 = r25431 * r25433;
        double r25435 = cos(r25430);
        double r25436 = cos(r25432);
        double r25437 = r25435 * r25436;
        double r25438 = lambda1;
        double r25439 = lambda2;
        double r25440 = r25438 - r25439;
        double r25441 = cos(r25440);
        double r25442 = r25437 * r25441;
        double r25443 = r25434 + r25442;
        double r25444 = acos(r25443);
        double r25445 = R;
        double r25446 = r25444 * r25445;
        return r25446;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r25447 = phi1;
        double r25448 = sin(r25447);
        double r25449 = phi2;
        double r25450 = sin(r25449);
        double r25451 = cos(r25447);
        double r25452 = cos(r25449);
        double r25453 = r25451 * r25452;
        double r25454 = lambda2;
        double r25455 = cos(r25454);
        double r25456 = lambda1;
        double r25457 = cos(r25456);
        double r25458 = r25455 * r25457;
        double r25459 = sin(r25456);
        double r25460 = sin(r25454);
        double r25461 = r25459 * r25460;
        double r25462 = 3.0;
        double r25463 = pow(r25461, r25462);
        double r25464 = cbrt(r25463);
        double r25465 = r25458 + r25464;
        double r25466 = r25453 * r25465;
        double r25467 = fma(r25448, r25450, r25466);
        double r25468 = acos(r25467);
        double r25469 = R;
        double r25470 = r25468 * r25469;
        return r25470;
}

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

Derivation

  1. Initial program 16.3

    \[\cos^{-1} \left(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right) \cdot R\]
  2. Simplified16.3

    \[\leadsto \color{blue}{\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \cos \left(\lambda_1 - \lambda_2\right)\right)\right) \cdot R}\]
  3. Using strategy rm
  4. Applied cos-diff3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \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)}\right)\right) \cdot R\]
  5. Simplified3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\color{blue}{\cos \lambda_2 \cdot \cos \lambda_1} + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right) \cdot R\]
  6. Simplified3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \color{blue}{\sin \lambda_2 \cdot \sin \lambda_1}\right)\right)\right) \cdot R\]
  7. Using strategy rm
  8. Applied add-cbrt-cube3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sin \lambda_2 \cdot \color{blue}{\sqrt[3]{\left(\sin \lambda_1 \cdot \sin \lambda_1\right) \cdot \sin \lambda_1}}\right)\right)\right) \cdot R\]
  9. Applied add-cbrt-cube3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \color{blue}{\sqrt[3]{\left(\sin \lambda_2 \cdot \sin \lambda_2\right) \cdot \sin \lambda_2}} \cdot \sqrt[3]{\left(\sin \lambda_1 \cdot \sin \lambda_1\right) \cdot \sin \lambda_1}\right)\right)\right) \cdot R\]
  10. Applied cbrt-unprod3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \color{blue}{\sqrt[3]{\left(\left(\sin \lambda_2 \cdot \sin \lambda_2\right) \cdot \sin \lambda_2\right) \cdot \left(\left(\sin \lambda_1 \cdot \sin \lambda_1\right) \cdot \sin \lambda_1\right)}}\right)\right)\right) \cdot R\]
  11. Simplified3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sqrt[3]{\color{blue}{{\left(\sin \lambda_1 \cdot \sin \lambda_2\right)}^{3}}}\right)\right)\right) \cdot R\]
  12. Final simplification3.7

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_2 \cdot \cos \lambda_1 + \sqrt[3]{{\left(\sin \lambda_1 \cdot \sin \lambda_2\right)}^{3}}\right)\right)\right) \cdot R\]

Reproduce

herbie shell --seed 2019325 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
  :name "Spherical law of cosines"
  :precision binary64
  (* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R))