\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.692188506596356957702783826346824106171 \cdot 10^{-51}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\frac{\sin \varepsilon}{\cos \varepsilon}}{1 - {\left(\frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}\right)}^{3}}, \frac{{\left(\sin x\right)}^{2}}{{\left(\cos x\right)}^{2}}, \mathsf{fma}\left(\frac{{\left(\sin x\right)}^{2}}{{\left(\cos x\right)}^{2} \cdot \left(\cos \varepsilon \cdot {\left(\cos \varepsilon\right)}^{2}\right)}, \frac{{\left(\sin \varepsilon\right)}^{3}}{1 - {\left(\frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}\right)}^{3}}, \mathsf{fma}\left(\frac{\frac{{\left(\sin \varepsilon\right)}^{2}}{1 - {\left(\frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}\right)}^{3}}}{{\left(\cos \varepsilon\right)}^{2}}, {\left(\frac{\sin x}{\cos x}\right)}^{3} + \frac{\sin x}{\cos x}, \frac{\sin x}{\left(1 - {\left(\frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}\right)}^{3}\right) \cdot \cos x}\right) + \frac{\frac{\sin \varepsilon}{\cos \varepsilon}}{1 - {\left(\frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}\right)}^{3}}\right) - \frac{\sin x}{\cos x}\right)\\
\mathbf{elif}\;\varepsilon \le 1.342409282000481224159305634141017423042 \cdot 10^{-20}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\frac{\sin \varepsilon}{\cos \varepsilon}}{1 - {\left(\frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}\right)}^{3}}, \frac{{\left(\sin x\right)}^{2}}{{\left(\cos x\right)}^{2}}, \mathsf{fma}\left(x, {\varepsilon}^{2}, \mathsf{fma}\left(\frac{1}{3}, {\varepsilon}^{3}, \varepsilon\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\tan x + \tan \varepsilon}{1 - \left(\left(\tan x \cdot \tan x\right) \cdot \tan x\right) \cdot \left(\left(\tan \varepsilon \cdot \tan \varepsilon\right) \cdot \tan \varepsilon\right)}, 1 + \left(\left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right) + \tan x \cdot \tan \varepsilon\right), -\tan x\right)\\
\end{array}double f(double x, double eps) {
double r96432 = x;
double r96433 = eps;
double r96434 = r96432 + r96433;
double r96435 = tan(r96434);
double r96436 = tan(r96432);
double r96437 = r96435 - r96436;
return r96437;
}
double f(double x, double eps) {
double r96438 = eps;
double r96439 = -2.692188506596357e-51;
bool r96440 = r96438 <= r96439;
double r96441 = sin(r96438);
double r96442 = cos(r96438);
double r96443 = r96441 / r96442;
double r96444 = 1.0;
double r96445 = x;
double r96446 = sin(r96445);
double r96447 = r96446 * r96441;
double r96448 = cos(r96445);
double r96449 = r96442 * r96448;
double r96450 = r96447 / r96449;
double r96451 = 3.0;
double r96452 = pow(r96450, r96451);
double r96453 = r96444 - r96452;
double r96454 = r96443 / r96453;
double r96455 = 2.0;
double r96456 = pow(r96446, r96455);
double r96457 = pow(r96448, r96455);
double r96458 = r96456 / r96457;
double r96459 = pow(r96442, r96455);
double r96460 = r96442 * r96459;
double r96461 = r96457 * r96460;
double r96462 = r96456 / r96461;
double r96463 = pow(r96441, r96451);
double r96464 = r96463 / r96453;
double r96465 = pow(r96441, r96455);
double r96466 = r96465 / r96453;
double r96467 = r96466 / r96459;
double r96468 = r96446 / r96448;
double r96469 = pow(r96468, r96451);
double r96470 = r96469 + r96468;
double r96471 = r96453 * r96448;
double r96472 = r96446 / r96471;
double r96473 = fma(r96467, r96470, r96472);
double r96474 = r96473 + r96454;
double r96475 = fma(r96462, r96464, r96474);
double r96476 = r96475 - r96468;
double r96477 = fma(r96454, r96458, r96476);
double r96478 = 1.3424092820004812e-20;
bool r96479 = r96438 <= r96478;
double r96480 = pow(r96438, r96455);
double r96481 = 0.3333333333333333;
double r96482 = pow(r96438, r96451);
double r96483 = fma(r96481, r96482, r96438);
double r96484 = fma(r96445, r96480, r96483);
double r96485 = fma(r96454, r96458, r96484);
double r96486 = tan(r96445);
double r96487 = tan(r96438);
double r96488 = r96486 + r96487;
double r96489 = r96486 * r96486;
double r96490 = r96489 * r96486;
double r96491 = r96487 * r96487;
double r96492 = r96491 * r96487;
double r96493 = r96490 * r96492;
double r96494 = r96444 - r96493;
double r96495 = r96488 / r96494;
double r96496 = r96486 * r96487;
double r96497 = r96496 * r96496;
double r96498 = r96497 + r96496;
double r96499 = r96444 + r96498;
double r96500 = -r96486;
double r96501 = fma(r96495, r96499, r96500);
double r96502 = r96479 ? r96485 : r96501;
double r96503 = r96440 ? r96477 : r96502;
return r96503;
}




Bits error versus x




Bits error versus eps
| Original | 36.7 |
|---|---|
| Target | 14.9 |
| Herbie | 6.1 |
if eps < -2.692188506596357e-51Initial program 30.6
rmApplied tan-sum4.1
rmApplied flip3--4.1
Applied associate-/r/4.1
Applied fma-neg4.1
Taylor expanded around -inf 4.4
Simplified3.8
rmApplied cube-mult3.8
Simplified3.8
if -2.692188506596357e-51 < eps < 1.3424092820004812e-20Initial program 45.8
rmApplied tan-sum45.8
rmApplied flip3--45.8
Applied associate-/r/45.8
Applied fma-neg45.8
Taylor expanded around -inf 45.8
Simplified41.1
Taylor expanded around 0 10.4
Simplified10.4
if 1.3424092820004812e-20 < eps Initial program 28.0
rmApplied tan-sum1.4
rmApplied flip3--1.4
Applied associate-/r/1.4
Applied fma-neg1.4
rmApplied add-cbrt-cube1.5
Applied add-cbrt-cube1.5
Applied cbrt-unprod1.5
Applied rem-cube-cbrt1.4
Final simplification6.1
herbie shell --seed 2019323 +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)))