Average Error: 39.9 → 0.9
Time: 19.5s
Precision: 64
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -6443.306290177518349082674831151962280273 \lor \neg \left(\varepsilon \le 1.459775390859078191777703503717589228472 \cdot 10^{-4}\right):\\ \;\;\;\;\left(\cos \varepsilon \cdot \cos x - \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(2, x, \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 -6443.306290177518349082674831151962280273 \lor \neg \left(\varepsilon \le 1.459775390859078191777703503717589228472 \cdot 10^{-4}\right):\\
\;\;\;\;\left(\cos \varepsilon \cdot \cos x - \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(2, x, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\\

\end{array}
double f(double x, double eps) {
        double r37514 = x;
        double r37515 = eps;
        double r37516 = r37514 + r37515;
        double r37517 = cos(r37516);
        double r37518 = cos(r37514);
        double r37519 = r37517 - r37518;
        return r37519;
}

double f(double x, double eps) {
        double r37520 = eps;
        double r37521 = -6443.306290177518;
        bool r37522 = r37520 <= r37521;
        double r37523 = 0.00014597753908590782;
        bool r37524 = r37520 <= r37523;
        double r37525 = !r37524;
        bool r37526 = r37522 || r37525;
        double r37527 = cos(r37520);
        double r37528 = x;
        double r37529 = cos(r37528);
        double r37530 = r37527 * r37529;
        double r37531 = sin(r37528);
        double r37532 = sin(r37520);
        double r37533 = r37531 * r37532;
        double r37534 = r37530 - r37533;
        double r37535 = r37534 - r37529;
        double r37536 = -2.0;
        double r37537 = 2.0;
        double r37538 = fma(r37537, r37528, r37520);
        double r37539 = r37538 / r37537;
        double r37540 = sin(r37539);
        double r37541 = expm1(r37540);
        double r37542 = log1p(r37541);
        double r37543 = r37520 / r37537;
        double r37544 = sin(r37543);
        double r37545 = r37542 * r37544;
        double r37546 = r37536 * r37545;
        double r37547 = r37526 ? r37535 : r37546;
        return r37547;
}

Error

Bits error versus x

Bits error versus eps

Derivation

  1. Split input into 2 regimes
  2. if eps < -6443.306290177518 or 0.00014597753908590782 < eps

    1. Initial program 30.3

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

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

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

    if -6443.306290177518 < eps < 0.00014597753908590782

    1. Initial program 49.7

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

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

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

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

      \[\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(2, x, \varepsilon\right)}{2}\right)\right)}\right)\right)\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.9

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le -6443.306290177518349082674831151962280273 \lor \neg \left(\varepsilon \le 1.459775390859078191777703503717589228472 \cdot 10^{-4}\right):\\ \;\;\;\;\left(\cos \varepsilon \cdot \cos x - \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(2, x, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\\ \end{array}\]

Reproduce

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