\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(\left(\cos \varepsilon \cdot \cos \varepsilon\right) \cdot \cos \varepsilon\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 r106613 = x;
double r106614 = eps;
double r106615 = r106613 + r106614;
double r106616 = tan(r106615);
double r106617 = tan(r106613);
double r106618 = r106616 - r106617;
return r106618;
}
double f(double x, double eps) {
double r106619 = eps;
double r106620 = -2.692188506596357e-51;
bool r106621 = r106619 <= r106620;
double r106622 = sin(r106619);
double r106623 = cos(r106619);
double r106624 = r106622 / r106623;
double r106625 = 1.0;
double r106626 = x;
double r106627 = sin(r106626);
double r106628 = r106627 * r106622;
double r106629 = cos(r106626);
double r106630 = r106623 * r106629;
double r106631 = r106628 / r106630;
double r106632 = 3.0;
double r106633 = pow(r106631, r106632);
double r106634 = r106625 - r106633;
double r106635 = r106624 / r106634;
double r106636 = 2.0;
double r106637 = pow(r106627, r106636);
double r106638 = pow(r106629, r106636);
double r106639 = r106637 / r106638;
double r106640 = r106623 * r106623;
double r106641 = r106640 * r106623;
double r106642 = r106638 * r106641;
double r106643 = r106637 / r106642;
double r106644 = pow(r106622, r106632);
double r106645 = r106644 / r106634;
double r106646 = pow(r106622, r106636);
double r106647 = r106646 / r106634;
double r106648 = pow(r106623, r106636);
double r106649 = r106647 / r106648;
double r106650 = r106627 / r106629;
double r106651 = pow(r106650, r106632);
double r106652 = r106651 + r106650;
double r106653 = r106634 * r106629;
double r106654 = r106627 / r106653;
double r106655 = fma(r106649, r106652, r106654);
double r106656 = r106655 + r106635;
double r106657 = fma(r106643, r106645, r106656);
double r106658 = r106657 - r106650;
double r106659 = fma(r106635, r106639, r106658);
double r106660 = 1.3424092820004812e-20;
bool r106661 = r106619 <= r106660;
double r106662 = pow(r106619, r106636);
double r106663 = 0.3333333333333333;
double r106664 = pow(r106619, r106632);
double r106665 = fma(r106663, r106664, r106619);
double r106666 = fma(r106626, r106662, r106665);
double r106667 = fma(r106635, r106639, r106666);
double r106668 = tan(r106626);
double r106669 = tan(r106619);
double r106670 = r106668 + r106669;
double r106671 = r106668 * r106668;
double r106672 = r106671 * r106668;
double r106673 = r106669 * r106669;
double r106674 = r106673 * r106669;
double r106675 = r106672 * r106674;
double r106676 = r106625 - r106675;
double r106677 = r106670 / r106676;
double r106678 = r106668 * r106669;
double r106679 = r106678 * r106678;
double r106680 = r106679 + r106678;
double r106681 = r106625 + r106680;
double r106682 = -r106668;
double r106683 = fma(r106677, r106681, r106682);
double r106684 = r106661 ? r106667 : r106683;
double r106685 = r106621 ? r106659 : r106684;
return r106685;
}




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 add-cbrt-cube3.9
Applied rem-cube-cbrt3.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)))