\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.026001680385522531129045443270932914202 \cdot 10^{-44}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\tan \varepsilon + \tan x}{1 - \frac{\left(\left(\sin \varepsilon \cdot \sin x\right) \cdot \left(\sin \varepsilon \cdot \sin x\right)\right) \cdot \left(\sin \varepsilon \cdot \sin x\right)}{\left(\left(\cos x \cdot \cos \varepsilon\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)}}, \left(\tan x \cdot \tan \varepsilon + \frac{\left(\sin \varepsilon \cdot \sin x\right) \cdot \left(\sin \varepsilon \cdot \sin x\right)}{\left(\cos x \cdot \cos \varepsilon\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)}\right) + 1, -\tan x\right)\\
\mathbf{elif}\;\varepsilon \le 2.292531808674073827691883868428785214333 \cdot 10^{-46}:\\
\;\;\;\;\mathsf{fma}\left(x \cdot \varepsilon, x + \varepsilon, \varepsilon\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\tan \varepsilon + \tan x}{1 - \frac{\left(\left(\sin \varepsilon \cdot \sin x\right) \cdot \left(\sin \varepsilon \cdot \sin x\right)\right) \cdot \left(\sin \varepsilon \cdot \sin x\right)}{\left(\left(\cos x \cdot \cos \varepsilon\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)}}, \left(\tan x \cdot \tan \varepsilon + \frac{\left(\sin \varepsilon \cdot \sin x\right) \cdot \left(\sin \varepsilon \cdot \sin x\right)}{\left(\cos x \cdot \cos \varepsilon\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)}\right) + 1, -\tan x\right)\\
\end{array}double f(double x, double eps) {
double r4607352 = x;
double r4607353 = eps;
double r4607354 = r4607352 + r4607353;
double r4607355 = tan(r4607354);
double r4607356 = tan(r4607352);
double r4607357 = r4607355 - r4607356;
return r4607357;
}
double f(double x, double eps) {
double r4607358 = eps;
double r4607359 = -1.0260016803855225e-44;
bool r4607360 = r4607358 <= r4607359;
double r4607361 = tan(r4607358);
double r4607362 = x;
double r4607363 = tan(r4607362);
double r4607364 = r4607361 + r4607363;
double r4607365 = 1.0;
double r4607366 = sin(r4607358);
double r4607367 = sin(r4607362);
double r4607368 = r4607366 * r4607367;
double r4607369 = r4607368 * r4607368;
double r4607370 = r4607369 * r4607368;
double r4607371 = cos(r4607362);
double r4607372 = cos(r4607358);
double r4607373 = r4607371 * r4607372;
double r4607374 = r4607373 * r4607373;
double r4607375 = r4607374 * r4607373;
double r4607376 = r4607370 / r4607375;
double r4607377 = r4607365 - r4607376;
double r4607378 = r4607364 / r4607377;
double r4607379 = r4607363 * r4607361;
double r4607380 = r4607369 / r4607374;
double r4607381 = r4607379 + r4607380;
double r4607382 = r4607381 + r4607365;
double r4607383 = -r4607363;
double r4607384 = fma(r4607378, r4607382, r4607383);
double r4607385 = 2.292531808674074e-46;
bool r4607386 = r4607358 <= r4607385;
double r4607387 = r4607362 * r4607358;
double r4607388 = r4607362 + r4607358;
double r4607389 = fma(r4607387, r4607388, r4607358);
double r4607390 = r4607386 ? r4607389 : r4607384;
double r4607391 = r4607360 ? r4607384 : r4607390;
return r4607391;
}




Bits error versus x




Bits error versus eps
| Original | 36.9 |
|---|---|
| Target | 15.3 |
| Herbie | 15.2 |
if eps < -1.0260016803855225e-44 or 2.292531808674074e-46 < eps Initial program 30.1
rmApplied tan-sum3.5
rmApplied flip3--3.5
Applied associate-/r/3.5
Applied fma-neg3.5
rmApplied tan-quot3.5
Applied tan-quot3.5
Applied frac-times3.5
Applied cube-div3.6
Simplified3.5
Simplified3.5
rmApplied tan-quot3.5
Applied tan-quot3.5
Applied frac-times3.5
Applied tan-quot3.5
Applied tan-quot3.5
Applied frac-times3.5
Applied frac-times3.5
if -1.0260016803855225e-44 < eps < 2.292531808674074e-46Initial program 46.2
Taylor expanded around 0 31.3
Simplified31.1
Final simplification15.2
herbie shell --seed 2019169 +o rules:numerics
(FPCore (x eps)
:name "2tan (problem 3.3.2)"
:herbie-target
(/ (sin eps) (* (cos x) (cos (+ x eps))))
(- (tan (+ x eps)) (tan x)))