\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -6.929244313528967253629797030059496249939 \cdot 10^{-77}:\\
\;\;\;\;\frac{\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon}{\left(1 - \frac{\tan x \cdot \sin \varepsilon}{\cos \varepsilon}\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)} - \tan x\\
\mathbf{elif}\;\varepsilon \le 1.084923224249312910690492748285721451604 \cdot 10^{-19}:\\
\;\;\;\;\varepsilon + \left(\varepsilon \cdot x\right) \cdot \left(x + \varepsilon\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 r87170 = x;
double r87171 = eps;
double r87172 = r87170 + r87171;
double r87173 = tan(r87172);
double r87174 = tan(r87170);
double r87175 = r87173 - r87174;
return r87175;
}
double f(double x, double eps) {
double r87176 = eps;
double r87177 = -6.929244313528967e-77;
bool r87178 = r87176 <= r87177;
double r87179 = x;
double r87180 = sin(r87179);
double r87181 = cos(r87176);
double r87182 = r87180 * r87181;
double r87183 = cos(r87179);
double r87184 = sin(r87176);
double r87185 = r87183 * r87184;
double r87186 = r87182 + r87185;
double r87187 = 1.0;
double r87188 = tan(r87179);
double r87189 = r87188 * r87184;
double r87190 = r87189 / r87181;
double r87191 = r87187 - r87190;
double r87192 = r87183 * r87181;
double r87193 = r87191 * r87192;
double r87194 = r87186 / r87193;
double r87195 = r87194 - r87188;
double r87196 = 1.084923224249313e-19;
bool r87197 = r87176 <= r87196;
double r87198 = r87176 * r87179;
double r87199 = r87179 + r87176;
double r87200 = r87198 * r87199;
double r87201 = r87176 + r87200;
double r87202 = tan(r87176);
double r87203 = r87188 + r87202;
double r87204 = r87203 * r87183;
double r87205 = r87188 * r87202;
double r87206 = r87187 - r87205;
double r87207 = r87206 * r87180;
double r87208 = r87204 - r87207;
double r87209 = r87206 * r87183;
double r87210 = r87208 / r87209;
double r87211 = r87197 ? r87201 : r87210;
double r87212 = r87178 ? r87195 : r87211;
return r87212;
}




Bits error versus x




Bits error versus eps
Results
| Original | 37.1 |
|---|---|
| Target | 15.0 |
| Herbie | 15.0 |
if eps < -6.929244313528967e-77Initial program 30.9
rmApplied tan-sum6.0
rmApplied tan-quot6.1
Applied tan-quot6.1
Applied frac-add6.1
Applied associate-/l/6.1
rmApplied tan-quot6.1
Applied associate-*r/6.1
if -6.929244313528967e-77 < eps < 1.084923224249313e-19Initial program 46.6
rmApplied tan-sum46.6
rmApplied add-cube-cbrt46.6
Taylor expanded around 0 30.1
Simplified29.9
if 1.084923224249313e-19 < eps Initial program 29.0
rmApplied tan-quot28.8
Applied tan-sum1.2
Applied frac-sub1.3
Final simplification15.0
herbie shell --seed 2019303
(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)))