\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.880748992750146398620281343784345499703 \cdot 10^{-51} \lor \neg \left(\varepsilon \le 1.342409282000481224159305634141017423042 \cdot 10^{-20}\right):\\
\;\;\;\;\frac{\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} \cdot \frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} - \tan x \cdot \tan x}{\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} + \tan x}\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(x \cdot {\varepsilon}^{2} + \varepsilon\right) - \frac{1}{6} \cdot {\varepsilon}^{3}}{\left(\cos x \cdot \cos \varepsilon\right) \cdot \cos x}\\
\end{array}double f(double x, double eps) {
double r67578 = x;
double r67579 = eps;
double r67580 = r67578 + r67579;
double r67581 = tan(r67580);
double r67582 = tan(r67578);
double r67583 = r67581 - r67582;
return r67583;
}
double f(double x, double eps) {
double r67584 = eps;
double r67585 = -2.8807489927501464e-51;
bool r67586 = r67584 <= r67585;
double r67587 = 1.3424092820004812e-20;
bool r67588 = r67584 <= r67587;
double r67589 = !r67588;
bool r67590 = r67586 || r67589;
double r67591 = x;
double r67592 = tan(r67591);
double r67593 = tan(r67584);
double r67594 = r67592 + r67593;
double r67595 = 1.0;
double r67596 = r67592 * r67593;
double r67597 = r67595 - r67596;
double r67598 = r67594 / r67597;
double r67599 = r67598 * r67598;
double r67600 = r67592 * r67592;
double r67601 = r67599 - r67600;
double r67602 = r67598 + r67592;
double r67603 = r67601 / r67602;
double r67604 = 2.0;
double r67605 = pow(r67584, r67604);
double r67606 = r67591 * r67605;
double r67607 = r67606 + r67584;
double r67608 = 0.16666666666666666;
double r67609 = 3.0;
double r67610 = pow(r67584, r67609);
double r67611 = r67608 * r67610;
double r67612 = r67607 - r67611;
double r67613 = cos(r67591);
double r67614 = cos(r67584);
double r67615 = r67613 * r67614;
double r67616 = r67615 * r67613;
double r67617 = r67612 / r67616;
double r67618 = r67590 ? r67603 : r67617;
return r67618;
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.7 |
|---|---|
| Target | 14.9 |
| Herbie | 6.3 |
if eps < -2.8807489927501464e-51 or 1.3424092820004812e-20 < eps Initial program 29.4
rmApplied tan-sum2.8
rmApplied flip--2.9
if -2.8807489927501464e-51 < eps < 1.3424092820004812e-20Initial program 45.8
rmApplied tan-sum45.8
rmApplied div-inv45.8
rmApplied tan-quot46.0
Applied tan-quot46.0
Applied tan-quot45.8
Applied frac-add45.8
Applied associate-*l/45.8
Applied frac-sub45.8
Simplified45.8
Taylor expanded around 0 10.4
Final simplification6.3
herbie shell --seed 2019323
(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)))