Average Error: 16.7 → 3.8
Time: 13.7s
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(\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right) + \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) \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(\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right) + \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) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r21760 = phi1;
        double r21761 = sin(r21760);
        double r21762 = phi2;
        double r21763 = sin(r21762);
        double r21764 = r21761 * r21763;
        double r21765 = cos(r21760);
        double r21766 = cos(r21762);
        double r21767 = r21765 * r21766;
        double r21768 = lambda1;
        double r21769 = lambda2;
        double r21770 = r21768 - r21769;
        double r21771 = cos(r21770);
        double r21772 = r21767 * r21771;
        double r21773 = r21764 + r21772;
        double r21774 = acos(r21773);
        double r21775 = R;
        double r21776 = r21774 * r21775;
        return r21776;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r21777 = phi1;
        double r21778 = sin(r21777);
        double r21779 = phi2;
        double r21780 = sin(r21779);
        double r21781 = r21778 * r21780;
        double r21782 = exp(r21781);
        double r21783 = log(r21782);
        double r21784 = cos(r21777);
        double r21785 = cos(r21779);
        double r21786 = r21784 * r21785;
        double r21787 = lambda1;
        double r21788 = cos(r21787);
        double r21789 = lambda2;
        double r21790 = cos(r21789);
        double r21791 = r21788 * r21790;
        double r21792 = sin(r21787);
        double r21793 = sin(r21789);
        double r21794 = r21792 * r21793;
        double r21795 = r21791 + r21794;
        double r21796 = r21786 * r21795;
        double r21797 = r21783 + r21796;
        double r21798 = acos(r21797);
        double r21799 = R;
        double r21800 = r21798 * r21799;
        return r21800;
}

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.7

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

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

    \[\leadsto \cos^{-1} \left(\color{blue}{\log \left(e^{\sin \phi_1 \cdot \sin \phi_2}\right)} + \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) \cdot R\]
  6. Final simplification3.8

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

Reproduce

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