\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.13556300457512966 \cdot 10^{-97}:\\
\;\;\;\;\mathsf{fma}\left(\tan x + \tan \varepsilon, \frac{1}{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right)} \cdot \left(1 + \tan x \cdot \tan \varepsilon\right), -\tan x\right)\\
\mathbf{elif}\;\varepsilon \le 1.8550476959582249 \cdot 10^{-60}:\\
\;\;\;\;\mathsf{fma}\left({\varepsilon}^{2}, x, \mathsf{fma}\left(\varepsilon, {x}^{2}, \varepsilon\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(\tan x + \tan \varepsilon\right) \cdot \cos x - \left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \sin x}{\left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \cos x}\\
\end{array}double f(double x, double eps) {
double r130448 = x;
double r130449 = eps;
double r130450 = r130448 + r130449;
double r130451 = tan(r130450);
double r130452 = tan(r130448);
double r130453 = r130451 - r130452;
return r130453;
}
double f(double x, double eps) {
double r130454 = eps;
double r130455 = -2.1355630045751297e-97;
bool r130456 = r130454 <= r130455;
double r130457 = x;
double r130458 = tan(r130457);
double r130459 = tan(r130454);
double r130460 = r130458 + r130459;
double r130461 = 1.0;
double r130462 = r130458 * r130459;
double r130463 = r130462 * r130462;
double r130464 = r130461 - r130463;
double r130465 = r130461 / r130464;
double r130466 = r130461 + r130462;
double r130467 = r130465 * r130466;
double r130468 = -r130458;
double r130469 = fma(r130460, r130467, r130468);
double r130470 = 1.855047695958225e-60;
bool r130471 = r130454 <= r130470;
double r130472 = 2.0;
double r130473 = pow(r130454, r130472);
double r130474 = pow(r130457, r130472);
double r130475 = fma(r130454, r130474, r130454);
double r130476 = fma(r130473, r130457, r130475);
double r130477 = cos(r130457);
double r130478 = r130460 * r130477;
double r130479 = r130461 - r130462;
double r130480 = sin(r130457);
double r130481 = r130479 * r130480;
double r130482 = r130478 - r130481;
double r130483 = r130479 * r130477;
double r130484 = r130482 / r130483;
double r130485 = r130471 ? r130476 : r130484;
double r130486 = r130456 ? r130469 : r130485;
return r130486;
}




Bits error versus x




Bits error versus eps
| Original | 36.9 |
|---|---|
| Target | 14.9 |
| Herbie | 15.9 |
if eps < -2.1355630045751297e-97Initial program 31.3
rmApplied tan-sum7.9
rmApplied div-inv7.9
Applied fma-neg7.9
rmApplied flip--7.9
Applied associate-/r/7.9
Simplified7.9
if -2.1355630045751297e-97 < eps < 1.855047695958225e-60Initial program 47.5
Taylor expanded around 0 31.4
Simplified31.4
if 1.855047695958225e-60 < eps Initial program 29.9
rmApplied tan-quot29.7
Applied tan-sum5.3
Applied frac-sub5.4
Final simplification15.9
herbie shell --seed 2020081 +o rules:numerics
(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)))