\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \leq -1.2303582437088547 \cdot 10^{-37} \lor \neg \left(\varepsilon \leq 6.370884799891205 \cdot 10^{-62}\right):\\
\;\;\;\;\frac{\left(\tan x + \tan \varepsilon\right) \cdot \cos x + \sin x \cdot \left(\tan x \cdot \tan \varepsilon + -1\right)}{\cos x \cdot \left(1 - \tan x \cdot \tan \varepsilon\right)}\\
\mathbf{else}:\\
\;\;\;\;\varepsilon + x \cdot \left(\varepsilon \cdot \left(\varepsilon + x\right)\right)\\
\end{array}(FPCore (x eps) :precision binary64 (- (tan (+ x eps)) (tan x)))
(FPCore (x eps)
:precision binary64
(if (or (<= eps -1.2303582437088547e-37) (not (<= eps 6.370884799891205e-62)))
(/
(+
(* (+ (tan x) (tan eps)) (cos x))
(* (sin x) (+ (* (tan x) (tan eps)) -1.0)))
(* (cos x) (- 1.0 (* (tan x) (tan eps)))))
(+ eps (* x (* eps (+ eps x))))))double code(double x, double eps) {
return ((double) (((double) tan(((double) (x + eps)))) - ((double) tan(x))));
}
double code(double x, double eps) {
double VAR;
if (((eps <= -1.2303582437088547e-37) || !(eps <= 6.370884799891205e-62))) {
VAR = (((double) (((double) (((double) (((double) tan(x)) + ((double) tan(eps)))) * ((double) cos(x)))) + ((double) (((double) sin(x)) * ((double) (((double) (((double) tan(x)) * ((double) tan(eps)))) + -1.0)))))) / ((double) (((double) cos(x)) * ((double) (1.0 - ((double) (((double) tan(x)) * ((double) tan(eps)))))))));
} else {
VAR = ((double) (eps + ((double) (x * ((double) (eps * ((double) (eps + x))))))));
}
return VAR;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.2 |
|---|---|
| Target | 14.7 |
| Herbie | 15.9 |
if eps < -1.23035824370885471e-37 or 6.37088479989120464e-62 < eps Initial program 30.0
rmApplied tan-quot29.9
Applied tan-sum4.4
Applied frac-sub4.4
Simplified4.4
if -1.23035824370885471e-37 < eps < 6.37088479989120464e-62Initial program 46.9
Taylor expanded around 0 31.7
Simplified31.5
Final simplification15.9
herbie shell --seed 2020198
(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)))