Average Error: 29.4 → 0.0
Time: 1.0m
Precision: 64
\[\frac{2}{1 + e^{-2 \cdot x}} - 1\]
\[\begin{array}{l} \mathbf{if}\;x \le -0.008132844190967993:\\ \;\;\;\;\frac{2}{1 + e^{-2 \cdot x}} - 1\\ \mathbf{elif}\;x \le 0.006948963129088722:\\ \;\;\;\;\mathsf{fma}\left(\left(\frac{-1}{3} \cdot x\right), \left(x \cdot x\right), \left(\mathsf{fma}\left(\frac{2}{15}, \left({x}^{5}\right), x\right)\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{2}{1 + e^{-2 \cdot x}} - 1\\ \end{array}\]
\frac{2}{1 + e^{-2 \cdot x}} - 1
\begin{array}{l}
\mathbf{if}\;x \le -0.008132844190967993:\\
\;\;\;\;\frac{2}{1 + e^{-2 \cdot x}} - 1\\

\mathbf{elif}\;x \le 0.006948963129088722:\\
\;\;\;\;\mathsf{fma}\left(\left(\frac{-1}{3} \cdot x\right), \left(x \cdot x\right), \left(\mathsf{fma}\left(\frac{2}{15}, \left({x}^{5}\right), x\right)\right)\right)\\

\mathbf{else}:\\
\;\;\;\;\frac{2}{1 + e^{-2 \cdot x}} - 1\\

\end{array}
double f(double x, double __attribute__((unused)) y) {
        double r5987620 = 2.0;
        double r5987621 = 1.0;
        double r5987622 = -2.0;
        double r5987623 = x;
        double r5987624 = r5987622 * r5987623;
        double r5987625 = exp(r5987624);
        double r5987626 = r5987621 + r5987625;
        double r5987627 = r5987620 / r5987626;
        double r5987628 = r5987627 - r5987621;
        return r5987628;
}

double f(double x, double __attribute__((unused)) y) {
        double r5987629 = x;
        double r5987630 = -0.008132844190967993;
        bool r5987631 = r5987629 <= r5987630;
        double r5987632 = 2.0;
        double r5987633 = 1.0;
        double r5987634 = -2.0;
        double r5987635 = r5987634 * r5987629;
        double r5987636 = exp(r5987635);
        double r5987637 = r5987633 + r5987636;
        double r5987638 = r5987632 / r5987637;
        double r5987639 = r5987638 - r5987633;
        double r5987640 = 0.006948963129088722;
        bool r5987641 = r5987629 <= r5987640;
        double r5987642 = -0.3333333333333333;
        double r5987643 = r5987642 * r5987629;
        double r5987644 = r5987629 * r5987629;
        double r5987645 = 0.13333333333333333;
        double r5987646 = 5.0;
        double r5987647 = pow(r5987629, r5987646);
        double r5987648 = fma(r5987645, r5987647, r5987629);
        double r5987649 = fma(r5987643, r5987644, r5987648);
        double r5987650 = r5987641 ? r5987649 : r5987639;
        double r5987651 = r5987631 ? r5987639 : r5987650;
        return r5987651;
}

Error

Bits error versus x

Bits error versus y

Derivation

  1. Split input into 2 regimes
  2. if x < -0.008132844190967993 or 0.006948963129088722 < x

    1. Initial program 0.0

      \[\frac{2}{1 + e^{-2 \cdot x}} - 1\]
    2. Taylor expanded around inf 0.0

      \[\leadsto \frac{2}{\color{blue}{e^{-2 \cdot x} + 1}} - 1\]

    if -0.008132844190967993 < x < 0.006948963129088722

    1. Initial program 59.1

      \[\frac{2}{1 + e^{-2 \cdot x}} - 1\]
    2. Taylor expanded around inf 59.1

      \[\leadsto \frac{2}{\color{blue}{e^{-2 \cdot x} + 1}} - 1\]
    3. Taylor expanded around 0 0.0

      \[\leadsto \color{blue}{\left(x + \frac{2}{15} \cdot {x}^{5}\right) - \frac{1}{3} \cdot {x}^{3}}\]
    4. Simplified0.0

      \[\leadsto \color{blue}{\mathsf{fma}\left(\left(x \cdot \frac{-1}{3}\right), \left(x \cdot x\right), \left(\mathsf{fma}\left(\frac{2}{15}, \left({x}^{5}\right), x\right)\right)\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -0.008132844190967993:\\ \;\;\;\;\frac{2}{1 + e^{-2 \cdot x}} - 1\\ \mathbf{elif}\;x \le 0.006948963129088722:\\ \;\;\;\;\mathsf{fma}\left(\left(\frac{-1}{3} \cdot x\right), \left(x \cdot x\right), \left(\mathsf{fma}\left(\frac{2}{15}, \left({x}^{5}\right), x\right)\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\frac{2}{1 + e^{-2 \cdot x}} - 1\\ \end{array}\]

Reproduce

herbie shell --seed 2019124 +o rules:numerics
(FPCore (x y)
  :name "Logistic function from Lakshay Garg"
  (- (/ 2 (+ 1 (exp (* -2 x)))) 1))