\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}:\\
\;\;\;\;\varepsilon + \left(x \cdot \varepsilon\right) \cdot \left(\varepsilon + x\right)\\
\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 r60301 = x;
double r60302 = eps;
double r60303 = r60301 + r60302;
double r60304 = tan(r60303);
double r60305 = tan(r60301);
double r60306 = r60304 - r60305;
return r60306;
}
double f(double x, double eps) {
double r60307 = eps;
double r60308 = -8.360406307762017e-81;
bool r60309 = r60307 <= r60308;
double r60310 = x;
double r60311 = cos(r60310);
double r60312 = tan(r60307);
double r60313 = tan(r60310);
double r60314 = r60312 + r60313;
double r60315 = sin(r60310);
double r60316 = -1.0;
double r60317 = r60313 * r60312;
double r60318 = r60316 + r60317;
double r60319 = r60315 * r60318;
double r60320 = fma(r60311, r60314, r60319);
double r60321 = 1.0;
double r60322 = r60321 - r60317;
double r60323 = r60322 * r60311;
double r60324 = r60320 / r60323;
double r60325 = 5.858392615759789e-32;
bool r60326 = r60307 <= r60325;
double r60327 = r60310 * r60307;
double r60328 = r60307 + r60310;
double r60329 = r60327 * r60328;
double r60330 = r60307 + r60329;
double r60331 = r60313 + r60312;
double r60332 = 6.0;
double r60333 = pow(r60317, r60332);
double r60334 = cbrt(r60333);
double r60335 = r60321 - r60334;
double r60336 = r60331 / r60335;
double r60337 = sin(r60307);
double r60338 = r60315 * r60337;
double r60339 = cos(r60307);
double r60340 = r60339 * r60311;
double r60341 = r60338 / r60340;
double r60342 = r60321 + r60341;
double r60343 = -r60313;
double r60344 = fma(r60336, r60342, r60343);
double r60345 = r60326 ? r60330 : r60344;
double r60346 = r60309 ? r60324 : r60345;
return r60346;
}




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