\sin \left(x + \varepsilon\right) - \sin x
2 \cdot \left(\left(\mathsf{fma}\left(\left(-\sin x\right), \left(\sin \left(\frac{1}{2} \cdot \varepsilon\right)\right), \left(\sin x \cdot \sin \left(\frac{1}{2} \cdot \varepsilon\right)\right)\right) + \mathsf{fma}\left(\left(\cos \left(\frac{1}{2} \cdot \varepsilon\right)\right), \left(\cos x\right), \left(-\sin x \cdot \sin \left(\frac{1}{2} \cdot \varepsilon\right)\right)\right)\right) \cdot \sin \left(\frac{1}{2} \cdot \varepsilon\right)\right)double f(double x, double eps) {
double r2675064 = x;
double r2675065 = eps;
double r2675066 = r2675064 + r2675065;
double r2675067 = sin(r2675066);
double r2675068 = sin(r2675064);
double r2675069 = r2675067 - r2675068;
return r2675069;
}
double f(double x, double eps) {
double r2675070 = 2.0;
double r2675071 = x;
double r2675072 = sin(r2675071);
double r2675073 = -r2675072;
double r2675074 = 0.5;
double r2675075 = eps;
double r2675076 = r2675074 * r2675075;
double r2675077 = sin(r2675076);
double r2675078 = r2675072 * r2675077;
double r2675079 = fma(r2675073, r2675077, r2675078);
double r2675080 = cos(r2675076);
double r2675081 = cos(r2675071);
double r2675082 = -r2675078;
double r2675083 = fma(r2675080, r2675081, r2675082);
double r2675084 = r2675079 + r2675083;
double r2675085 = r2675084 * r2675077;
double r2675086 = r2675070 * r2675085;
return r2675086;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.3 |
| Herbie | 0.3 |
Initial program 37.1
rmApplied diff-sin37.4
Simplified15.3
Taylor expanded around -inf 15.3
Simplified15.3
rmApplied fma-udef15.3
Applied cos-sum0.3
rmApplied prod-diff0.3
Final simplification0.3
herbie shell --seed 2019133 +o rules:numerics
(FPCore (x eps)
:name "2sin (example 3.3)"
:herbie-target
(* 2 (* (cos (+ x (/ eps 2))) (sin (/ eps 2))))
(- (sin (+ x eps)) (sin x)))