\sin \left(x + \varepsilon\right) - \sin x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -6.83922365147160498477619820149701890255 \cdot 10^{-9} \lor \neg \left(\varepsilon \le 7.263195155747593821712365094725644999729 \cdot 10^{-12}\right):\\
\;\;\;\;\sin x \cdot \cos \varepsilon + \left(\cos x \cdot \sin \varepsilon - \sin x\right)\\
\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 r138907 = x;
double r138908 = eps;
double r138909 = r138907 + r138908;
double r138910 = sin(r138909);
double r138911 = sin(r138907);
double r138912 = r138910 - r138911;
return r138912;
}
double f(double x, double eps) {
double r138913 = eps;
double r138914 = -6.839223651471605e-09;
bool r138915 = r138913 <= r138914;
double r138916 = 7.263195155747594e-12;
bool r138917 = r138913 <= r138916;
double r138918 = !r138917;
bool r138919 = r138915 || r138918;
double r138920 = x;
double r138921 = sin(r138920);
double r138922 = cos(r138913);
double r138923 = r138921 * r138922;
double r138924 = cos(r138920);
double r138925 = sin(r138913);
double r138926 = r138924 * r138925;
double r138927 = r138926 - r138921;
double r138928 = r138923 + r138927;
double r138929 = 2.0;
double r138930 = r138913 / r138929;
double r138931 = sin(r138930);
double r138932 = fma(r138929, r138920, r138913);
double r138933 = r138932 / r138929;
double r138934 = cos(r138933);
double r138935 = r138931 * r138934;
double r138936 = r138929 * r138935;
double r138937 = r138919 ? r138928 : r138936;
return r138937;
}




Bits error versus x




Bits error versus eps
| Original | 36.6 |
|---|---|
| Target | 14.8 |
| Herbie | 0.4 |
if eps < -6.839223651471605e-09 or 7.263195155747594e-12 < eps Initial program 29.8
rmApplied sin-sum0.6
Applied associate--l+0.6
if -6.839223651471605e-09 < eps < 7.263195155747594e-12Initial program 43.7
rmApplied diff-sin43.7
Simplified0.2
Final simplification0.4
herbie shell --seed 2019350 +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)))