\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.52409292857505093 \cdot 10^{-57} \lor \neg \left(\varepsilon \le 3.02977531859297208 \cdot 10^{-50}\right):\\
\;\;\;\;\frac{\tan x + \tan \varepsilon}{1 - \log \left({\left(e^{\tan x}\right)}^{\left(\tan \varepsilon\right)}\right)} - \tan x\\
\mathbf{else}:\\
\;\;\;\;\left(x \cdot \varepsilon\right) \cdot \left(\varepsilon + x\right) + \varepsilon\\
\end{array}double f(double x, double eps) {
double r178434 = x;
double r178435 = eps;
double r178436 = r178434 + r178435;
double r178437 = tan(r178436);
double r178438 = tan(r178434);
double r178439 = r178437 - r178438;
return r178439;
}
double f(double x, double eps) {
double r178440 = eps;
double r178441 = -1.524092928575051e-57;
bool r178442 = r178440 <= r178441;
double r178443 = 3.029775318592972e-50;
bool r178444 = r178440 <= r178443;
double r178445 = !r178444;
bool r178446 = r178442 || r178445;
double r178447 = x;
double r178448 = tan(r178447);
double r178449 = tan(r178440);
double r178450 = r178448 + r178449;
double r178451 = 1.0;
double r178452 = exp(r178448);
double r178453 = pow(r178452, r178449);
double r178454 = log(r178453);
double r178455 = r178451 - r178454;
double r178456 = r178450 / r178455;
double r178457 = r178456 - r178448;
double r178458 = r178447 * r178440;
double r178459 = r178440 + r178447;
double r178460 = r178458 * r178459;
double r178461 = r178460 + r178440;
double r178462 = r178446 ? r178457 : r178461;
return r178462;
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.9 |
|---|---|
| Target | 15.2 |
| Herbie | 15.3 |
if eps < -1.524092928575051e-57 or 3.029775318592972e-50 < eps Initial program 30.2
rmApplied tan-sum4.4
rmApplied add-log-exp4.4
rmApplied add-log-exp4.5
Applied exp-to-pow4.5
if -1.524092928575051e-57 < eps < 3.029775318592972e-50Initial program 46.4
rmApplied tan-sum46.4
Taylor expanded around 0 30.9
Simplified30.7
Final simplification15.3
herbie shell --seed 2020083
(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)))