Average Error: 16.7 → 3.6
Time: 52.3s
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{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_2 \cdot \sin \lambda_1\right)\right) + \cos \lambda_2 \cdot \cos \lambda_1, \sin \phi_1 \cdot \sin \phi_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{fma}\left(\cos \phi_2 \cdot \cos \phi_1, \mathsf{log1p}\left(\mathsf{expm1}\left(\sin \lambda_2 \cdot \sin \lambda_1\right)\right) + \cos \lambda_2 \cdot \cos \lambda_1, \sin \phi_1 \cdot \sin \phi_2\right)\right) \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r905876 = phi1;
        double r905877 = sin(r905876);
        double r905878 = phi2;
        double r905879 = sin(r905878);
        double r905880 = r905877 * r905879;
        double r905881 = cos(r905876);
        double r905882 = cos(r905878);
        double r905883 = r905881 * r905882;
        double r905884 = lambda1;
        double r905885 = lambda2;
        double r905886 = r905884 - r905885;
        double r905887 = cos(r905886);
        double r905888 = r905883 * r905887;
        double r905889 = r905880 + r905888;
        double r905890 = acos(r905889);
        double r905891 = R;
        double r905892 = r905890 * r905891;
        return r905892;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r905893 = phi2;
        double r905894 = cos(r905893);
        double r905895 = phi1;
        double r905896 = cos(r905895);
        double r905897 = r905894 * r905896;
        double r905898 = lambda2;
        double r905899 = sin(r905898);
        double r905900 = lambda1;
        double r905901 = sin(r905900);
        double r905902 = r905899 * r905901;
        double r905903 = expm1(r905902);
        double r905904 = log1p(r905903);
        double r905905 = cos(r905898);
        double r905906 = cos(r905900);
        double r905907 = r905905 * r905906;
        double r905908 = r905904 + r905907;
        double r905909 = sin(r905895);
        double r905910 = sin(r905893);
        double r905911 = r905909 * r905910;
        double r905912 = fma(r905897, r905908, r905911);
        double r905913 = acos(r905912);
        double r905914 = R;
        double r905915 = r905913 * r905914;
        return r905915;
}

Error

Bits error versus R

Bits error versus lambda1

Bits error versus lambda2

Bits error versus phi1

Bits error versus phi2

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

    \[\leadsto \color{blue}{R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \left(\lambda_1 - \lambda_2\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)}\]
  3. Using strategy rm
  4. Applied cos-diff3.6

    \[\leadsto R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \color{blue}{\cos \lambda_1 \cdot \cos \lambda_2 + \sin \lambda_1 \cdot \sin \lambda_2}, \sin \phi_2 \cdot \sin \phi_1\right)\right)\]
  5. Using strategy rm
  6. Applied add-log-exp3.6

    \[\leadsto R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \lambda_1 \cdot \cos \lambda_2 + \color{blue}{\log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)}, \sin \phi_2 \cdot \sin \phi_1\right)\right)\]
  7. Using strategy rm
  8. Applied log1p-expm1-u3.6

    \[\leadsto R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \lambda_1 \cdot \cos \lambda_2 + \color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\left(\log \left(e^{\sin \lambda_1 \cdot \sin \lambda_2}\right)\right)\right)}, \sin \phi_2 \cdot \sin \phi_1\right)\right)\]
  9. Simplified3.6

    \[\leadsto R \cdot \cos^{-1} \left(\mathsf{fma}\left(\cos \phi_1 \cdot \cos \phi_2, \cos \lambda_1 \cdot \cos \lambda_2 + \mathsf{log1p}\left(\color{blue}{\mathsf{expm1}\left(\sin \lambda_2 \cdot \sin \lambda_1\right)}\right), \sin \phi_2 \cdot \sin \phi_1\right)\right)\]
  10. Final simplification3.6

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

Reproduce

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