\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 r82674 = x;
double r82675 = eps;
double r82676 = r82674 + r82675;
double r82677 = tan(r82676);
double r82678 = tan(r82674);
double r82679 = r82677 - r82678;
return r82679;
}
double f(double x, double eps) {
double r82680 = eps;
double r82681 = -2.692188506596357e-51;
bool r82682 = r82680 <= r82681;
double r82683 = sin(r82680);
double r82684 = cos(r82680);
double r82685 = r82683 / r82684;
double r82686 = 1.0;
double r82687 = x;
double r82688 = sin(r82687);
double r82689 = r82688 * r82683;
double r82690 = cos(r82687);
double r82691 = r82684 * r82690;
double r82692 = r82689 / r82691;
double r82693 = 3.0;
double r82694 = pow(r82692, r82693);
double r82695 = r82686 - r82694;
double r82696 = r82685 / r82695;
double r82697 = 2.0;
double r82698 = pow(r82688, r82697);
double r82699 = pow(r82690, r82697);
double r82700 = r82698 / r82699;
double r82701 = pow(r82684, r82697);
double r82702 = r82684 * r82701;
double r82703 = r82699 * r82702;
double r82704 = r82698 / r82703;
double r82705 = pow(r82683, r82693);
double r82706 = r82705 / r82695;
double r82707 = pow(r82683, r82697);
double r82708 = r82707 / r82695;
double r82709 = r82708 / r82701;
double r82710 = r82688 / r82690;
double r82711 = pow(r82710, r82693);
double r82712 = r82711 + r82710;
double r82713 = r82695 * r82690;
double r82714 = r82688 / r82713;
double r82715 = fma(r82709, r82712, r82714);
double r82716 = r82715 + r82696;
double r82717 = fma(r82704, r82706, r82716);
double r82718 = r82717 - r82710;
double r82719 = fma(r82696, r82700, r82718);
double r82720 = 1.3424092820004812e-20;
bool r82721 = r82680 <= r82720;
double r82722 = pow(r82680, r82697);
double r82723 = 0.3333333333333333;
double r82724 = pow(r82680, r82693);
double r82725 = fma(r82723, r82724, r82680);
double r82726 = fma(r82687, r82722, r82725);
double r82727 = fma(r82696, r82700, r82726);
double r82728 = tan(r82687);
double r82729 = tan(r82680);
double r82730 = r82728 + r82729;
double r82731 = r82728 * r82728;
double r82732 = r82731 * r82728;
double r82733 = r82729 * r82729;
double r82734 = r82733 * r82729;
double r82735 = r82732 * r82734;
double r82736 = r82686 - r82735;
double r82737 = r82730 / r82736;
double r82738 = r82728 * r82729;
double r82739 = r82738 * r82738;
double r82740 = r82739 + r82738;
double r82741 = r82686 + r82740;
double r82742 = -r82728;
double r82743 = fma(r82737, r82741, r82742);
double r82744 = r82721 ? r82727 : r82743;
double r82745 = r82682 ? r82719 : r82744;
return r82745;
}




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)))