\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \leq -0.0004779135616980856:\\
\;\;\;\;\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} - \tan x\\
\mathbf{elif}\;\varepsilon \leq 0.0003005423639412057:\\
\;\;\;\;\frac{\sin \varepsilon}{\cos \varepsilon \cdot \left(1 - \frac{\sin \varepsilon \cdot \sin x}{\cos \varepsilon \cdot \cos x}\right)} + \frac{\sin x}{\cos x} \cdot \left(\frac{{\sin x}^{2} \cdot \left(\varepsilon \cdot \varepsilon\right)}{{\cos x}^{2}} + \left(0.3333333333333333 \cdot \left(\frac{\sin x}{\cos x} \cdot {\varepsilon}^{3}\right) + \left(\frac{{\sin x}^{3}}{{\left(\frac{\cos x}{\varepsilon}\right)}^{3}} + \left(0.6666666666666666 \cdot \frac{{\sin x}^{2} \cdot {\varepsilon}^{4}}{{\cos x}^{2}} + \left(\varepsilon \cdot \frac{\sin x}{\cos x} + \frac{{\varepsilon}^{4} \cdot {\sin x}^{4}}{{\cos x}^{4}}\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.0004779135616980856)
(- (/ (+ (tan x) (tan eps)) (- 1.0 (* (tan x) (tan eps)))) (tan x))
(if (<= eps 0.0003005423639412057)
(+
(/
(sin eps)
(* (cos eps) (- 1.0 (/ (* (sin eps) (sin x)) (* (cos eps) (cos x))))))
(*
(/ (sin x) (cos x))
(+
(/ (* (pow (sin x) 2.0) (* eps eps)) (pow (cos x) 2.0))
(+
(* 0.3333333333333333 (* (/ (sin x) (cos x)) (pow eps 3.0)))
(+
(/ (pow (sin x) 3.0) (pow (/ (cos x) eps) 3.0))
(+
(*
0.6666666666666666
(/ (* (pow (sin x) 2.0) (pow eps 4.0)) (pow (cos x) 2.0)))
(+
(* eps (/ (sin x) (cos x)))
(/ (* (pow eps 4.0) (pow (sin x) 4.0)) (pow (cos x) 4.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.0004779135616980856) {
tmp = ((tan(x) + tan(eps)) / (1.0 - (tan(x) * tan(eps)))) - tan(x);
} else if (eps <= 0.0003005423639412057) {
tmp = (sin(eps) / (cos(eps) * (1.0 - ((sin(eps) * sin(x)) / (cos(eps) * cos(x)))))) + ((sin(x) / cos(x)) * (((pow(sin(x), 2.0) * (eps * eps)) / pow(cos(x), 2.0)) + ((0.3333333333333333 * ((sin(x) / cos(x)) * pow(eps, 3.0))) + ((pow(sin(x), 3.0) / pow((cos(x) / eps), 3.0)) + ((0.6666666666666666 * ((pow(sin(x), 2.0) * pow(eps, 4.0)) / pow(cos(x), 2.0))) + ((eps * (sin(x) / cos(x))) + ((pow(eps, 4.0) * pow(sin(x), 4.0)) / pow(cos(x), 4.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 |
| Alternative 1 | |
|---|---|
| Error | 0.3 |
| Cost | 131522 |
| Alternative 2 | |
|---|---|
| Error | 0.3 |
| Cost | 125314 |
| Alternative 3 | |
|---|---|
| Error | 0.3 |
| Cost | 66114 |
| Alternative 4 | |
|---|---|
| Error | 0.3 |
| Cost | 59650 |
| Alternative 5 | |
|---|---|
| Error | 0.4 |
| Cost | 46402 |
| Alternative 6 | |
|---|---|
| Error | 0.4 |
| Cost | 33474 |
| Alternative 7 | |
|---|---|
| Error | 0.4 |
| Cost | 33032 |
| Alternative 8 | |
|---|---|
| Error | 14.2 |
| Cost | 26504 |
| Alternative 9 | |
|---|---|
| Error | 26.7 |
| Cost | 12992 |
| Alternative 10 | |
|---|---|
| Error | 59.6 |
| Cost | 64 |
| Alternative 11 | |
|---|---|
| Error | 59.5 |
| Cost | 64 |

if eps < -4.77913561698085616e-4Initial program 28.2
rmApplied tan-sum_binary64_15770.3
Simplified0.3
if -4.77913561698085616e-4 < eps < 3.00542363941205674e-4Initial program 44.3
rmApplied tan-sum_binary64_157743.5
rmApplied tan-quot_binary64_160143.5
Applied tan-quot_binary64_160143.5
Applied frac-times_binary64_145243.5
Taylor expanded around inf 43.5
Simplified25.4
Taylor expanded around 0 0.2
Simplified0.2
Simplified0.2
if 3.00542363941205674e-4 < eps Initial program 29.8
rmApplied tan-sum_binary64_15770.3
rmApplied div-inv_binary64_14390.3
Simplified0.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)))