\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.85969210690957729 \cdot 10^{-20}:\\
\;\;\;\;\mathsf{fma}\left(\mathsf{fma}\left(\mathsf{fma}\left(\tan x, \tan \varepsilon, 1\right), \tan x \cdot \tan \varepsilon, 1\right), \frac{\tan x + \tan \varepsilon}{1 - {\left(\tan x \cdot \tan \varepsilon\right)}^{3}}, -\tan x\right) + \mathsf{fma}\left(-\tan x, 1, \tan x\right)\\
\mathbf{elif}\;\varepsilon \le 2.69186416397234008 \cdot 10^{-43}:\\
\;\;\;\;\mathsf{fma}\left({\varepsilon}^{2}, x, \mathsf{fma}\left(\varepsilon, {x}^{2}, \varepsilon\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\tan x + \tan \varepsilon}{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \frac{\sin x \cdot \tan \varepsilon}{\cos x}}, 1 + \tan x \cdot \tan \varepsilon, -\tan x\right)\\
\end{array}double f(double x, double eps) {
double r103998 = x;
double r103999 = eps;
double r104000 = r103998 + r103999;
double r104001 = tan(r104000);
double r104002 = tan(r103998);
double r104003 = r104001 - r104002;
return r104003;
}
double f(double x, double eps) {
double r104004 = eps;
double r104005 = -2.859692106909577e-20;
bool r104006 = r104004 <= r104005;
double r104007 = x;
double r104008 = tan(r104007);
double r104009 = tan(r104004);
double r104010 = 1.0;
double r104011 = fma(r104008, r104009, r104010);
double r104012 = r104008 * r104009;
double r104013 = fma(r104011, r104012, r104010);
double r104014 = r104008 + r104009;
double r104015 = 3.0;
double r104016 = pow(r104012, r104015);
double r104017 = r104010 - r104016;
double r104018 = r104014 / r104017;
double r104019 = -r104008;
double r104020 = fma(r104013, r104018, r104019);
double r104021 = fma(r104019, r104010, r104008);
double r104022 = r104020 + r104021;
double r104023 = 2.69186416397234e-43;
bool r104024 = r104004 <= r104023;
double r104025 = 2.0;
double r104026 = pow(r104004, r104025);
double r104027 = pow(r104007, r104025);
double r104028 = fma(r104004, r104027, r104004);
double r104029 = fma(r104026, r104007, r104028);
double r104030 = sin(r104007);
double r104031 = r104030 * r104009;
double r104032 = cos(r104007);
double r104033 = r104031 / r104032;
double r104034 = r104012 * r104033;
double r104035 = r104010 - r104034;
double r104036 = r104014 / r104035;
double r104037 = r104010 + r104012;
double r104038 = fma(r104036, r104037, r104019);
double r104039 = r104024 ? r104029 : r104038;
double r104040 = r104006 ? r104022 : r104039;
return r104040;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 14.5 |
| Herbie | 15.9 |
if eps < -2.859692106909577e-20Initial program 29.0
rmApplied tan-sum1.2
rmApplied add-cube-cbrt1.5
Applied flip3--1.5
Applied associate-/r/1.5
Applied prod-diff1.5
Simplified1.2
Simplified1.2
if -2.859692106909577e-20 < eps < 2.69186416397234e-43Initial program 45.9
Taylor expanded around 0 31.7
Simplified31.7
if 2.69186416397234e-43 < eps Initial program 30.0
rmApplied tan-sum3.7
rmApplied flip--3.7
Applied associate-/r/3.7
Applied fma-neg3.7
rmApplied tan-quot3.7
Applied associate-*l/3.7
Final simplification15.9
herbie shell --seed 2020035 +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)))