\sin \left(x + \varepsilon\right) - \sin x
\mathsf{fma}\left(\sin x, \frac{\mathsf{fma}\left(\cos \varepsilon \cdot \cos \varepsilon, \cos \varepsilon, -1\right)}{\mathsf{fma}\left(\cos \varepsilon, \cos \varepsilon + 1, 1\right)}, \cos x \cdot \sin \varepsilon\right)double f(double x, double eps) {
double r129520 = x;
double r129521 = eps;
double r129522 = r129520 + r129521;
double r129523 = sin(r129522);
double r129524 = sin(r129520);
double r129525 = r129523 - r129524;
return r129525;
}
double f(double x, double eps) {
double r129526 = x;
double r129527 = sin(r129526);
double r129528 = eps;
double r129529 = cos(r129528);
double r129530 = r129529 * r129529;
double r129531 = 1.0;
double r129532 = -r129531;
double r129533 = fma(r129530, r129529, r129532);
double r129534 = r129529 + r129531;
double r129535 = fma(r129529, r129534, r129531);
double r129536 = r129533 / r129535;
double r129537 = cos(r129526);
double r129538 = sin(r129528);
double r129539 = r129537 * r129538;
double r129540 = fma(r129527, r129536, r129539);
return r129540;
}




Bits error versus x




Bits error versus eps
| Original | 36.8 |
|---|---|
| Target | 14.6 |
| Herbie | 0.4 |
Initial program 36.8
rmApplied sin-sum22.2
rmApplied *-un-lft-identity22.2
Applied *-un-lft-identity22.2
Applied distribute-lft-out--22.2
Simplified0.4
rmApplied flip3--0.4
Simplified0.4
Simplified0.4
rmApplied unpow30.4
Applied fma-neg0.4
Final simplification0.4
herbie shell --seed 2020059 +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)))