\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -1.50639832785694013 \cdot 10^{-96}:\\
\;\;\;\;\mathsf{fma}\left(\frac{\mathsf{fma}\left(\sin x, \cos \varepsilon, \cos x \cdot \sin \varepsilon\right)}{\cos x \cdot \cos \varepsilon}, \frac{1}{1 - \tan x \cdot \tan \varepsilon}, -\tan x\right)\\
\mathbf{elif}\;\varepsilon \le 6.0287019077622141 \cdot 10^{-70}:\\
\;\;\;\;\mathsf{fma}\left(\mathsf{fma}\left(x, x, 1\right), \varepsilon, x \cdot {\varepsilon}^{2}\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 r91941 = x;
double r91942 = eps;
double r91943 = r91941 + r91942;
double r91944 = tan(r91943);
double r91945 = tan(r91941);
double r91946 = r91944 - r91945;
return r91946;
}
double f(double x, double eps) {
double r91947 = eps;
double r91948 = -1.5063983278569401e-96;
bool r91949 = r91947 <= r91948;
double r91950 = x;
double r91951 = sin(r91950);
double r91952 = cos(r91947);
double r91953 = cos(r91950);
double r91954 = sin(r91947);
double r91955 = r91953 * r91954;
double r91956 = fma(r91951, r91952, r91955);
double r91957 = r91953 * r91952;
double r91958 = r91956 / r91957;
double r91959 = 1.0;
double r91960 = tan(r91950);
double r91961 = tan(r91947);
double r91962 = r91960 * r91961;
double r91963 = r91959 - r91962;
double r91964 = r91959 / r91963;
double r91965 = -r91960;
double r91966 = fma(r91958, r91964, r91965);
double r91967 = 6.028701907762214e-70;
bool r91968 = r91947 <= r91967;
double r91969 = fma(r91950, r91950, r91959);
double r91970 = 2.0;
double r91971 = pow(r91947, r91970);
double r91972 = r91950 * r91971;
double r91973 = fma(r91969, r91947, r91972);
double r91974 = r91960 + r91961;
double r91975 = r91974 * r91953;
double r91976 = r91963 * r91951;
double r91977 = r91975 - r91976;
double r91978 = r91963 * r91953;
double r91979 = r91977 / r91978;
double r91980 = r91968 ? r91973 : r91979;
double r91981 = r91949 ? r91966 : r91980;
return r91981;
}




Bits error versus x




Bits error versus eps
| Original | 37.0 |
|---|---|
| Target | 15.3 |
| Herbie | 15.7 |
if eps < -1.5063983278569401e-96Initial program 31.4
rmApplied tan-sum7.7
rmApplied div-inv7.7
Applied fma-neg7.7
rmApplied tan-quot7.8
Applied tan-quot7.9
Applied frac-add7.9
Simplified7.9
if -1.5063983278569401e-96 < eps < 6.028701907762214e-70Initial program 47.9
rmApplied tan-sum47.9
Taylor expanded around 0 31.3
Simplified31.3
if 6.028701907762214e-70 < eps Initial program 30.1
rmApplied tan-quot29.9
Applied tan-sum5.5
Applied frac-sub5.5
Final simplification15.7
herbie shell --seed 2019199 +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)))