\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.446565224968262695805678403565484172834 \cdot 10^{-28}:\\
\;\;\;\;\frac{\tan x + \tan \varepsilon}{\frac{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \frac{\sin x \cdot \sin \varepsilon}{\cos x \cdot \cos \varepsilon}}{1 + \tan x \cdot \tan \varepsilon}} - \tan x\\
\mathbf{elif}\;\varepsilon \le 1.512802939619095650173315933458520206069 \cdot 10^{-100}:\\
\;\;\;\;\varepsilon + \left(x \cdot \varepsilon\right) \cdot \left(\varepsilon + x\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(\tan x + \tan \varepsilon\right) \cdot \cos x - \left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \sin x}{\left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \cos x}\\
\end{array}double f(double x, double eps) {
double r80567 = x;
double r80568 = eps;
double r80569 = r80567 + r80568;
double r80570 = tan(r80569);
double r80571 = tan(r80567);
double r80572 = r80570 - r80571;
return r80572;
}
double f(double x, double eps) {
double r80573 = eps;
double r80574 = -1.4465652249682627e-28;
bool r80575 = r80573 <= r80574;
double r80576 = x;
double r80577 = tan(r80576);
double r80578 = tan(r80573);
double r80579 = r80577 + r80578;
double r80580 = 1.0;
double r80581 = r80577 * r80578;
double r80582 = sin(r80576);
double r80583 = sin(r80573);
double r80584 = r80582 * r80583;
double r80585 = cos(r80576);
double r80586 = cos(r80573);
double r80587 = r80585 * r80586;
double r80588 = r80584 / r80587;
double r80589 = r80581 * r80588;
double r80590 = r80580 - r80589;
double r80591 = r80580 + r80581;
double r80592 = r80590 / r80591;
double r80593 = r80579 / r80592;
double r80594 = r80593 - r80577;
double r80595 = 1.5128029396190957e-100;
bool r80596 = r80573 <= r80595;
double r80597 = r80576 * r80573;
double r80598 = r80573 + r80576;
double r80599 = r80597 * r80598;
double r80600 = r80573 + r80599;
double r80601 = r80579 * r80585;
double r80602 = r80580 - r80581;
double r80603 = r80602 * r80582;
double r80604 = r80601 - r80603;
double r80605 = r80602 * r80585;
double r80606 = r80604 / r80605;
double r80607 = r80596 ? r80600 : r80606;
double r80608 = r80575 ? r80594 : r80607;
return r80608;
}




Bits error versus x




Bits error versus eps
Results
| Original | 36.8 |
|---|---|
| Target | 15.2 |
| Herbie | 15.5 |
if eps < -1.4465652249682627e-28Initial program 29.7
rmApplied tan-sum2.1
rmApplied flip--2.1
Simplified2.1
rmApplied tan-quot2.1
Applied tan-quot2.1
Applied frac-times2.1
if -1.4465652249682627e-28 < eps < 1.5128029396190957e-100Initial program 46.2
rmApplied tan-sum46.2
Taylor expanded around 0 31.3
Simplified31.1
if 1.5128029396190957e-100 < eps Initial program 31.4
rmApplied tan-quot31.2
Applied tan-sum7.7
Applied frac-sub7.8
Final simplification15.5
herbie shell --seed 2019298
(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)))