Average Error: 39.8 → 0.7
Time: 38.3s
Precision: 64
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -0.008151886891035409199446348793571814894676:\\ \;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin x, \sin \varepsilon, \cos x\right)\\ \mathbf{elif}\;\varepsilon \le 0.04140103919524167758181576459719508420676:\\ \;\;\;\;\left(-2 \cdot \sin \left(\frac{\varepsilon}{2}\right)\right) \cdot \sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right) - \cos x\\ \end{array}\]
\cos \left(x + \varepsilon\right) - \cos x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -0.008151886891035409199446348793571814894676:\\
\;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin x, \sin \varepsilon, \cos x\right)\\

\mathbf{elif}\;\varepsilon \le 0.04140103919524167758181576459719508420676:\\
\;\;\;\;\left(-2 \cdot \sin \left(\frac{\varepsilon}{2}\right)\right) \cdot \sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\\

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

\end{array}
double f(double x, double eps) {
        double r31213 = x;
        double r31214 = eps;
        double r31215 = r31213 + r31214;
        double r31216 = cos(r31215);
        double r31217 = cos(r31213);
        double r31218 = r31216 - r31217;
        return r31218;
}

double f(double x, double eps) {
        double r31219 = eps;
        double r31220 = -0.00815188689103541;
        bool r31221 = r31219 <= r31220;
        double r31222 = x;
        double r31223 = cos(r31222);
        double r31224 = cos(r31219);
        double r31225 = r31223 * r31224;
        double r31226 = sin(r31222);
        double r31227 = sin(r31219);
        double r31228 = fma(r31226, r31227, r31223);
        double r31229 = r31225 - r31228;
        double r31230 = 0.04140103919524168;
        bool r31231 = r31219 <= r31230;
        double r31232 = -2.0;
        double r31233 = 2.0;
        double r31234 = r31219 / r31233;
        double r31235 = sin(r31234);
        double r31236 = r31232 * r31235;
        double r31237 = fma(r31233, r31222, r31219);
        double r31238 = r31237 / r31233;
        double r31239 = sin(r31238);
        double r31240 = r31236 * r31239;
        double r31241 = r31226 * r31227;
        double r31242 = r31225 - r31241;
        double r31243 = r31242 - r31223;
        double r31244 = r31231 ? r31240 : r31243;
        double r31245 = r31221 ? r31229 : r31244;
        return r31245;
}

Error

Bits error versus x

Bits error versus eps

Derivation

  1. Split input into 3 regimes
  2. if eps < -0.00815188689103541

    1. Initial program 30.7

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

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

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

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

    if -0.00815188689103541 < eps < 0.04140103919524168

    1. Initial program 48.8

      \[\cos \left(x + \varepsilon\right) - \cos x\]
    2. Using strategy rm
    3. Applied diff-cos37.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.6

      \[\leadsto -2 \cdot \color{blue}{\left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)}\]
    5. Using strategy rm
    6. Applied associate-*r*0.6

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

    if 0.04140103919524168 < eps

    1. Initial program 30.9

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

      \[\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 -0.008151886891035409199446348793571814894676:\\ \;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin x, \sin \varepsilon, \cos x\right)\\ \mathbf{elif}\;\varepsilon \le 0.04140103919524167758181576459719508420676:\\ \;\;\;\;\left(-2 \cdot \sin \left(\frac{\varepsilon}{2}\right)\right) \cdot \sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\\ \mathbf{else}:\\ \;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right) - \cos x\\ \end{array}\]

Reproduce

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