\tan \left(x + \varepsilon\right) - \tan x
\left(\frac{\frac{\sin x}{\cos x}}{1 - \frac{\sin \varepsilon \cdot \frac{\sin x}{\cos x}}{\cos \varepsilon}} - \frac{\sin x}{\cos x}\right) + \frac{\frac{\sin \varepsilon}{\cos \varepsilon}}{1 - \frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}}double f(double x, double eps) {
double r4334160 = x;
double r4334161 = eps;
double r4334162 = r4334160 + r4334161;
double r4334163 = tan(r4334162);
double r4334164 = tan(r4334160);
double r4334165 = r4334163 - r4334164;
return r4334165;
}
double f(double x, double eps) {
double r4334166 = x;
double r4334167 = sin(r4334166);
double r4334168 = cos(r4334166);
double r4334169 = r4334167 / r4334168;
double r4334170 = 1.0;
double r4334171 = eps;
double r4334172 = sin(r4334171);
double r4334173 = r4334172 * r4334169;
double r4334174 = cos(r4334171);
double r4334175 = r4334173 / r4334174;
double r4334176 = r4334170 - r4334175;
double r4334177 = r4334169 / r4334176;
double r4334178 = r4334177 - r4334169;
double r4334179 = r4334172 / r4334174;
double r4334180 = r4334167 * r4334172;
double r4334181 = r4334174 * r4334168;
double r4334182 = r4334180 / r4334181;
double r4334183 = r4334170 - r4334182;
double r4334184 = r4334179 / r4334183;
double r4334185 = r4334178 + r4334184;
return r4334185;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.0 |
|---|---|
| Target | 15.3 |
| Herbie | 12.7 |
Initial program 37.0
rmApplied tan-sum21.6
Taylor expanded around inf 21.7
Simplified12.7
rmApplied associate-*r/12.7
rmApplied frac-times12.7
Final simplification12.7
herbie shell --seed 2019129 +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)))