Average Error: 36.9 → 15.9
Time: 10.5s
Precision: 64
\[\tan \left(x + \varepsilon\right) - \tan x\]
\[\begin{array}{l} \mathbf{if}\;\varepsilon \le -2.13556300457512966 \cdot 10^{-97}:\\ \;\;\;\;\mathsf{fma}\left(\tan x + \tan \varepsilon, \frac{1}{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right)} \cdot \left(1 + \tan x \cdot \tan \varepsilon\right), -\tan x\right)\\ \mathbf{elif}\;\varepsilon \le 1.8550476959582249 \cdot 10^{-60}:\\ \;\;\;\;\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}\]
\tan \left(x + \varepsilon\right) - \tan x
\begin{array}{l}
\mathbf{if}\;\varepsilon \le -2.13556300457512966 \cdot 10^{-97}:\\
\;\;\;\;\mathsf{fma}\left(\tan x + \tan \varepsilon, \frac{1}{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right)} \cdot \left(1 + \tan x \cdot \tan \varepsilon\right), -\tan x\right)\\

\mathbf{elif}\;\varepsilon \le 1.8550476959582249 \cdot 10^{-60}:\\
\;\;\;\;\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 r130448 = x;
        double r130449 = eps;
        double r130450 = r130448 + r130449;
        double r130451 = tan(r130450);
        double r130452 = tan(r130448);
        double r130453 = r130451 - r130452;
        return r130453;
}

double f(double x, double eps) {
        double r130454 = eps;
        double r130455 = -2.1355630045751297e-97;
        bool r130456 = r130454 <= r130455;
        double r130457 = x;
        double r130458 = tan(r130457);
        double r130459 = tan(r130454);
        double r130460 = r130458 + r130459;
        double r130461 = 1.0;
        double r130462 = r130458 * r130459;
        double r130463 = r130462 * r130462;
        double r130464 = r130461 - r130463;
        double r130465 = r130461 / r130464;
        double r130466 = r130461 + r130462;
        double r130467 = r130465 * r130466;
        double r130468 = -r130458;
        double r130469 = fma(r130460, r130467, r130468);
        double r130470 = 1.855047695958225e-60;
        bool r130471 = r130454 <= r130470;
        double r130472 = 2.0;
        double r130473 = pow(r130454, r130472);
        double r130474 = pow(r130457, r130472);
        double r130475 = fma(r130454, r130474, r130454);
        double r130476 = fma(r130473, r130457, r130475);
        double r130477 = cos(r130457);
        double r130478 = r130460 * r130477;
        double r130479 = r130461 - r130462;
        double r130480 = sin(r130457);
        double r130481 = r130479 * r130480;
        double r130482 = r130478 - r130481;
        double r130483 = r130479 * r130477;
        double r130484 = r130482 / r130483;
        double r130485 = r130471 ? r130476 : r130484;
        double r130486 = r130456 ? r130469 : r130485;
        return r130486;
}

Error

Bits error versus x

Bits error versus eps

Target

Original36.9
Target14.9
Herbie15.9
\[\frac{\sin \varepsilon}{\cos x \cdot \cos \left(x + \varepsilon\right)}\]

Derivation

  1. Split input into 3 regimes
  2. if eps < -2.1355630045751297e-97

    1. Initial program 31.3

      \[\tan \left(x + \varepsilon\right) - \tan x\]
    2. Using strategy rm
    3. Applied tan-sum7.9

      \[\leadsto \color{blue}{\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon}} - \tan x\]
    4. Using strategy rm
    5. Applied div-inv7.9

      \[\leadsto \color{blue}{\left(\tan x + \tan \varepsilon\right) \cdot \frac{1}{1 - \tan x \cdot \tan \varepsilon}} - \tan x\]
    6. Applied fma-neg7.9

      \[\leadsto \color{blue}{\mathsf{fma}\left(\tan x + \tan \varepsilon, \frac{1}{1 - \tan x \cdot \tan \varepsilon}, -\tan x\right)}\]
    7. Using strategy rm
    8. Applied flip--7.9

      \[\leadsto \mathsf{fma}\left(\tan x + \tan \varepsilon, \frac{1}{\color{blue}{\frac{1 \cdot 1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right)}{1 + \tan x \cdot \tan \varepsilon}}}, -\tan x\right)\]
    9. Applied associate-/r/7.9

      \[\leadsto \mathsf{fma}\left(\tan x + \tan \varepsilon, \color{blue}{\frac{1}{1 \cdot 1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right)} \cdot \left(1 + \tan x \cdot \tan \varepsilon\right)}, -\tan x\right)\]
    10. Simplified7.9

      \[\leadsto \mathsf{fma}\left(\tan x + \tan \varepsilon, \color{blue}{\frac{1}{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right)}} \cdot \left(1 + \tan x \cdot \tan \varepsilon\right), -\tan x\right)\]

    if -2.1355630045751297e-97 < eps < 1.855047695958225e-60

    1. Initial program 47.5

      \[\tan \left(x + \varepsilon\right) - \tan x\]
    2. Taylor expanded around 0 31.4

      \[\leadsto \color{blue}{x \cdot {\varepsilon}^{2} + \left(\varepsilon + {x}^{2} \cdot \varepsilon\right)}\]
    3. Simplified31.4

      \[\leadsto \color{blue}{\mathsf{fma}\left({\varepsilon}^{2}, x, \mathsf{fma}\left(\varepsilon, {x}^{2}, \varepsilon\right)\right)}\]

    if 1.855047695958225e-60 < eps

    1. Initial program 29.9

      \[\tan \left(x + \varepsilon\right) - \tan x\]
    2. Using strategy rm
    3. Applied tan-quot29.7

      \[\leadsto \tan \left(x + \varepsilon\right) - \color{blue}{\frac{\sin x}{\cos x}}\]
    4. Applied tan-sum5.3

      \[\leadsto \color{blue}{\frac{\tan x + \tan \varepsilon}{1 - \tan x \cdot \tan \varepsilon}} - \frac{\sin x}{\cos x}\]
    5. Applied frac-sub5.4

      \[\leadsto \color{blue}{\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}}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification15.9

    \[\leadsto \begin{array}{l} \mathbf{if}\;\varepsilon \le -2.13556300457512966 \cdot 10^{-97}:\\ \;\;\;\;\mathsf{fma}\left(\tan x + \tan \varepsilon, \frac{1}{1 - \left(\tan x \cdot \tan \varepsilon\right) \cdot \left(\tan x \cdot \tan \varepsilon\right)} \cdot \left(1 + \tan x \cdot \tan \varepsilon\right), -\tan x\right)\\ \mathbf{elif}\;\varepsilon \le 1.8550476959582249 \cdot 10^{-60}:\\ \;\;\;\;\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}\]

Reproduce

herbie shell --seed 2020081 +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)))