\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le \frac{-4516838385750293}{6.518515124270355476059026202910010115365 \cdot 10^{91}}:\\
\;\;\;\;\frac{\sin x \cdot \cos \varepsilon + \cos x \cdot \sin \varepsilon}{\left(1 - \frac{\tan x}{\frac{\cos \varepsilon}{\sin \varepsilon}}\right) \cdot \left(\cos x \cdot \cos \varepsilon\right)} - \tan x\\
\mathbf{elif}\;\varepsilon \le \frac{4506594759216947}{41538374868278621028243970633760768}:\\
\;\;\;\;\varepsilon + \left(x \cdot \varepsilon\right) \cdot \left(\varepsilon + x\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 r87490 = x;
double r87491 = eps;
double r87492 = r87490 + r87491;
double r87493 = tan(r87492);
double r87494 = tan(r87490);
double r87495 = r87493 - r87494;
return r87495;
}
double f(double x, double eps) {
double r87496 = eps;
double r87497 = -4516838385750293.0;
double r87498 = 6.5185151242703555e+91;
double r87499 = r87497 / r87498;
bool r87500 = r87496 <= r87499;
double r87501 = x;
double r87502 = sin(r87501);
double r87503 = cos(r87496);
double r87504 = r87502 * r87503;
double r87505 = cos(r87501);
double r87506 = sin(r87496);
double r87507 = r87505 * r87506;
double r87508 = r87504 + r87507;
double r87509 = 1.0;
double r87510 = tan(r87501);
double r87511 = r87503 / r87506;
double r87512 = r87510 / r87511;
double r87513 = r87509 - r87512;
double r87514 = r87505 * r87503;
double r87515 = r87513 * r87514;
double r87516 = r87508 / r87515;
double r87517 = r87516 - r87510;
double r87518 = 4506594759216947.0;
double r87519 = 4.153837486827862e+34;
double r87520 = r87518 / r87519;
bool r87521 = r87496 <= r87520;
double r87522 = r87501 * r87496;
double r87523 = r87496 + r87501;
double r87524 = r87522 * r87523;
double r87525 = r87496 + r87524;
double r87526 = tan(r87496);
double r87527 = r87510 + r87526;
double r87528 = r87527 * r87505;
double r87529 = r87510 * r87526;
double r87530 = r87509 - r87529;
double r87531 = r87530 * r87502;
double r87532 = r87528 - r87531;
double r87533 = r87530 * r87505;
double r87534 = r87532 / r87533;
double r87535 = r87521 ? r87525 : r87534;
double r87536 = r87500 ? r87517 : r87535;
return r87536;
}




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
rmApplied associate-/l*6.1
if -6.929244313528967e-77 < eps < 1.084923224249313e-19Initial program 46.6
rmApplied tan-sum46.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)))