Average Error: 39.5 → 0.8
Time: 10.4s
Precision: 64
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -2.79128728496023378 \cdot 10^{-8} \lor \neg \left(\varepsilon \le 2.5399061161975948 \cdot 10^{-5}\right):\\ \;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right) - \cos x\\ \mathbf{else}:\\ \;\;\;\;-2 \cdot \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\mathsf{fma}\left(x, 2, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\\ \end{array}\]
\cos \left(x + \varepsilon\right) - \cos x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.79128728496023378 \cdot 10^{-8} \lor \neg \left(\varepsilon \le 2.5399061161975948 \cdot 10^{-5}\right):\\
\;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right) - \cos x\\

\mathbf{else}:\\
\;\;\;\;-2 \cdot \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\mathsf{fma}\left(x, 2, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\\

\end{array}
double f(double x, double eps) {
        double r59977 = x;
        double r59978 = eps;
        double r59979 = r59977 + r59978;
        double r59980 = cos(r59979);
        double r59981 = cos(r59977);
        double r59982 = r59980 - r59981;
        return r59982;
}

double f(double x, double eps) {
        double r59983 = eps;
        double r59984 = -2.7912872849602338e-08;
        bool r59985 = r59983 <= r59984;
        double r59986 = 2.5399061161975948e-05;
        bool r59987 = r59983 <= r59986;
        double r59988 = !r59987;
        bool r59989 = r59985 || r59988;
        double r59990 = x;
        double r59991 = cos(r59990);
        double r59992 = cos(r59983);
        double r59993 = r59991 * r59992;
        double r59994 = sin(r59990);
        double r59995 = sin(r59983);
        double r59996 = r59994 * r59995;
        double r59997 = r59993 - r59996;
        double r59998 = r59997 - r59991;
        double r59999 = -2.0;
        double r60000 = 2.0;
        double r60001 = fma(r59990, r60000, r59983);
        double r60002 = r60001 / r60000;
        double r60003 = sin(r60002);
        double r60004 = expm1(r60003);
        double r60005 = log1p(r60004);
        double r60006 = r59983 / r60000;
        double r60007 = sin(r60006);
        double r60008 = r60005 * r60007;
        double r60009 = r59999 * r60008;
        double r60010 = r59989 ? r59998 : r60009;
        return r60010;
}

Error

Bits error versus x

Bits error versus eps

Derivation

  1. Split input into 2 regimes
  2. if eps < -2.7912872849602338e-08 or 2.5399061161975948e-05 < eps

    1. Initial program 30.2

      \[\cos \left(x + \varepsilon\right) - \cos x\]
    2. Using strategy rm
    3. Applied cos-sum1.1

      \[\leadsto \color{blue}{\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right)} - \cos x\]

    if -2.7912872849602338e-08 < eps < 2.5399061161975948e-05

    1. Initial program 49.4

      \[\cos \left(x + \varepsilon\right) - \cos x\]
    2. Using strategy rm
    3. Applied diff-cos38.0

      \[\leadsto \color{blue}{-2 \cdot \left(\sin \left(\frac{\left(x + \varepsilon\right) - x}{2}\right) \cdot \sin \left(\frac{\left(x + \varepsilon\right) + x}{2}\right)\right)}\]
    4. Simplified0.5

      \[\leadsto -2 \cdot \color{blue}{\left(\sin \left(\frac{\varepsilon - 0}{2}\right) \cdot \sin \left(\frac{\left(x + \varepsilon\right) + x}{2}\right)\right)}\]
    5. Using strategy rm
    6. Applied expm1-log1p-u0.5

      \[\leadsto -2 \cdot \left(\sin \left(\frac{\varepsilon - 0}{2}\right) \cdot \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\left(x + \varepsilon\right) + x}{2}\right)\right)\right)}\right)\]
    7. Simplified0.5

      \[\leadsto -2 \cdot \left(\sin \left(\frac{\varepsilon - 0}{2}\right) \cdot \mathsf{expm1}\left(\color{blue}{\mathsf{log1p}\left(\sin \left(\frac{\mathsf{fma}\left(x, 2, \varepsilon\right)}{2}\right)\right)}\right)\right)\]
    8. Using strategy rm
    9. Applied log1p-expm1-u0.6

      \[\leadsto -2 \cdot \left(\sin \left(\frac{\varepsilon - 0}{2}\right) \cdot \color{blue}{\mathsf{log1p}\left(\mathsf{expm1}\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\mathsf{fma}\left(x, 2, \varepsilon\right)}{2}\right)\right)\right)\right)\right)}\right)\]
    10. Simplified0.5

      \[\leadsto -2 \cdot \left(\sin \left(\frac{\varepsilon - 0}{2}\right) \cdot \mathsf{log1p}\left(\color{blue}{\mathsf{expm1}\left(\sin \left(\frac{\mathsf{fma}\left(x, 2, \varepsilon\right)}{2}\right)\right)}\right)\right)\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le -2.79128728496023378 \cdot 10^{-8} \lor \neg \left(\varepsilon \le 2.5399061161975948 \cdot 10^{-5}\right):\\ \;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right) - \cos x\\ \mathbf{else}:\\ \;\;\;\;-2 \cdot \left(\mathsf{log1p}\left(\mathsf{expm1}\left(\sin \left(\frac{\mathsf{fma}\left(x, 2, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2020045 +o rules:numerics
(FPCore (x eps)
  :name "2cos (problem 3.3.5)"
  :precision binary64
  (- (cos (+ x eps)) (cos x)))