Average Error: 16.9 → 3.9
Time: 36.4s
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\]
\[e^{\mathsf{log1p}\left(\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_1 \cdot \cos \lambda_2\right)\right)\right) - 1\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
e^{\mathsf{log1p}\left(\cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \mathsf{fma}\left(\sin \lambda_2, \sin \lambda_1, \cos \lambda_1 \cdot \cos \lambda_2\right)\right)\right) - 1\right)} \cdot R
double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r23061 = phi1;
        double r23062 = sin(r23061);
        double r23063 = phi2;
        double r23064 = sin(r23063);
        double r23065 = r23062 * r23064;
        double r23066 = cos(r23061);
        double r23067 = cos(r23063);
        double r23068 = r23066 * r23067;
        double r23069 = lambda1;
        double r23070 = lambda2;
        double r23071 = r23069 - r23070;
        double r23072 = cos(r23071);
        double r23073 = r23068 * r23072;
        double r23074 = r23065 + r23073;
        double r23075 = acos(r23074);
        double r23076 = R;
        double r23077 = r23075 * r23076;
        return r23077;
}

double f(double R, double lambda1, double lambda2, double phi1, double phi2) {
        double r23078 = phi1;
        double r23079 = sin(r23078);
        double r23080 = phi2;
        double r23081 = sin(r23080);
        double r23082 = cos(r23078);
        double r23083 = cos(r23080);
        double r23084 = r23082 * r23083;
        double r23085 = lambda2;
        double r23086 = sin(r23085);
        double r23087 = lambda1;
        double r23088 = sin(r23087);
        double r23089 = cos(r23087);
        double r23090 = cos(r23085);
        double r23091 = r23089 * r23090;
        double r23092 = fma(r23086, r23088, r23091);
        double r23093 = r23084 * r23092;
        double r23094 = fma(r23079, r23081, r23093);
        double r23095 = acos(r23094);
        double r23096 = 1.0;
        double r23097 = r23095 - r23096;
        double r23098 = log1p(r23097);
        double r23099 = exp(r23098);
        double r23100 = R;
        double r23101 = r23099 * r23100;
        return r23101;
}

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

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

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

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \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)\right) \cdot R\]
  5. Applied distribute-lft-in3.9

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

    \[\leadsto \cos^{-1} \left(\mathsf{fma}\left(\sin \phi_1, \sin \phi_2, \color{blue}{\left(\cos \lambda_1 \cdot \cos \lambda_2\right) \cdot \left(\cos \phi_1 \cdot \cos \phi_2\right)} + \left(\cos \phi_1 \cdot \cos \phi_2\right) \cdot \left(\sin \lambda_1 \cdot \sin \lambda_2\right)\right)\right) \cdot R\]
  7. Using strategy rm
  8. Applied add-exp-log3.9

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

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

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

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

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

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

Reproduce

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