Average Error: 29.6 → 0.7
Time: 49.6s
Precision: 64
\[\frac{1.0 - \cos x}{\sin x}\]
\[\begin{array}{l} \mathbf{if}\;\frac{1.0 - \cos x}{\sin x} \le -0.008153236898019485:\\ \;\;\;\;\frac{e^{\log \left(1.0 - \cos x\right)}}{\sin x}\\ \mathbf{elif}\;\frac{1.0 - \cos x}{\sin x} \le 0.0:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{240}, {x}^{5}, x \cdot \frac{1}{2} + x \cdot \left(\left(\frac{1}{24} \cdot x\right) \cdot x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{1.0 - \cos x}{\sin x}\\ \end{array}\]
\frac{1.0 - \cos x}{\sin x}
\begin{array}{l}
\mathbf{if}\;\frac{1.0 - \cos x}{\sin x} \le -0.008153236898019485:\\
\;\;\;\;\frac{e^{\log \left(1.0 - \cos x\right)}}{\sin x}\\

\mathbf{elif}\;\frac{1.0 - \cos x}{\sin x} \le 0.0:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{240}, {x}^{5}, x \cdot \frac{1}{2} + x \cdot \left(\left(\frac{1}{24} \cdot x\right) \cdot x\right)\right)\\

\mathbf{else}:\\
\;\;\;\;\frac{1.0 - \cos x}{\sin x}\\

\end{array}
double f(double x) {
        double r4173423 = 1.0;
        double r4173424 = x;
        double r4173425 = cos(r4173424);
        double r4173426 = r4173423 - r4173425;
        double r4173427 = sin(r4173424);
        double r4173428 = r4173426 / r4173427;
        return r4173428;
}

double f(double x) {
        double r4173429 = 1.0;
        double r4173430 = x;
        double r4173431 = cos(r4173430);
        double r4173432 = r4173429 - r4173431;
        double r4173433 = sin(r4173430);
        double r4173434 = r4173432 / r4173433;
        double r4173435 = -0.008153236898019485;
        bool r4173436 = r4173434 <= r4173435;
        double r4173437 = log(r4173432);
        double r4173438 = exp(r4173437);
        double r4173439 = r4173438 / r4173433;
        double r4173440 = 0.0;
        bool r4173441 = r4173434 <= r4173440;
        double r4173442 = 0.004166666666666667;
        double r4173443 = 5.0;
        double r4173444 = pow(r4173430, r4173443);
        double r4173445 = 0.5;
        double r4173446 = r4173430 * r4173445;
        double r4173447 = 0.041666666666666664;
        double r4173448 = r4173447 * r4173430;
        double r4173449 = r4173448 * r4173430;
        double r4173450 = r4173430 * r4173449;
        double r4173451 = r4173446 + r4173450;
        double r4173452 = fma(r4173442, r4173444, r4173451);
        double r4173453 = r4173441 ? r4173452 : r4173434;
        double r4173454 = r4173436 ? r4173439 : r4173453;
        return r4173454;
}

Error

Bits error versus x

Target

Original29.6
Target0.0
Herbie0.7
\[\tan \left(\frac{x}{2.0}\right)\]

Derivation

  1. Split input into 3 regimes
  2. if (/ (- 1.0 (cos x)) (sin x)) < -0.008153236898019485

    1. Initial program 0.8

      \[\frac{1.0 - \cos x}{\sin x}\]
    2. Using strategy rm
    3. Applied add-exp-log0.8

      \[\leadsto \frac{\color{blue}{e^{\log \left(1.0 - \cos x\right)}}}{\sin x}\]

    if -0.008153236898019485 < (/ (- 1.0 (cos x)) (sin x)) < 0.0

    1. Initial program 60.1

      \[\frac{1.0 - \cos x}{\sin x}\]
    2. Taylor expanded around 0 0.1

      \[\leadsto \color{blue}{\frac{1}{2} \cdot x + \left(\frac{1}{24} \cdot {x}^{3} + \frac{1}{240} \cdot {x}^{5}\right)}\]
    3. Simplified0.1

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{240}, {x}^{5}, x \cdot \mathsf{fma}\left(x \cdot \frac{1}{24}, x, \frac{1}{2}\right)\right)}\]
    4. Using strategy rm
    5. Applied fma-udef0.1

      \[\leadsto \mathsf{fma}\left(\frac{1}{240}, {x}^{5}, x \cdot \color{blue}{\left(\left(x \cdot \frac{1}{24}\right) \cdot x + \frac{1}{2}\right)}\right)\]
    6. Applied distribute-lft-in0.1

      \[\leadsto \mathsf{fma}\left(\frac{1}{240}, {x}^{5}, \color{blue}{x \cdot \left(\left(x \cdot \frac{1}{24}\right) \cdot x\right) + x \cdot \frac{1}{2}}\right)\]

    if 0.0 < (/ (- 1.0 (cos x)) (sin x))

    1. Initial program 1.5

      \[\frac{1.0 - \cos x}{\sin x}\]
    2. Using strategy rm
    3. Applied add-log-exp1.6

      \[\leadsto \color{blue}{\log \left(e^{\frac{1.0 - \cos x}{\sin x}}\right)}\]
    4. Using strategy rm
    5. Applied rem-log-exp1.5

      \[\leadsto \color{blue}{\frac{1.0 - \cos x}{\sin x}}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification0.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{1.0 - \cos x}{\sin x} \le -0.008153236898019485:\\ \;\;\;\;\frac{e^{\log \left(1.0 - \cos x\right)}}{\sin x}\\ \mathbf{elif}\;\frac{1.0 - \cos x}{\sin x} \le 0.0:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{240}, {x}^{5}, x \cdot \frac{1}{2} + x \cdot \left(\left(\frac{1}{24} \cdot x\right) \cdot x\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{1.0 - \cos x}{\sin x}\\ \end{array}\]

Reproduce

herbie shell --seed 2019165 +o rules:numerics
(FPCore (x)
  :name "tanhf (example 3.4)"
  :herbie-expected 2

  :herbie-target
  (tan (/ x 2.0))

  (/ (- 1.0 (cos x)) (sin x)))