\tan \left(x + \varepsilon\right) - \tan x
\left(\left(\frac{\sin \varepsilon}{\left(1 - \frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}}\right) \cdot \cos \varepsilon} + \mathsf{fma}\left(\frac{{\left(\sin x\right)}^{2}}{{\left(\cos x\right)}^{2}}, \frac{{\left(\sin \varepsilon\right)}^{3}}{\left(1 - \frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}}\right) \cdot {\left(\cos \varepsilon\right)}^{3}}, \frac{{\left(\sin x\right)}^{2} \cdot \sin \varepsilon}{\cos \varepsilon \cdot \left(\left(1 - \frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}}\right) \cdot {\left(\cos x\right)}^{2}\right)}\right)\right) + \frac{{\left(\sin \varepsilon\right)}^{2}}{\left(1 - \frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}}\right) \cdot {\left(\cos \varepsilon\right)}^{2}} \cdot \left(\frac{\sin x}{\cos x} + \frac{{\left(\sin x\right)}^{3}}{{\left(\cos x\right)}^{3}}\right)\right) + \mathsf{fma}\left(\frac{\sin x}{\left({1}^{3} - {\left(\frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}}\right)}^{3}\right) \cdot \cos x}, 1 \cdot 1 + \left(\frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}} \cdot \frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}} + 1 \cdot \frac{{\left(\sin x\right)}^{3} \cdot {\left(\sin \varepsilon\right)}^{3}}{{\left(\cos x\right)}^{3} \cdot {\left(\cos \varepsilon\right)}^{3}}\right), -\frac{\sin x}{\cos x}\right)double code(double x, double eps) {
return (tan((x + eps)) - tan(x));
}
double code(double x, double eps) {
return ((((sin(eps) / ((1.0 - ((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0)))) * cos(eps))) + fma((pow(sin(x), 2.0) / pow(cos(x), 2.0)), (pow(sin(eps), 3.0) / ((1.0 - ((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0)))) * pow(cos(eps), 3.0))), ((pow(sin(x), 2.0) * sin(eps)) / (cos(eps) * ((1.0 - ((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0)))) * pow(cos(x), 2.0)))))) + ((pow(sin(eps), 2.0) / ((1.0 - ((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0)))) * pow(cos(eps), 2.0))) * ((sin(x) / cos(x)) + (pow(sin(x), 3.0) / pow(cos(x), 3.0))))) + fma((sin(x) / ((pow(1.0, 3.0) - pow(((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0))), 3.0)) * cos(x))), ((1.0 * 1.0) + ((((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0))) * ((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0)))) + (1.0 * ((pow(sin(x), 3.0) * pow(sin(eps), 3.0)) / (pow(cos(x), 3.0) * pow(cos(eps), 3.0)))))), -(sin(x) / cos(x))));
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.8 |
|---|---|
| Target | 15.4 |
| Herbie | 0.4 |
Initial program 36.8
rmApplied tan-sum21.3
rmApplied flip3--21.4
Applied associate-/r/21.4
Applied fma-neg21.4
Taylor expanded around inf 21.5
Simplified0.4
rmApplied flip3--0.4
Applied associate-*l/0.5
Applied associate-/r/0.5
Applied fma-neg0.4
Final simplification0.4
herbie shell --seed 2020065 +o rules:numerics
(FPCore (x eps)
:name "2tan (problem 3.3.2)"
:precision binary64
:herbie-target
(/ (sin eps) (* (cos x) (cos (+ x eps))))
(- (tan (+ x eps)) (tan x)))