\sin \left(x + \varepsilon\right) - \sin x
\mathsf{fma}\left(\sin x, \frac{1}{\frac{\mathsf{fma}\left(\cos \varepsilon, \cos \varepsilon + 1, 1\right)}{{\left(\cos \varepsilon\right)}^{3} - 1}}, \cos x \cdot \sin \varepsilon\right) + \mathsf{fma}\left(-\sin x, 1, \sin x\right)double f(double x, double eps) {
double r119077 = x;
double r119078 = eps;
double r119079 = r119077 + r119078;
double r119080 = sin(r119079);
double r119081 = sin(r119077);
double r119082 = r119080 - r119081;
return r119082;
}
double f(double x, double eps) {
double r119083 = x;
double r119084 = sin(r119083);
double r119085 = 1.0;
double r119086 = eps;
double r119087 = cos(r119086);
double r119088 = r119087 + r119085;
double r119089 = fma(r119087, r119088, r119085);
double r119090 = 3.0;
double r119091 = pow(r119087, r119090);
double r119092 = r119091 - r119085;
double r119093 = r119089 / r119092;
double r119094 = r119085 / r119093;
double r119095 = cos(r119083);
double r119096 = sin(r119086);
double r119097 = r119095 * r119096;
double r119098 = fma(r119084, r119094, r119097);
double r119099 = -r119084;
double r119100 = fma(r119099, r119085, r119084);
double r119101 = r119098 + r119100;
return r119101;
}




Bits error versus x




Bits error versus eps
| Original | 36.9 |
|---|---|
| Target | 15.1 |
| Herbie | 0.4 |
Initial program 36.9
rmApplied sin-sum21.7
rmApplied add-cube-cbrt22.2
Applied add-sqr-sqrt43.3
Applied prod-diff43.3
Simplified22.0
Simplified0.4
rmApplied flip3--0.4
Simplified0.4
Simplified0.4
rmApplied clear-num0.4
Final simplification0.4
herbie shell --seed 2020057 +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)))