Average Error: 17.0 → 3.9
Time: 30.0s
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 \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right)\right)\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 \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right)\right)\right)\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r24403 = phi1;
        double r24404 = sin(r24403);
        double r24405 = phi2;
        double r24406 = sin(r24405);
        double r24407 = r24404 * r24406;
        double r24408 = cos(r24403);
        double r24409 = cos(r24405);
        double r24410 = r24408 * r24409;
        double r24411 = lambda1;
        double r24412 = lambda2;
        double r24413 = r24411 - r24412;
        double r24414 = cos(r24413);
        double r24415 = r24410 * r24414;
        double r24416 = r24407 + r24415;
        double r24417 = acos(r24416);
        double r24418 = R;
        double r24419 = r24417 * r24418;
        return r24419;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r24420 = phi1;
        double r24421 = sin(r24420);
        double r24422 = phi2;
        double r24423 = sin(r24422);
        double r24424 = lambda1;
        double r24425 = cos(r24424);
        double r24426 = lambda2;
        double r24427 = cos(r24426);
        double r24428 = r24425 * r24427;
        double r24429 = cos(r24420);
        double r24430 = cos(r24422);
        double r24431 = r24429 * r24430;
        double r24432 = r24428 * r24431;
        double r24433 = sin(r24424);
        double r24434 = sin(r24426);
        double r24435 = r24433 * r24434;
        double r24436 = r24435 * r24431;
        double r24437 = expm1(r24436);
        double r24438 = log1p(r24437);
        double r24439 = r24432 + r24438;
        double r24440 = fma(r24421, r24423, r24439);
        double r24441 = acos(r24440);
        double r24442 = R;
        double r24443 = r24441 * r24442;
        return r24443;
}

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 17.0

    \[\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. Simplified17.0

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

    \[\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. Applied distribute-lft-in3.9

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

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

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

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\left(\left(\sin \lambda_1 \cdot \sin \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right)\right)\right)}\right)\right) \cdot R\]
  10. Final simplification3.9

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

Reproduce

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