Average Error: 37.3 → 0.4
Time: 15.7s
Precision: 64
\[\sin \left(x + \varepsilon\right) - \sin x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -1.038768429931681206984181854539872613685 \cdot 10^{-8} \lor \neg \left(\varepsilon \le 2.920080635356147314623251600384200299398 \cdot 10^{-9}\right):\\ \;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\ \mathbf{else}:\\ \;\;\;\;2 \cdot \left(\sin \left(\frac{\varepsilon}{2}\right) \cdot \cos \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)\\ \end{array}\]
\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.038768429931681206984181854539872613685 \cdot 10^{-8} \lor \neg \left(\varepsilon \le 2.920080635356147314623251600384200299398 \cdot 10^{-9}\right):\\
\;\;\;\;\left(\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon\right) - \sin x\\

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

\end{array}
double f(double x, double eps) {
        double r50715 = x;
        double r50716 = eps;
        double r50717 = r50715 + r50716;
        double r50718 = sin(r50717);
        double r50719 = sin(r50715);
        double r50720 = r50718 - r50719;
        return r50720;
}

double f(double x, double eps) {
        double r50721 = eps;
        double r50722 = -1.0387684299316812e-08;
        bool r50723 = r50721 <= r50722;
        double r50724 = 2.9200806353561473e-09;
        bool r50725 = r50721 <= r50724;
        double r50726 = !r50725;
        bool r50727 = r50723 || r50726;
        double r50728 = x;
        double r50729 = sin(r50728);
        double r50730 = cos(r50721);
        double r50731 = r50729 * r50730;
        double r50732 = cos(r50728);
        double r50733 = sin(r50721);
        double r50734 = r50732 * r50733;
        double r50735 = r50731 + r50734;
        double r50736 = r50735 - r50729;
        double r50737 = 2.0;
        double r50738 = r50721 / r50737;
        double r50739 = sin(r50738);
        double r50740 = fma(r50737, r50728, r50721);
        double r50741 = r50740 / r50737;
        double r50742 = cos(r50741);
        double r50743 = r50739 * r50742;
        double r50744 = r50737 * r50743;
        double r50745 = r50727 ? r50736 : r50744;
        return r50745;
}

Error

Bits error versus x

Bits error versus eps

Target

Original37.3
Target15.0
Herbie0.4
\[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.0387684299316812e-08 or 2.9200806353561473e-09 < eps

    1. Initial program 30.1

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

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

    if -1.0387684299316812e-08 < eps < 2.9200806353561473e-09

    1. Initial program 44.8

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

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

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

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

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

      \[\leadsto 2 \cdot \left(\sin \left(\frac{\varepsilon + 0}{2}\right) \cdot \mathsf{log1p}\left(\color{blue}{\mathsf{expm1}\left(\cos \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)}\right)\right)\]
    10. Using strategy rm
    11. Applied *-un-lft-identity0.4

      \[\leadsto 2 \cdot \left(\color{blue}{\left(1 \cdot \sin \left(\frac{\varepsilon + 0}{2}\right)\right)} \cdot \mathsf{log1p}\left(\mathsf{expm1}\left(\cos \left(\frac{\mathsf{fma}\left(2, x, \varepsilon\right)}{2}\right)\right)\right)\right)\]
    12. Applied associate-*l*0.4

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

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

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

Reproduce

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

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

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