Average Error: 39.8 → 0.9
Time: 36.9s
Precision: 64
\[\cos \left(x + \varepsilon\right) - \cos x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -1576820.31278729089535772800445556640625:\\ \;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right) - \cos x\\ \mathbf{elif}\;\varepsilon \le 2.264234444891437172519416121119206763979 \cdot 10^{-4}:\\ \;\;\;\;\mathsf{log1p}\left(\mathsf{expm1}\left(\left(-2 \cdot \sin \left(\frac{\varepsilon}{2}\right)\right) \cdot \sin \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\cos x \cdot \cos \varepsilon - \mathsf{fma}\left(\sin x, \sin \varepsilon, \cos x\right)\\ \end{array}\]
\cos \left(x + \varepsilon\right) - \cos x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1576820.31278729089535772800445556640625:\\
\;\;\;\;\left(\cos x \cdot \cos \varepsilon - \sin x \cdot \sin \varepsilon\right) - \cos x\\

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

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

\end{array}
double f(double x, double eps) {
        double r40216 = x;
        double r40217 = eps;
        double r40218 = r40216 + r40217;
        double r40219 = cos(r40218);
        double r40220 = cos(r40216);
        double r40221 = r40219 - r40220;
        return r40221;
}

double f(double x, double eps) {
        double r40222 = eps;
        double r40223 = -1576820.312787291;
        bool r40224 = r40222 <= r40223;
        double r40225 = x;
        double r40226 = cos(r40225);
        double r40227 = cos(r40222);
        double r40228 = r40226 * r40227;
        double r40229 = sin(r40225);
        double r40230 = sin(r40222);
        double r40231 = r40229 * r40230;
        double r40232 = r40228 - r40231;
        double r40233 = r40232 - r40226;
        double r40234 = 0.00022642344448914372;
        bool r40235 = r40222 <= r40234;
        double r40236 = -2.0;
        double r40237 = 2.0;
        double r40238 = r40222 / r40237;
        double r40239 = sin(r40238);
        double r40240 = r40236 * r40239;
        double r40241 = fma(r40237, r40225, r40222);
        double r40242 = r40241 / r40237;
        double r40243 = sin(r40242);
        double r40244 = r40240 * r40243;
        double r40245 = expm1(r40244);
        double r40246 = log1p(r40245);
        double r40247 = fma(r40229, r40230, r40226);
        double r40248 = r40228 - r40247;
        double r40249 = r40235 ? r40246 : r40248;
        double r40250 = r40224 ? r40233 : r40249;
        return r40250;
}

Error

Bits error versus x

Bits error versus eps

Derivation

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

    1. Initial program 30.2

      \[\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\]

    if -1576820.312787291 < eps < 0.00022642344448914372

    1. Initial program 49.0

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

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

      \[\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)}\]
    7. Using strategy rm
    8. Applied log1p-expm1-u0.9

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

    if 0.00022642344448914372 < eps

    1. Initial program 31.1

      \[\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. Applied associate--l-0.9

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

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

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

Reproduce

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