\sin \left(x + \varepsilon\right) - \sin x
\mathsf{fma}\left(\sin x, \frac{\log \left(e^{{\left(\cos \varepsilon\right)}^{3}}\right) - 1}{\mathsf{fma}\left(\cos \varepsilon, \cos \varepsilon + 1, 1\right)}, \cos x \cdot \sin \varepsilon\right) + \mathsf{fma}\left(-\sin x, 1, \sin x \cdot 1\right)double f(double x, double eps) {
double r105820 = x;
double r105821 = eps;
double r105822 = r105820 + r105821;
double r105823 = sin(r105822);
double r105824 = sin(r105820);
double r105825 = r105823 - r105824;
return r105825;
}
double f(double x, double eps) {
double r105826 = x;
double r105827 = sin(r105826);
double r105828 = eps;
double r105829 = cos(r105828);
double r105830 = 3.0;
double r105831 = pow(r105829, r105830);
double r105832 = exp(r105831);
double r105833 = log(r105832);
double r105834 = 1.0;
double r105835 = r105833 - r105834;
double r105836 = r105829 + r105834;
double r105837 = fma(r105829, r105836, r105834);
double r105838 = r105835 / r105837;
double r105839 = cos(r105826);
double r105840 = sin(r105828);
double r105841 = r105839 * r105840;
double r105842 = fma(r105827, r105838, r105841);
double r105843 = -r105827;
double r105844 = r105827 * r105834;
double r105845 = fma(r105843, r105834, r105844);
double r105846 = r105842 + r105845;
return r105846;
}




Bits error versus x




Bits error versus eps
| Original | 36.9 |
|---|---|
| Target | 15.3 |
| Herbie | 0.4 |
Initial program 36.9
rmApplied sin-sum21.4
Applied associate--l+21.4
rmApplied *-un-lft-identity21.4
Applied prod-diff21.4
Applied associate-+r+21.4
Simplified0.4
rmApplied flip3--0.4
Simplified0.4
Simplified0.4
rmApplied add-log-exp0.4
Final simplification0.4
herbie shell --seed 2020065 +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)))