Average Error: 16.4 → 3.8
Time: 50.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\]
\[R \cdot \cos^{-1} \left(\left(\cos \lambda_1 \cdot \cos \lambda_2 + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \phi_2 \cdot \sin \phi_1\right)\right)\right)\]
\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
R \cdot \cos^{-1} \left(\left(\cos \lambda_1 \cdot \cos \lambda_2 + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \phi_2 \cdot \sin \phi_1\right)\right)\right)
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r364802 = phi1;
        double r364803 = sin(r364802);
        double r364804 = phi2;
        double r364805 = sin(r364804);
        double r364806 = r364803 * r364805;
        double r364807 = cos(r364802);
        double r364808 = cos(r364804);
        double r364809 = r364807 * r364808;
        double r364810 = lambda1;
        double r364811 = lambda2;
        double r364812 = r364810 - r364811;
        double r364813 = cos(r364812);
        double r364814 = r364809 * r364813;
        double r364815 = r364806 + r364814;
        double r364816 = acos(r364815);
        double r364817 = R;
        double r364818 = r364816 * r364817;
        return r364818;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r364819 = R;
        double r364820 = lambda1;
        double r364821 = cos(r364820);
        double r364822 = lambda2;
        double r364823 = cos(r364822);
        double r364824 = r364821 * r364823;
        double r364825 = sin(r364820);
        double r364826 = sin(r364822);
        double r364827 = r364825 * r364826;
        double r364828 = exp(r364827);
        double r364829 = log(r364828);
        double r364830 = r364824 + r364829;
        double r364831 = phi1;
        double r364832 = cos(r364831);
        double r364833 = phi2;
        double r364834 = cos(r364833);
        double r364835 = r364832 * r364834;
        double r364836 = r364830 * r364835;
        double r364837 = sin(r364833);
        double r364838 = sin(r364831);
        double r364839 = r364837 * r364838;
        double r364840 = log1p(r364839);
        double r364841 = expm1(r364840);
        double r364842 = r364836 + r364841;
        double r364843 = acos(r364842);
        double r364844 = r364819 * r364843;
        return r364844;
}

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

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

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

    \[\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. Using strategy rm
  7. Applied add-log-exp3.8

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

    \[\leadsto R \cdot \cos^{-1} \left(\left(\cos \lambda_1 \cdot \cos \lambda_2 + \log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right) + \mathsf{expm1}\left(\mathsf{log1p}\left(\sin \phi_2 \cdot \sin \phi_1\right)\right)\right)\]

Reproduce

herbie shell --seed 2019142 +o rules:numerics
(FPCore (R lambda1 lambda2 phi1 phi2)
  :name "Spherical law of cosines"
  (* (acos (+ (* (sin phi1) (sin phi2)) (* (* (cos phi1) (cos phi2)) (cos (- lambda1 lambda2))))) R))