\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.8367694074004902 \cdot 10^{-68}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\tan x + \tan \varepsilon}{1 - \left(\left(\tan x \cdot \tan \varepsilon\right) \cdot \tan x\right) \cdot \tan \varepsilon}, 1 + \tan x \cdot \tan \varepsilon, -\tan x\right)\\
\mathbf{elif}\;\varepsilon \le 1.476728953358803 \cdot 10^{-117}:\\
\;\;\;\;\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 - \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 r120847 = x;
double r120848 = eps;
double r120849 = r120847 + r120848;
double r120850 = tan(r120849);
double r120851 = tan(r120847);
double r120852 = r120850 - r120851;
return r120852;
}
double f(double x, double eps) {
double r120853 = eps;
double r120854 = -1.8367694074004902e-68;
bool r120855 = r120853 <= r120854;
double r120856 = x;
double r120857 = tan(r120856);
double r120858 = tan(r120853);
double r120859 = r120857 + r120858;
double r120860 = 1.0;
double r120861 = r120857 * r120858;
double r120862 = r120861 * r120857;
double r120863 = r120862 * r120858;
double r120864 = r120860 - r120863;
double r120865 = r120859 / r120864;
double r120866 = r120860 + r120861;
double r120867 = -r120857;
double r120868 = fma(r120865, r120866, r120867);
double r120869 = 1.4767289533588029e-117;
bool r120870 = r120853 <= r120869;
double r120871 = 2.0;
double r120872 = pow(r120853, r120871);
double r120873 = pow(r120856, r120871);
double r120874 = fma(r120853, r120873, r120853);
double r120875 = fma(r120872, r120856, r120874);
double r120876 = cos(r120856);
double r120877 = r120859 * r120876;
double r120878 = r120860 - r120861;
double r120879 = sin(r120856);
double r120880 = r120878 * r120879;
double r120881 = r120877 - r120880;
double r120882 = r120878 * r120876;
double r120883 = r120881 / r120882;
double r120884 = r120870 ? r120875 : r120883;
double r120885 = r120855 ? r120868 : r120884;
return r120885;
}




Bits error versus x




Bits error versus eps
| Original | 36.7 |
|---|---|
| Target | 15.1 |
| Herbie | 15.4 |
if eps < -1.8367694074004902e-68Initial program 30.1
rmApplied tan-sum5.1
rmApplied flip--5.2
Applied associate-/r/5.2
Applied fma-neg5.2
rmApplied associate-*r*5.2
if -1.8367694074004902e-68 < eps < 1.4767289533588029e-117Initial program 48.6
Taylor expanded around 0 31.1
Simplified31.1
if 1.4767289533588029e-117 < eps Initial program 30.6
rmApplied tan-quot30.5
Applied tan-sum8.9
Applied frac-sub8.9
Final simplification15.4
herbie shell --seed 2020021 +o rules:numerics
(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)))