\sin \left(x + \varepsilon\right) - \sin x
\mathsf{fma}\left(\sin x, \frac{{\left(\cos \varepsilon\right)}^{3} - 1}{\mathsf{fma}\left(\cos \varepsilon, \left(\sqrt[3]{\cos \varepsilon + 1} \cdot \sqrt[3]{\cos \varepsilon + 1}\right) \cdot \sqrt[3]{\cos \varepsilon + 1}, 1\right)}, \cos x \cdot \sin \varepsilon\right)double f(double x, double eps) {
double r118802 = x;
double r118803 = eps;
double r118804 = r118802 + r118803;
double r118805 = sin(r118804);
double r118806 = sin(r118802);
double r118807 = r118805 - r118806;
return r118807;
}
double f(double x, double eps) {
double r118808 = x;
double r118809 = sin(r118808);
double r118810 = eps;
double r118811 = cos(r118810);
double r118812 = 3.0;
double r118813 = pow(r118811, r118812);
double r118814 = 1.0;
double r118815 = r118813 - r118814;
double r118816 = r118811 + r118814;
double r118817 = cbrt(r118816);
double r118818 = r118817 * r118817;
double r118819 = r118818 * r118817;
double r118820 = fma(r118811, r118819, r118814);
double r118821 = r118815 / r118820;
double r118822 = cos(r118808);
double r118823 = sin(r118810);
double r118824 = r118822 * r118823;
double r118825 = fma(r118809, r118821, r118824);
return r118825;
}




Bits error versus x




Bits error versus eps
| Original | 36.7 |
|---|---|
| Target | 15.0 |
| Herbie | 0.4 |
Initial program 36.7
rmApplied sin-sum21.5
Taylor expanded around inf 21.5
Simplified0.4
rmApplied flip3--0.4
Simplified0.4
Simplified0.4
rmApplied add-cube-cbrt0.4
Final simplification0.4
herbie shell --seed 2020021 +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)))