\tan \left(x + \varepsilon\right) - \tan x
\left(\mathsf{fma}\left(\left(\sin x\right), \left(\frac{\frac{1}{\cos x}}{1 - \frac{\sin x}{\cos x} \cdot \frac{\sin \varepsilon}{\cos \varepsilon}}\right), \left(\frac{-1}{\cos x} \cdot \sin x\right)\right) + \mathsf{fma}\left(\left(\frac{-1}{\cos x}\right), \left(\sin x\right), \left(\frac{1}{\cos x} \cdot \sin x\right)\right)\right) + \frac{\frac{\sin \varepsilon}{\cos \varepsilon}}{1 - \frac{\sin x}{\cos x} \cdot \frac{\sin \varepsilon}{\cos \varepsilon}}double f(double x, double eps) {
double r2171014 = x;
double r2171015 = eps;
double r2171016 = r2171014 + r2171015;
double r2171017 = tan(r2171016);
double r2171018 = tan(r2171014);
double r2171019 = r2171017 - r2171018;
return r2171019;
}
double f(double x, double eps) {
double r2171020 = x;
double r2171021 = sin(r2171020);
double r2171022 = 1.0;
double r2171023 = cos(r2171020);
double r2171024 = r2171022 / r2171023;
double r2171025 = r2171021 / r2171023;
double r2171026 = eps;
double r2171027 = sin(r2171026);
double r2171028 = cos(r2171026);
double r2171029 = r2171027 / r2171028;
double r2171030 = r2171025 * r2171029;
double r2171031 = r2171022 - r2171030;
double r2171032 = r2171024 / r2171031;
double r2171033 = -1.0;
double r2171034 = r2171033 / r2171023;
double r2171035 = r2171034 * r2171021;
double r2171036 = fma(r2171021, r2171032, r2171035);
double r2171037 = r2171024 * r2171021;
double r2171038 = fma(r2171034, r2171021, r2171037);
double r2171039 = r2171036 + r2171038;
double r2171040 = r2171029 / r2171031;
double r2171041 = r2171039 + r2171040;
return r2171041;
}




Bits error versus x




Bits error versus eps
| Original | 37.2 |
|---|---|
| Target | 14.9 |
| Herbie | 13.1 |
Initial program 37.2
rmApplied tan-sum22.1
Taylor expanded around -inf 22.3
Simplified13.1
rmApplied div-inv14.0
Applied *-un-lft-identity14.0
Applied div-inv13.1
Applied times-frac13.1
Applied prod-diff13.1
Final simplification13.1
herbie shell --seed 2019130 +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)))