Average Error: 37.4 → 0.6
Time: 17.1s
Precision: 64
\[\sin \left(x + \varepsilon\right) - \sin x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -1.3657083573837753 \cdot 10^{-08}:\\ \;\;\;\;\left(\cos x \cdot \sin \varepsilon - \sin x\right) + \sin x \cdot \cos \varepsilon\\ \mathbf{elif}\;\varepsilon \le 4.683430512114554 \cdot 10^{-22}:\\ \;\;\;\;\left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \cos \left(\mathsf{fma}\left(\frac{1}{2}, \varepsilon, x\right)\right)\right) \cdot 2\\ \mathbf{else}:\\ \;\;\;\;\left(\cos x \cdot \sin \varepsilon - \sin x\right) + \sin x \cdot \cos \varepsilon\\ \end{array}\]
\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.3657083573837753 \cdot 10^{-08}:\\
\;\;\;\;\left(\cos x \cdot \sin \varepsilon - \sin x\right) + \sin x \cdot \cos \varepsilon\\

\mathbf{elif}\;\varepsilon \le 4.683430512114554 \cdot 10^{-22}:\\
\;\;\;\;\left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \cos \left(\mathsf{fma}\left(\frac{1}{2}, \varepsilon, x\right)\right)\right) \cdot 2\\

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

\end{array}
double f(double x, double eps) {
        double r4108375 = x;
        double r4108376 = eps;
        double r4108377 = r4108375 + r4108376;
        double r4108378 = sin(r4108377);
        double r4108379 = sin(r4108375);
        double r4108380 = r4108378 - r4108379;
        return r4108380;
}

double f(double x, double eps) {
        double r4108381 = eps;
        double r4108382 = -1.3657083573837753e-08;
        bool r4108383 = r4108381 <= r4108382;
        double r4108384 = x;
        double r4108385 = cos(r4108384);
        double r4108386 = sin(r4108381);
        double r4108387 = r4108385 * r4108386;
        double r4108388 = sin(r4108384);
        double r4108389 = r4108387 - r4108388;
        double r4108390 = cos(r4108381);
        double r4108391 = r4108388 * r4108390;
        double r4108392 = r4108389 + r4108391;
        double r4108393 = 4.683430512114554e-22;
        bool r4108394 = r4108381 <= r4108393;
        double r4108395 = 2.0;
        double r4108396 = r4108381 / r4108395;
        double r4108397 = sin(r4108396);
        double r4108398 = 0.5;
        double r4108399 = fma(r4108398, r4108381, r4108384);
        double r4108400 = cos(r4108399);
        double r4108401 = r4108397 * r4108400;
        double r4108402 = r4108401 * r4108395;
        double r4108403 = r4108394 ? r4108402 : r4108392;
        double r4108404 = r4108383 ? r4108392 : r4108403;
        return r4108404;
}

Error

Bits error versus x

Bits error versus eps

Target

Original37.4
Target15.3
Herbie0.6
\[2 \cdot \left(\cos \left(x + \frac{\varepsilon}{2}\right) \cdot \sin \left(\frac{\varepsilon}{2}\right)\right)\]

Derivation

  1. Split input into 2 regimes
  2. if eps < -1.3657083573837753e-08 or 4.683430512114554e-22 < eps

    1. Initial program 30.5

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

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

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

    if -1.3657083573837753e-08 < eps < 4.683430512114554e-22

    1. Initial program 44.9

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

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

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

      \[\leadsto 2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \color{blue}{\mathsf{log1p}\left(\left(\mathsf{expm1}\left(\left(\cos \left(\frac{x + \left(\varepsilon + x\right)}{2}\right)\right)\right)\right)\right)}\right)\]
    7. Using strategy rm
    8. Applied expm1-log1p-u0.4

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

      \[\leadsto 2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \mathsf{expm1}\left(\color{blue}{\left(\mathsf{log1p}\left(\left(\cos \left(\frac{x + \left(\varepsilon + x\right)}{2}\right)\right)\right)\right)}\right)\right)\]
    10. Taylor expanded around inf 0.2

      \[\leadsto 2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \color{blue}{\cos \left(\frac{1}{2} \cdot \left(2 \cdot x + \varepsilon\right)\right)}\right)\]
    11. Simplified0.2

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le -1.3657083573837753 \cdot 10^{-08}:\\ \;\;\;\;\left(\cos x \cdot \sin \varepsilon - \sin x\right) + \sin x \cdot \cos \varepsilon\\ \mathbf{elif}\;\varepsilon \le 4.683430512114554 \cdot 10^{-22}:\\ \;\;\;\;\left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \cos \left(\mathsf{fma}\left(\frac{1}{2}, \varepsilon, x\right)\right)\right) \cdot 2\\ \mathbf{else}:\\ \;\;\;\;\left(\cos x \cdot \sin \varepsilon - \sin x\right) + \sin x \cdot \cos \varepsilon\\ \end{array}\]

Reproduce

herbie shell --seed 2019132 +o rules:numerics
(FPCore (x eps)
  :name "2sin (example 3.3)"

  :herbie-target
  (* 2 (* (cos (+ x (/ eps 2))) (sin (/ eps 2))))

  (- (sin (+ x eps)) (sin x)))