Average Error: 17.2 → 4.0
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(\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) \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 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r27770 = phi1;
        double r27771 = sin(r27770);
        double r27772 = phi2;
        double r27773 = sin(r27772);
        double r27774 = r27771 * r27773;
        double r27775 = cos(r27770);
        double r27776 = cos(r27772);
        double r27777 = r27775 * r27776;
        double r27778 = lambda1;
        double r27779 = lambda2;
        double r27780 = r27778 - r27779;
        double r27781 = cos(r27780);
        double r27782 = r27777 * r27781;
        double r27783 = r27774 + r27782;
        double r27784 = acos(r27783);
        double r27785 = R;
        double r27786 = r27784 * r27785;
        return r27786;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r27787 = phi1;
        double r27788 = sin(r27787);
        double r27789 = phi2;
        double r27790 = sin(r27789);
        double r27791 = r27788 * r27790;
        double r27792 = cos(r27787);
        double r27793 = cos(r27789);
        double r27794 = r27792 * r27793;
        double r27795 = lambda1;
        double r27796 = cos(r27795);
        double r27797 = lambda2;
        double r27798 = cos(r27797);
        double r27799 = r27796 * r27798;
        double r27800 = sin(r27795);
        double r27801 = sin(r27797);
        double r27802 = r27800 * r27801;
        double r27803 = r27799 + r27802;
        double r27804 = r27794 * r27803;
        double r27805 = r27791 + r27804;
        double r27806 = acos(r27805);
        double r27807 = R;
        double r27808 = r27806 * r27807;
        return r27808;
}

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

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

    \[\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 + \sin \lambda_1 \cdot \sin \lambda_2\right)\right) \cdot R\]

Reproduce

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