Average Error: 17.2 → 3.9
Time: 13.8s
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(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_1 \cdot \sin \lambda_2\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(\sin \phi_1 \cdot \sin \phi_2 + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\cos \lambda_1 \cdot \cos \lambda_2 + \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r23581 = phi1;
        double r23582 = sin(r23581);
        double r23583 = phi2;
        double r23584 = sin(r23583);
        double r23585 = r23582 * r23584;
        double r23586 = cos(r23581);
        double r23587 = cos(r23583);
        double r23588 = r23586 * r23587;
        double r23589 = lambda1;
        double r23590 = lambda2;
        double r23591 = r23589 - r23590;
        double r23592 = cos(r23591);
        double r23593 = r23588 * r23592;
        double r23594 = r23585 + r23593;
        double r23595 = acos(r23594);
        double r23596 = R;
        double r23597 = r23595 * r23596;
        return r23597;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r23598 = phi1;
        double r23599 = sin(r23598);
        double r23600 = phi2;
        double r23601 = sin(r23600);
        double r23602 = r23599 * r23601;
        double r23603 = cos(r23598);
        double r23604 = cos(r23600);
        double r23605 = r23603 * r23604;
        double r23606 = lambda1;
        double r23607 = cos(r23606);
        double r23608 = lambda2;
        double r23609 = cos(r23608);
        double r23610 = r23607 * r23609;
        double r23611 = sin(r23606);
        double r23612 = sin(r23608);
        double r23613 = r23611 * r23612;
        double r23614 = expm1(r23613);
        double r23615 = log1p(r23614);
        double r23616 = r23610 + r23615;
        double r23617 = r23605 * r23616;
        double r23618 = r23602 + r23617;
        double r23619 = acos(r23618);
        double r23620 = R;
        double r23621 = r23619 * r23620;
        return r23621;
}

Error

Bits error versus R

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 17.2

    \[\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. Using strategy rm
  3. Applied cos-diff3.9

    \[\leadsto \cos^{-1} \left(\sin \phi_1 \cdot \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) \cdot R\]
  4. Using strategy rm
  5. Applied log1p-expm1-u3.9

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

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

Reproduce

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