\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.62152936434175349 \cdot 10^{-15}:\\
\;\;\;\;\frac{1}{\frac{1 - \frac{\tan x \cdot \sin \varepsilon}{\cos \varepsilon}}{\tan x + \tan \varepsilon}} - \tan x\\
\mathbf{elif}\;\varepsilon \le 6.8144336109194134 \cdot 10^{-84}:\\
\;\;\;\;\mathsf{fma}\left({\varepsilon}^{2}, x, \mathsf{fma}\left(\varepsilon, {x}^{2}, \varepsilon\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(\tan x + \tan \varepsilon\right) \cdot \cos x - \left(1 - \frac{\tan x \cdot \sin \varepsilon}{\cos \varepsilon}\right) \cdot \sin x}{\left(1 - \frac{\tan x \cdot \sin \varepsilon}{\cos \varepsilon}\right) \cdot \cos x}\\
\end{array}double f(double x, double eps) {
double r116021 = x;
double r116022 = eps;
double r116023 = r116021 + r116022;
double r116024 = tan(r116023);
double r116025 = tan(r116021);
double r116026 = r116024 - r116025;
return r116026;
}
double f(double x, double eps) {
double r116027 = eps;
double r116028 = -2.6215293643417535e-15;
bool r116029 = r116027 <= r116028;
double r116030 = 1.0;
double r116031 = x;
double r116032 = tan(r116031);
double r116033 = sin(r116027);
double r116034 = r116032 * r116033;
double r116035 = cos(r116027);
double r116036 = r116034 / r116035;
double r116037 = r116030 - r116036;
double r116038 = tan(r116027);
double r116039 = r116032 + r116038;
double r116040 = r116037 / r116039;
double r116041 = r116030 / r116040;
double r116042 = r116041 - r116032;
double r116043 = 6.814433610919413e-84;
bool r116044 = r116027 <= r116043;
double r116045 = 2.0;
double r116046 = pow(r116027, r116045);
double r116047 = pow(r116031, r116045);
double r116048 = fma(r116027, r116047, r116027);
double r116049 = fma(r116046, r116031, r116048);
double r116050 = cos(r116031);
double r116051 = r116039 * r116050;
double r116052 = sin(r116031);
double r116053 = r116037 * r116052;
double r116054 = r116051 - r116053;
double r116055 = r116037 * r116050;
double r116056 = r116054 / r116055;
double r116057 = r116044 ? r116049 : r116056;
double r116058 = r116029 ? r116042 : r116057;
return r116058;
}




Bits error versus x




Bits error versus eps
| Original | 36.6 |
|---|---|
| Target | 15.0 |
| Herbie | 15.1 |
if eps < -2.6215293643417535e-15Initial program 29.4
rmApplied tan-sum0.7
rmApplied tan-quot0.7
Applied associate-*r/0.7
rmApplied clear-num0.8
if -2.6215293643417535e-15 < eps < 6.814433610919413e-84Initial program 45.9
rmApplied tan-sum45.9
Taylor expanded around 0 30.4
Simplified30.4
if 6.814433610919413e-84 < eps Initial program 30.4
rmApplied tan-sum6.7
rmApplied tan-quot6.7
Applied associate-*r/6.7
rmApplied tan-quot6.7
Applied frac-sub6.7
Final simplification15.1
herbie shell --seed 2019198 +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)))