Average Error: 16.5 → 3.6
Time: 45.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(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \phi_1 \cdot \sin \phi_2\right)\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(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \phi_1 \cdot \sin \phi_2\right)\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 r20822 = phi1;
        double r20823 = sin(r20822);
        double r20824 = phi2;
        double r20825 = sin(r20824);
        double r20826 = r20823 * r20825;
        double r20827 = cos(r20822);
        double r20828 = cos(r20824);
        double r20829 = r20827 * r20828;
        double r20830 = lambda1;
        double r20831 = lambda2;
        double r20832 = r20830 - r20831;
        double r20833 = cos(r20832);
        double r20834 = r20829 * r20833;
        double r20835 = r20826 + r20834;
        double r20836 = acos(r20835);
        double r20837 = R;
        double r20838 = r20836 * r20837;
        return r20838;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r20839 = phi1;
        double r20840 = sin(r20839);
        double r20841 = phi2;
        double r20842 = sin(r20841);
        double r20843 = r20840 * r20842;
        double r20844 = log1p(r20843);
        double r20845 = expm1(r20844);
        double r20846 = cos(r20839);
        double r20847 = cos(r20841);
        double r20848 = r20846 * r20847;
        double r20849 = lambda1;
        double r20850 = cos(r20849);
        double r20851 = lambda2;
        double r20852 = cos(r20851);
        double r20853 = r20850 * r20852;
        double r20854 = sin(r20849);
        double r20855 = sin(r20851);
        double r20856 = r20854 * r20855;
        double r20857 = r20853 + r20856;
        double r20858 = r20848 * r20857;
        double r20859 = r20845 + r20858;
        double r20860 = acos(r20859);
        double r20861 = R;
        double r20862 = r20860 * r20861;
        return r20862;
}

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

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

    \[\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 expm1-log1p-u3.6

    \[\leadsto \cos^{-1} \left(\color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \phi_1 \cdot \sin \phi_2\right)\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.6

    \[\leadsto \cos^{-1} \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \phi_1 \cdot \sin \phi_2\right)\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 2019303 +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))