Average Error: 39.5 → 0.7
Time: 22.1s
Precision: 64
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -2.68493806133625336628177219600380198905 \cdot 10^{-8}:\\ \;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin \varepsilon, \sin x, \cos x\right)\\ \mathbf{elif}\;\varepsilon \le 1.036014288510746111270565891770978339537 \cdot 10^{-6}:\\ \;\;\;\;\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\varepsilon \cdot \frac{1}{2}\right)\right) \cdot -2\\ \mathbf{else}:\\ \;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin \varepsilon \cdot \sin x\right) - \cos x\\ \end{array}\]
\cos \left(x + \varepsilon\right) - \cos x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.68493806133625336628177219600380198905 \cdot 10^{-8}:\\
\;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin \varepsilon, \sin x, \cos x\right)\\

\mathbf{elif}\;\varepsilon \le 1.036014288510746111270565891770978339537 \cdot 10^{-6}:\\
\;\;\;\;\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\varepsilon \cdot \frac{1}{2}\right)\right) \cdot -2\\

\mathbf{else}:\\
\;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin \varepsilon \cdot \sin x\right) - \cos x\\

\end{array}
double f(double x, double eps) {
        double r2473464 = x;
        double r2473465 = eps;
        double r2473466 = r2473464 + r2473465;
        double r2473467 = cos(r2473466);
        double r2473468 = cos(r2473464);
        double r2473469 = r2473467 - r2473468;
        return r2473469;
}

double f(double x, double eps) {
        double r2473470 = eps;
        double r2473471 = -2.6849380613362534e-08;
        bool r2473472 = r2473470 <= r2473471;
        double r2473473 = x;
        double r2473474 = cos(r2473473);
        double r2473475 = cos(r2473470);
        double r2473476 = r2473474 * r2473475;
        double r2473477 = sin(r2473470);
        double r2473478 = sin(r2473473);
        double r2473479 = fma(r2473477, r2473478, r2473474);
        double r2473480 = r2473476 - r2473479;
        double r2473481 = 1.0360142885107461e-06;
        bool r2473482 = r2473470 <= r2473481;
        double r2473483 = 2.0;
        double r2473484 = fma(r2473483, r2473473, r2473470);
        double r2473485 = r2473484 / r2473483;
        double r2473486 = sin(r2473485);
        double r2473487 = log1p(r2473486);
        double r2473488 = expm1(r2473487);
        double r2473489 = 0.5;
        double r2473490 = r2473470 * r2473489;
        double r2473491 = sin(r2473490);
        double r2473492 = r2473488 * r2473491;
        double r2473493 = -2.0;
        double r2473494 = r2473492 * r2473493;
        double r2473495 = r2473477 * r2473478;
        double r2473496 = r2473476 - r2473495;
        double r2473497 = r2473496 - r2473474;
        double r2473498 = r2473482 ? r2473494 : r2473497;
        double r2473499 = r2473472 ? r2473480 : r2473498;
        return r2473499;
}

Error

Bits error versus x

Bits error versus eps

Derivation

  1. Split input into 3 regimes
  2. if eps < -2.6849380613362534e-08

    1. Initial program 29.6

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

      \[\leadsto \color{blue}{\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right)} - \cos x\]
    4. Applied associate--l-1.0

      \[\leadsto \color{blue}{\cos x \cdot \cos \varepsilon - \left(\sin x \cdot \sin \varepsilon + \cos x\right)}\]
    5. Simplified1.0

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

    if -2.6849380613362534e-08 < eps < 1.0360142885107461e-06

    1. Initial program 49.3

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

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

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

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

    if 1.0360142885107461e-06 < eps

    1. Initial program 30.6

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

      \[\leadsto \color{blue}{\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right)} - \cos x\]
  3. Recombined 3 regimes into one program.
  4. Final simplification0.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le -2.68493806133625336628177219600380198905 \cdot 10^{-8}:\\ \;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin \varepsilon, \sin x, \cos x\right)\\ \mathbf{elif}\;\varepsilon \le 1.036014288510746111270565891770978339537 \cdot 10^{-6}:\\ \;\;\;\;\left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)\right) \cdot \sin \left(\varepsilon \cdot \frac{1}{2}\right)\right) \cdot -2\\ \mathbf{else}:\\ \;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin \varepsilon \cdot \sin x\right) - \cos x\\ \end{array}\]

Reproduce

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