\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.546126625120823366227573074396806531005 \cdot 10^{-44}:\\
\;\;\;\;\frac{\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon}{\left(1 - \frac{\sin x \cdot \sin \varepsilon}{\cos x \cdot \cos \varepsilon}\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)} - \tan x\\
\mathbf{elif}\;\varepsilon \le 3.567141279375676635666856121536066364286 \cdot 10^{-32}:\\
\;\;\;\;\left(\varepsilon \cdot x\right) \cdot \left(x + \varepsilon\right) + \varepsilon\\
\mathbf{else}:\\
\;\;\;\;\frac{\tan x \cdot \tan x - \tan \varepsilon \cdot \tan \varepsilon}{\left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x - \tan \varepsilon\right)} - \tan x\\
\end{array}double f(double x, double eps) {
double r237488 = x;
double r237489 = eps;
double r237490 = r237488 + r237489;
double r237491 = tan(r237490);
double r237492 = tan(r237488);
double r237493 = r237491 - r237492;
return r237493;
}
double f(double x, double eps) {
double r237494 = eps;
double r237495 = -2.5461266251208234e-44;
bool r237496 = r237494 <= r237495;
double r237497 = x;
double r237498 = sin(r237497);
double r237499 = cos(r237494);
double r237500 = r237498 * r237499;
double r237501 = cos(r237497);
double r237502 = sin(r237494);
double r237503 = r237501 * r237502;
double r237504 = r237500 + r237503;
double r237505 = 1.0;
double r237506 = r237498 * r237502;
double r237507 = r237501 * r237499;
double r237508 = r237506 / r237507;
double r237509 = r237505 - r237508;
double r237510 = r237509 * r237507;
double r237511 = r237504 / r237510;
double r237512 = tan(r237497);
double r237513 = r237511 - r237512;
double r237514 = 3.5671412793756766e-32;
bool r237515 = r237494 <= r237514;
double r237516 = r237494 * r237497;
double r237517 = r237497 + r237494;
double r237518 = r237516 * r237517;
double r237519 = r237518 + r237494;
double r237520 = r237512 * r237512;
double r237521 = tan(r237494);
double r237522 = r237521 * r237521;
double r237523 = r237520 - r237522;
double r237524 = r237512 * r237521;
double r237525 = r237505 - r237524;
double r237526 = r237512 - r237521;
double r237527 = r237525 * r237526;
double r237528 = r237523 / r237527;
double r237529 = r237528 - r237512;
double r237530 = r237515 ? r237519 : r237529;
double r237531 = r237496 ? r237513 : r237530;
return r237531;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.3 |
|---|---|
| Target | 15.5 |
| Herbie | 15.7 |
if eps < -2.5461266251208234e-44Initial program 30.1
rmApplied tan-sum3.5
rmApplied add-cbrt-cube3.6
Applied add-cbrt-cube3.6
Applied cbrt-unprod3.6
Simplified3.6
rmApplied tan-quot3.6
Applied tan-quot3.6
Applied frac-times3.6
Applied cube-div3.6
Applied cbrt-div3.6
Simplified3.6
Simplified3.6
rmApplied tan-quot3.7
Applied tan-quot3.7
Applied frac-add3.7
Applied associate-/l/3.8
if -2.5461266251208234e-44 < eps < 3.5671412793756766e-32Initial program 46.5
Taylor expanded around 0 32.4
Simplified32.1
if 3.5671412793756766e-32 < eps Initial program 30.7
rmApplied tan-sum2.8
rmApplied flip-+2.9
Applied associate-/l/2.9
Final simplification15.7
herbie shell --seed 2019322
(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)))