\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.063411921076795502138845593884088192778 \cdot 10^{-69}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\tan x + \tan \varepsilon}{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \frac{\tan x \cdot \sin \varepsilon}{\cos \varepsilon}}, 1 + \tan x \cdot \tan \varepsilon, -\tan x\right)\\
\mathbf{elif}\;\varepsilon \le 7.60970569110987615975455365802284218756 \cdot 10^{-27}:\\
\;\;\;\;\mathsf{fma}\left(x, {\varepsilon}^{2}, \mathsf{fma}\left({x}^{2}, \varepsilon, \varepsilon\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} \cdot \frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} - \tan x \cdot \tan x}{\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon} + \tan x}\\
\end{array}double f(double x, double eps) {
double r94275 = x;
double r94276 = eps;
double r94277 = r94275 + r94276;
double r94278 = tan(r94277);
double r94279 = tan(r94275);
double r94280 = r94278 - r94279;
return r94280;
}
double f(double x, double eps) {
double r94281 = eps;
double r94282 = -1.0634119210767955e-69;
bool r94283 = r94281 <= r94282;
double r94284 = x;
double r94285 = tan(r94284);
double r94286 = tan(r94281);
double r94287 = r94285 + r94286;
double r94288 = 1.0;
double r94289 = r94285 * r94286;
double r94290 = sin(r94281);
double r94291 = r94285 * r94290;
double r94292 = cos(r94281);
double r94293 = r94291 / r94292;
double r94294 = r94289 * r94293;
double r94295 = r94288 - r94294;
double r94296 = r94287 / r94295;
double r94297 = r94288 + r94289;
double r94298 = -r94285;
double r94299 = fma(r94296, r94297, r94298);
double r94300 = 7.609705691109876e-27;
bool r94301 = r94281 <= r94300;
double r94302 = 2.0;
double r94303 = pow(r94281, r94302);
double r94304 = pow(r94284, r94302);
double r94305 = fma(r94304, r94281, r94281);
double r94306 = fma(r94284, r94303, r94305);
double r94307 = r94288 - r94289;
double r94308 = r94287 / r94307;
double r94309 = r94308 * r94308;
double r94310 = r94285 * r94285;
double r94311 = r94309 - r94310;
double r94312 = r94308 + r94285;
double r94313 = r94311 / r94312;
double r94314 = r94301 ? r94306 : r94313;
double r94315 = r94283 ? r94299 : r94314;
return r94315;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.5 |
| Herbie | 15.1 |
if eps < -1.0634119210767955e-69Initial program 30.6
rmApplied tan-sum5.4
rmApplied flip--5.5
Applied associate-/r/5.5
Applied fma-neg5.5
rmApplied tan-quot5.5
Applied associate-*r/5.5
if -1.0634119210767955e-69 < eps < 7.609705691109876e-27Initial program 46.6
rmApplied tan-sum46.6
rmApplied flip--46.6
Applied associate-/r/46.6
Applied fma-neg46.6
Taylor expanded around 0 30.8
Simplified30.8
if 7.609705691109876e-27 < eps Initial program 30.3
rmApplied tan-sum1.9
rmApplied flip--2.1
Final simplification15.1
herbie shell --seed 2019209 +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)))