\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \leq -0.00015670222871752272:\\
\;\;\;\;\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} - \tan x\\
\mathbf{elif}\;\varepsilon \leq 0.0002144194778667246:\\
\;\;\;\;1.3333333333333333 \cdot \frac{{\sin x}^{2} \cdot {\varepsilon}^{3}}{{\cos x}^{2}} + \left(\frac{\varepsilon \cdot {\sin x}^{2}}{{\cos x}^{2}} + \left(\frac{{\sin x}^{5} \cdot {\varepsilon}^{4}}{{\cos x}^{5}} + \left(1.6666666666666667 \cdot \frac{{\varepsilon}^{4} \cdot {\sin x}^{3}}{{\cos x}^{3}} + \left(\left(\left(\varepsilon + {\varepsilon}^{3} \cdot \left(\frac{{\sin x}^{4}}{{\cos x}^{4}} + 0.3333333333333333\right)\right) + 0.6666666666666666 \cdot \left({\varepsilon}^{4} \cdot \frac{\sin x}{\cos x}\right)\right) + \left(\varepsilon \cdot \varepsilon\right) \cdot \left(\frac{\sin x}{\cos x} + \frac{{\sin x}^{3}}{{\cos x}^{3}}\right)\right)\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\tan x + \tan \varepsilon\right) \cdot \frac{1}{1 - \tan x \cdot \tan \varepsilon} - \tan x\\
\end{array}(FPCore (x eps) :precision binary64 (- (tan (+ x eps)) (tan x)))
(FPCore (x eps)
:precision binary64
(if (<= eps -0.00015670222871752272)
(- (/ (+ (tan x) (tan eps)) (- 1.0 (* (tan x) (tan eps)))) (tan x))
(if (<= eps 0.0002144194778667246)
(+
(*
1.3333333333333333
(/ (* (pow (sin x) 2.0) (pow eps 3.0)) (pow (cos x) 2.0)))
(+
(/ (* eps (pow (sin x) 2.0)) (pow (cos x) 2.0))
(+
(/ (* (pow (sin x) 5.0) (pow eps 4.0)) (pow (cos x) 5.0))
(+
(*
1.6666666666666667
(/ (* (pow eps 4.0) (pow (sin x) 3.0)) (pow (cos x) 3.0)))
(+
(+
(+
eps
(*
(pow eps 3.0)
(+ (/ (pow (sin x) 4.0) (pow (cos x) 4.0)) 0.3333333333333333)))
(* 0.6666666666666666 (* (pow eps 4.0) (/ (sin x) (cos x)))))
(*
(* eps eps)
(+
(/ (sin x) (cos x))
(/ (pow (sin x) 3.0) (pow (cos x) 3.0)))))))))
(-
(* (+ (tan x) (tan eps)) (/ 1.0 (- 1.0 (* (tan x) (tan eps)))))
(tan x)))))double code(double x, double eps) {
return tan(x + eps) - tan(x);
}
double code(double x, double eps) {
double tmp;
if (eps <= -0.00015670222871752272) {
tmp = ((tan(x) + tan(eps)) / (1.0 - (tan(x) * tan(eps)))) - tan(x);
} else if (eps <= 0.0002144194778667246) {
tmp = (1.3333333333333333 * ((pow(sin(x), 2.0) * pow(eps, 3.0)) / pow(cos(x), 2.0))) + (((eps * pow(sin(x), 2.0)) / pow(cos(x), 2.0)) + (((pow(sin(x), 5.0) * pow(eps, 4.0)) / pow(cos(x), 5.0)) + ((1.6666666666666667 * ((pow(eps, 4.0) * pow(sin(x), 3.0)) / pow(cos(x), 3.0))) + (((eps + (pow(eps, 3.0) * ((pow(sin(x), 4.0) / pow(cos(x), 4.0)) + 0.3333333333333333))) + (0.6666666666666666 * (pow(eps, 4.0) * (sin(x) / cos(x))))) + ((eps * eps) * ((sin(x) / cos(x)) + (pow(sin(x), 3.0) / pow(cos(x), 3.0))))))));
} else {
tmp = ((tan(x) + tan(eps)) * (1.0 / (1.0 - (tan(x) * tan(eps))))) - tan(x);
}
return tmp;
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.6 |
|---|---|
| Target | 14.8 |
| Herbie | 0.3 |
if eps < -1.5670222871752272e-4Initial program 28.1
rmApplied tan-sum_binary64_19180.3
if -1.5670222871752272e-4 < eps < 2.14419477866724606e-4Initial program 44.3
Taylor expanded around 0 0.2
Simplified0.2
if 2.14419477866724606e-4 < eps Initial program 29.8
rmApplied tan-sum_binary64_19180.3
rmApplied div-inv_binary64_17800.3
Final simplification0.3
herbie shell --seed 2021044
(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)))