\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -3.410099351220910763354583645867667501331 \cdot 10^{-22}:\\
\;\;\;\;\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 1.126517697987101802007161830317359286222 \cdot 10^{-17}:\\
\;\;\;\;\mathsf{fma}\left({\varepsilon}^{2}, x, \mathsf{fma}\left(\varepsilon, {x}^{2}, \varepsilon\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\tan x + \tan \varepsilon, \frac{1}{1 - \tan x \cdot \tan \varepsilon}, -\tan x\right)\\
\end{array}double f(double x, double eps) {
double r145049 = x;
double r145050 = eps;
double r145051 = r145049 + r145050;
double r145052 = tan(r145051);
double r145053 = tan(r145049);
double r145054 = r145052 - r145053;
return r145054;
}
double f(double x, double eps) {
double r145055 = eps;
double r145056 = -3.4100993512209108e-22;
bool r145057 = r145055 <= r145056;
double r145058 = x;
double r145059 = tan(r145058);
double r145060 = tan(r145055);
double r145061 = 1.0;
double r145062 = fma(r145059, r145060, r145061);
double r145063 = r145059 * r145060;
double r145064 = fma(r145062, r145063, r145061);
double r145065 = r145059 + r145060;
double r145066 = 3.0;
double r145067 = pow(r145063, r145066);
double r145068 = r145061 - r145067;
double r145069 = r145065 / r145068;
double r145070 = -r145059;
double r145071 = fma(r145064, r145069, r145070);
double r145072 = fma(r145070, r145061, r145059);
double r145073 = r145071 + r145072;
double r145074 = 1.1265176979871018e-17;
bool r145075 = r145055 <= r145074;
double r145076 = 2.0;
double r145077 = pow(r145055, r145076);
double r145078 = pow(r145058, r145076);
double r145079 = fma(r145055, r145078, r145055);
double r145080 = fma(r145077, r145058, r145079);
double r145081 = r145061 - r145063;
double r145082 = r145061 / r145081;
double r145083 = fma(r145065, r145082, r145070);
double r145084 = r145075 ? r145080 : r145083;
double r145085 = r145057 ? r145073 : r145084;
return r145085;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.0 |
| Herbie | 15.5 |
if eps < -3.4100993512209108e-22Initial program 29.6
rmApplied tan-sum1.4
rmApplied add-cube-cbrt1.8
Applied flip3--1.8
Applied associate-/r/1.8
Applied prod-diff1.8
Simplified1.5
Simplified1.5
if -3.4100993512209108e-22 < eps < 1.1265176979871018e-17Initial program 45.3
Taylor expanded around 0 31.4
Simplified31.4
if 1.1265176979871018e-17 < eps Initial program 29.9
rmApplied tan-sum0.9
rmApplied div-inv0.9
Applied fma-neg0.9
Final simplification15.5
herbie shell --seed 2019352 +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)))