\sin \left(x + \varepsilon\right) - \sin x
\mathsf{fma}\left(\sin x, \frac{\mathsf{fma}\left(\cos \varepsilon, \cos \varepsilon \cdot \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 r116810 = x;
double r116811 = eps;
double r116812 = r116810 + r116811;
double r116813 = sin(r116812);
double r116814 = sin(r116810);
double r116815 = r116813 - r116814;
return r116815;
}
double f(double x, double eps) {
double r116816 = x;
double r116817 = sin(r116816);
double r116818 = eps;
double r116819 = cos(r116818);
double r116820 = r116819 * r116819;
double r116821 = 1.0;
double r116822 = -r116821;
double r116823 = fma(r116819, r116820, r116822);
double r116824 = r116819 + r116821;
double r116825 = fma(r116819, r116824, r116821);
double r116826 = r116823 / r116825;
double r116827 = cos(r116816);
double r116828 = sin(r116818);
double r116829 = r116827 * r116828;
double r116830 = fma(r116817, r116826, r116829);
return r116830;
}




Bits error versus x




Bits error versus eps
| Original | 36.8 |
|---|---|
| Target | 15.1 |
| Herbie | 0.4 |
Initial program 36.8
rmApplied sin-sum21.7
rmApplied *-un-lft-identity21.7
Applied *-un-lft-identity21.7
Applied distribute-lft-out--21.7
Simplified0.4
rmApplied flip3--0.4
Simplified0.4
Simplified0.4
rmApplied cube-mult0.4
Applied fma-neg0.4
Final simplification0.4
herbie shell --seed 2020089 +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)))