\sin \left(x + \varepsilon\right) - \sin x
\mathsf{fma}\left(\sin x, \cos \varepsilon - 1, \cos x \cdot \sin \varepsilon\right) + \mathsf{fma}\left(-\sin x, 1, \sin x \cdot 1\right)double f(double x, double eps) {
double r103836 = x;
double r103837 = eps;
double r103838 = r103836 + r103837;
double r103839 = sin(r103838);
double r103840 = sin(r103836);
double r103841 = r103839 - r103840;
return r103841;
}
double f(double x, double eps) {
double r103842 = x;
double r103843 = sin(r103842);
double r103844 = eps;
double r103845 = cos(r103844);
double r103846 = 1.0;
double r103847 = r103845 - r103846;
double r103848 = cos(r103842);
double r103849 = sin(r103844);
double r103850 = r103848 * r103849;
double r103851 = fma(r103843, r103847, r103850);
double r103852 = -r103843;
double r103853 = r103843 * r103846;
double r103854 = fma(r103852, r103846, r103853);
double r103855 = r103851 + r103854;
return r103855;
}




Bits error versus x




Bits error versus eps
| Original | 37.0 |
|---|---|
| Target | 15.1 |
| Herbie | 0.4 |
Initial program 37.0
rmApplied sin-sum21.8
Applied associate--l+21.8
rmApplied *-un-lft-identity21.8
Applied prod-diff21.8
Applied associate-+r+21.8
Simplified0.4
rmApplied add-log-exp0.4
Applied add-log-exp0.4
Applied diff-log0.5
Simplified0.4
rmApplied exp-diff0.5
Applied log-div0.4
Simplified0.4
Simplified0.4
Final simplification0.4
herbie shell --seed 2020027 +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)))