\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -8.360406307762016700753533365740142087902 \cdot 10^{-81}:\\
\;\;\;\;\frac{\mathsf{fma}\left(\cos x, \tan \varepsilon + \tan x, \sin x \cdot \left(-1 + \tan x \cdot \tan \varepsilon\right)\right)}{\left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \cos x}\\
\mathbf{elif}\;\varepsilon \le 5.858392615759789249871478064054441017892 \cdot 10^{-32}:\\
\;\;\;\;\left(x \cdot \varepsilon\right) \cdot \left(\varepsilon + x\right) + \varepsilon\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\tan x + \tan \varepsilon}{1 - \sqrt[3]{{\left(\tan x \cdot \tan \varepsilon\right)}^{6}}}, 1 + \frac{\sin x \cdot \sin \varepsilon}{\cos \varepsilon \cdot \cos x}, -\tan x\right)\\
\end{array}double f(double x, double eps) {
double r62228 = x;
double r62229 = eps;
double r62230 = r62228 + r62229;
double r62231 = tan(r62230);
double r62232 = tan(r62228);
double r62233 = r62231 - r62232;
return r62233;
}
double f(double x, double eps) {
double r62234 = eps;
double r62235 = -8.360406307762017e-81;
bool r62236 = r62234 <= r62235;
double r62237 = x;
double r62238 = cos(r62237);
double r62239 = tan(r62234);
double r62240 = tan(r62237);
double r62241 = r62239 + r62240;
double r62242 = sin(r62237);
double r62243 = -1.0;
double r62244 = r62240 * r62239;
double r62245 = r62243 + r62244;
double r62246 = r62242 * r62245;
double r62247 = fma(r62238, r62241, r62246);
double r62248 = 1.0;
double r62249 = r62248 - r62244;
double r62250 = r62249 * r62238;
double r62251 = r62247 / r62250;
double r62252 = 5.858392615759789e-32;
bool r62253 = r62234 <= r62252;
double r62254 = r62237 * r62234;
double r62255 = r62234 + r62237;
double r62256 = r62254 * r62255;
double r62257 = r62256 + r62234;
double r62258 = r62240 + r62239;
double r62259 = 6.0;
double r62260 = pow(r62244, r62259);
double r62261 = cbrt(r62260);
double r62262 = r62248 - r62261;
double r62263 = r62258 / r62262;
double r62264 = sin(r62234);
double r62265 = r62242 * r62264;
double r62266 = cos(r62234);
double r62267 = r62266 * r62238;
double r62268 = r62265 / r62267;
double r62269 = r62248 + r62268;
double r62270 = -r62240;
double r62271 = fma(r62263, r62269, r62270);
double r62272 = r62253 ? r62257 : r62271;
double r62273 = r62236 ? r62251 : r62272;
return r62273;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.3 |
| Herbie | 15.2 |
if eps < -8.360406307762017e-81Initial program 30.3
rmApplied tan-sum5.9
rmApplied tan-quot5.9
Applied frac-sub6.0
Simplified5.9
if -8.360406307762017e-81 < eps < 5.858392615759789e-32Initial program 46.7
rmApplied tan-sum46.7
rmApplied flip--46.7
Applied associate-/r/46.7
Applied fma-neg46.7
Taylor expanded around 0 31.1
Simplified30.8
if 5.858392615759789e-32 < eps Initial program 30.3
rmApplied tan-sum2.0
rmApplied flip--2.1
Applied associate-/r/2.1
Applied fma-neg2.1
rmApplied add-cbrt-cube2.1
Applied add-cbrt-cube2.1
Applied cbrt-unprod2.1
Applied add-cbrt-cube2.1
Applied add-cbrt-cube2.2
Applied cbrt-unprod2.2
Applied cbrt-unprod2.1
Simplified2.1
Taylor expanded around inf 2.1
Final simplification15.2
herbie shell --seed 2019326 +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)))