\tan \left(x + \varepsilon\right) - \tan x
\frac{\frac{\sin \varepsilon}{\cos \varepsilon}}{\mathsf{fma}\left(-\frac{\sin x}{\cos x}, \frac{\sin \varepsilon}{\cos \varepsilon}, 1\right)} + \left(\frac{\frac{\sin x}{\cos x}}{1 - \frac{\sin \varepsilon}{\cos \varepsilon} \cdot \frac{\sin x}{\cos x}} - \frac{\sin x}{\cos x}\right)double f(double x, double eps) {
double r5501002 = x;
double r5501003 = eps;
double r5501004 = r5501002 + r5501003;
double r5501005 = tan(r5501004);
double r5501006 = tan(r5501002);
double r5501007 = r5501005 - r5501006;
return r5501007;
}
double f(double x, double eps) {
double r5501008 = eps;
double r5501009 = sin(r5501008);
double r5501010 = cos(r5501008);
double r5501011 = r5501009 / r5501010;
double r5501012 = x;
double r5501013 = sin(r5501012);
double r5501014 = cos(r5501012);
double r5501015 = r5501013 / r5501014;
double r5501016 = -r5501015;
double r5501017 = 1.0;
double r5501018 = fma(r5501016, r5501011, r5501017);
double r5501019 = r5501011 / r5501018;
double r5501020 = r5501011 * r5501015;
double r5501021 = r5501017 - r5501020;
double r5501022 = r5501015 / r5501021;
double r5501023 = r5501022 - r5501015;
double r5501024 = r5501019 + r5501023;
return r5501024;
}




Bits error versus x




Bits error versus eps
| Original | 37.2 |
|---|---|
| Target | 15.7 |
| Herbie | 12.8 |
Initial program 37.2
rmApplied tan-sum21.5
Taylor expanded around inf 21.7
Simplified12.8
rmApplied div-inv12.8
Applied fma-def12.8
Taylor expanded around inf 12.8
Simplified12.8
Final simplification12.8
herbie shell --seed 2019179 +o rules:numerics
(FPCore (x eps)
:name "2tan (problem 3.3.2)"
:herbie-target
(/ (sin eps) (* (cos x) (cos (+ x eps))))
(- (tan (+ x eps)) (tan x)))