Average Error: 16.9 → 3.9
Time: 13.4s
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\]
\[\log \left(e^{\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 + \sin \lambda_1 \cdot \sin \lambda_2\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
\log \left(e^{\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 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r26703 = phi1;
        double r26704 = sin(r26703);
        double r26705 = phi2;
        double r26706 = sin(r26705);
        double r26707 = r26704 * r26706;
        double r26708 = cos(r26703);
        double r26709 = cos(r26705);
        double r26710 = r26708 * r26709;
        double r26711 = lambda1;
        double r26712 = lambda2;
        double r26713 = r26711 - r26712;
        double r26714 = cos(r26713);
        double r26715 = r26710 * r26714;
        double r26716 = r26707 + r26715;
        double r26717 = acos(r26716);
        double r26718 = R;
        double r26719 = r26717 * r26718;
        return r26719;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r26720 = phi1;
        double r26721 = sin(r26720);
        double r26722 = phi2;
        double r26723 = sin(r26722);
        double r26724 = r26721 * r26723;
        double r26725 = cos(r26720);
        double r26726 = cos(r26722);
        double r26727 = r26725 * r26726;
        double r26728 = lambda1;
        double r26729 = cos(r26728);
        double r26730 = lambda2;
        double r26731 = cos(r26730);
        double r26732 = r26729 * r26731;
        double r26733 = sin(r26728);
        double r26734 = sin(r26730);
        double r26735 = r26733 * r26734;
        double r26736 = r26732 + r26735;
        double r26737 = r26727 * r26736;
        double r26738 = r26724 + r26737;
        double r26739 = acos(r26738);
        double r26740 = exp(r26739);
        double r26741 = log(r26740);
        double r26742 = R;
        double r26743 = r26741 * r26742;
        return r26743;
}

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 16.9

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

    \[\leadsto \color{blue}{\log \left(e^{\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 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}\right)} \cdot R\]
  6. Final simplification3.9

    \[\leadsto \log \left(e^{\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 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right)}\right) \cdot R\]

Reproduce

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