Average Error: 39.8 → 0.7
Time: 21.3s
Precision: 64
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -3.59746672523127812 \cdot 10^{-5} \lor \neg \left(\varepsilon \le 2.86080349302899809 \cdot 10^{-8}\right):\\ \;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin x, \sin \varepsilon, \cos x\right)\\ \mathbf{else}:\\ \;\;\;\;-2 \cdot \left(\sin \left(\frac{\left(x + \varepsilon\right) + x}{2}\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 -3.59746672523127812 \cdot 10^{-5} \lor \neg \left(\varepsilon \le 2.86080349302899809 \cdot 10^{-8}\right):\\
\;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin x, \sin \varepsilon, \cos x\right)\\

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

\end{array}
double f(double x, double eps) {
        double r42052 = x;
        double r42053 = eps;
        double r42054 = r42052 + r42053;
        double r42055 = cos(r42054);
        double r42056 = cos(r42052);
        double r42057 = r42055 - r42056;
        return r42057;
}

double f(double x, double eps) {
        double r42058 = eps;
        double r42059 = -3.597466725231278e-05;
        bool r42060 = r42058 <= r42059;
        double r42061 = 2.860803493028998e-08;
        bool r42062 = r42058 <= r42061;
        double r42063 = !r42062;
        bool r42064 = r42060 || r42063;
        double r42065 = x;
        double r42066 = cos(r42065);
        double r42067 = cos(r42058);
        double r42068 = r42066 * r42067;
        double r42069 = sin(r42065);
        double r42070 = sin(r42058);
        double r42071 = fma(r42069, r42070, r42066);
        double r42072 = r42068 - r42071;
        double r42073 = -2.0;
        double r42074 = r42065 + r42058;
        double r42075 = r42074 + r42065;
        double r42076 = 2.0;
        double r42077 = r42075 / r42076;
        double r42078 = sin(r42077);
        double r42079 = r42058 / r42076;
        double r42080 = sin(r42079);
        double r42081 = r42078 * r42080;
        double r42082 = r42073 * r42081;
        double r42083 = r42064 ? r42072 : r42082;
        return r42083;
}

Error

Bits error versus x

Bits error versus eps

Derivation

  1. Split input into 2 regimes
  2. if eps < -3.597466725231278e-05 or 2.860803493028998e-08 < eps

    1. Initial program 30.4

      \[\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 x, \sin \varepsilon, \cos x\right)}\]

    if -3.597466725231278e-05 < eps < 2.860803493028998e-08

    1. Initial program 49.5

      \[\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.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)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.7

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

Reproduce

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