\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -6.095793693328762137298872934344524249228 \cdot 10^{-10}:\\
\;\;\;\;\frac{\cos x \cdot \left(\tan \varepsilon + \tan x\right) - \left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \sin x}{\left(1 - \tan x \cdot \tan \varepsilon\right) \cdot \cos x}\\
\mathbf{elif}\;\varepsilon \le 5.041570059440357903617497466096972283453 \cdot 10^{-35}:\\
\;\;\;\;\mathsf{fma}\left(x \cdot \varepsilon, x + \varepsilon, \varepsilon\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{{\left(\tan \varepsilon\right)}^{3} + {\left(\tan x\right)}^{3}}{\mathsf{fma}\left(\tan \varepsilon - \tan x, \tan \varepsilon, \tan x \cdot \tan x\right) \cdot \left(1 - \tan x \cdot \tan \varepsilon\right)} - \tan x\\
\end{array}double f(double x, double eps) {
double r6506749 = x;
double r6506750 = eps;
double r6506751 = r6506749 + r6506750;
double r6506752 = tan(r6506751);
double r6506753 = tan(r6506749);
double r6506754 = r6506752 - r6506753;
return r6506754;
}
double f(double x, double eps) {
double r6506755 = eps;
double r6506756 = -6.095793693328762e-10;
bool r6506757 = r6506755 <= r6506756;
double r6506758 = x;
double r6506759 = cos(r6506758);
double r6506760 = tan(r6506755);
double r6506761 = tan(r6506758);
double r6506762 = r6506760 + r6506761;
double r6506763 = r6506759 * r6506762;
double r6506764 = 1.0;
double r6506765 = r6506761 * r6506760;
double r6506766 = r6506764 - r6506765;
double r6506767 = sin(r6506758);
double r6506768 = r6506766 * r6506767;
double r6506769 = r6506763 - r6506768;
double r6506770 = r6506766 * r6506759;
double r6506771 = r6506769 / r6506770;
double r6506772 = 5.041570059440358e-35;
bool r6506773 = r6506755 <= r6506772;
double r6506774 = r6506758 * r6506755;
double r6506775 = r6506758 + r6506755;
double r6506776 = fma(r6506774, r6506775, r6506755);
double r6506777 = 3.0;
double r6506778 = pow(r6506760, r6506777);
double r6506779 = pow(r6506761, r6506777);
double r6506780 = r6506778 + r6506779;
double r6506781 = r6506760 - r6506761;
double r6506782 = r6506761 * r6506761;
double r6506783 = fma(r6506781, r6506760, r6506782);
double r6506784 = r6506783 * r6506766;
double r6506785 = r6506780 / r6506784;
double r6506786 = r6506785 - r6506761;
double r6506787 = r6506773 ? r6506776 : r6506786;
double r6506788 = r6506757 ? r6506771 : r6506787;
return r6506788;
}




Bits error versus x




Bits error versus eps
| Original | 37.1 |
|---|---|
| Target | 15.1 |
| Herbie | 15.4 |
if eps < -6.095793693328762e-10Initial program 30.2
rmApplied tan-quot30.1
Applied tan-sum0.6
Applied frac-sub0.6
if -6.095793693328762e-10 < eps < 5.041570059440358e-35Initial program 45.1
Taylor expanded around 0 31.2
Simplified30.9
if 5.041570059440358e-35 < eps Initial program 30.0
rmApplied tan-sum2.8
rmApplied flip3-+3.0
Applied associate-/l/2.9
Simplified2.9
Final simplification15.4
herbie shell --seed 2019171 +o rules:numerics
(FPCore (x eps)
:name "2tan (problem 3.3.2)"
:herbie-target
(/ (sin eps) (* (cos x) (cos (+ x eps))))
(- (tan (+ x eps)) (tan x)))