Average Error: 17.2 → 3.9
Time: 14.5s
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 + \log \left(e^{\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
\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 + \log \left(e^{\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 r25883 = phi1;
        double r25884 = sin(r25883);
        double r25885 = phi2;
        double r25886 = sin(r25885);
        double r25887 = r25884 * r25886;
        double r25888 = cos(r25883);
        double r25889 = cos(r25885);
        double r25890 = r25888 * r25889;
        double r25891 = lambda1;
        double r25892 = lambda2;
        double r25893 = r25891 - r25892;
        double r25894 = cos(r25893);
        double r25895 = r25890 * r25894;
        double r25896 = r25887 + r25895;
        double r25897 = acos(r25896);
        double r25898 = R;
        double r25899 = r25897 * r25898;
        return r25899;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r25900 = phi1;
        double r25901 = sin(r25900);
        double r25902 = phi2;
        double r25903 = sin(r25902);
        double r25904 = r25901 * r25903;
        double r25905 = cos(r25900);
        double r25906 = cos(r25902);
        double r25907 = r25905 * r25906;
        double r25908 = lambda1;
        double r25909 = cos(r25908);
        double r25910 = lambda2;
        double r25911 = cos(r25910);
        double r25912 = r25909 * r25911;
        double r25913 = sin(r25908);
        double r25914 = sin(r25910);
        double r25915 = r25913 * r25914;
        double r25916 = exp(r25915);
        double r25917 = log(r25916);
        double r25918 = r25912 + r25917;
        double r25919 = r25907 * r25918;
        double r25920 = r25904 + r25919;
        double r25921 = acos(r25920);
        double r25922 = R;
        double r25923 = r25921 * r25922;
        return r25923;
}

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

Reproduce

herbie shell --seed 2020060 
(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))