\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -5.846838523325570787825156049243897541628 \cdot 10^{-31} \lor \neg \left(\varepsilon \le 1.133022669290607839262338917615733856917 \cdot 10^{-17}\right):\\
\;\;\;\;\left(\tan x + \tan \varepsilon\right) \cdot \frac{1}{1 - \tan x \cdot \tan \varepsilon} - \tan x\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x \cdot \varepsilon, x + \varepsilon, \varepsilon\right)\\
\end{array}double f(double x, double eps) {
double r111742 = x;
double r111743 = eps;
double r111744 = r111742 + r111743;
double r111745 = tan(r111744);
double r111746 = tan(r111742);
double r111747 = r111745 - r111746;
return r111747;
}
double f(double x, double eps) {
double r111748 = eps;
double r111749 = -5.846838523325571e-31;
bool r111750 = r111748 <= r111749;
double r111751 = 1.1330226692906078e-17;
bool r111752 = r111748 <= r111751;
double r111753 = !r111752;
bool r111754 = r111750 || r111753;
double r111755 = x;
double r111756 = tan(r111755);
double r111757 = tan(r111748);
double r111758 = r111756 + r111757;
double r111759 = 1.0;
double r111760 = r111756 * r111757;
double r111761 = r111759 - r111760;
double r111762 = r111759 / r111761;
double r111763 = r111758 * r111762;
double r111764 = r111763 - r111756;
double r111765 = r111755 * r111748;
double r111766 = r111755 + r111748;
double r111767 = fma(r111765, r111766, r111748);
double r111768 = r111754 ? r111764 : r111767;
return r111768;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.0 |
| Herbie | 15.6 |
if eps < -5.846838523325571e-31 or 1.1330226692906078e-17 < eps Initial program 29.3
rmApplied tan-sum1.4
rmApplied div-inv1.4
if -5.846838523325571e-31 < eps < 1.1330226692906078e-17Initial program 46.1
rmApplied tan-sum46.1
rmApplied add-cube-cbrt46.1
Applied *-un-lft-identity46.1
Applied times-frac46.1
Applied fma-neg46.1
Taylor expanded around 0 32.5
Simplified32.3
Final simplification15.6
herbie shell --seed 2019347 +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)))