Average Error: 2.7 → 3.1
Time: 14.0s
Precision: 64
\[x + \frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}\]
\[\begin{array}{l} \mathbf{if}\;e^{z} \le 0.0:\\ \;\;\;\;x + \left(\frac{-1}{x} - \frac{e^{z}}{x \cdot y} \cdot \frac{1.1283791670955126}{x}\right)\\ \mathbf{elif}\;e^{z} \le 1.0:\\ \;\;\;\;x + \frac{-y}{\mathsf{fma}\left(y, x, -\mathsf{fma}\left(z, \mathsf{fma}\left(0.5641895835477563, z, 1.1283791670955126\right), 1.1283791670955126\right)\right)}\\ \mathbf{else}:\\ \;\;\;\;x + \left(\left(\frac{y}{e^{z} \cdot 1.1283791670955126 - x \cdot y}\right)\right)\\ \end{array}\]
x + \frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}
\begin{array}{l}
\mathbf{if}\;e^{z} \le 0.0:\\
\;\;\;\;x + \left(\frac{-1}{x} - \frac{e^{z}}{x \cdot y} \cdot \frac{1.1283791670955126}{x}\right)\\

\mathbf{elif}\;e^{z} \le 1.0:\\
\;\;\;\;x + \frac{-y}{\mathsf{fma}\left(y, x, -\mathsf{fma}\left(z, \mathsf{fma}\left(0.5641895835477563, z, 1.1283791670955126\right), 1.1283791670955126\right)\right)}\\

\mathbf{else}:\\
\;\;\;\;x + \left(\left(\frac{y}{e^{z} \cdot 1.1283791670955126 - x \cdot y}\right)\right)\\

\end{array}
double f(double x, double y, double z) {
        double r19858045 = x;
        double r19858046 = y;
        double r19858047 = 1.1283791670955126;
        double r19858048 = z;
        double r19858049 = exp(r19858048);
        double r19858050 = r19858047 * r19858049;
        double r19858051 = r19858045 * r19858046;
        double r19858052 = r19858050 - r19858051;
        double r19858053 = r19858046 / r19858052;
        double r19858054 = r19858045 + r19858053;
        return r19858054;
}

double f(double x, double y, double z) {
        double r19858055 = z;
        double r19858056 = exp(r19858055);
        double r19858057 = 0.0;
        bool r19858058 = r19858056 <= r19858057;
        double r19858059 = x;
        double r19858060 = -1.0;
        double r19858061 = r19858060 / r19858059;
        double r19858062 = y;
        double r19858063 = r19858059 * r19858062;
        double r19858064 = r19858056 / r19858063;
        double r19858065 = 1.1283791670955126;
        double r19858066 = r19858065 / r19858059;
        double r19858067 = r19858064 * r19858066;
        double r19858068 = r19858061 - r19858067;
        double r19858069 = r19858059 + r19858068;
        double r19858070 = 1.0;
        bool r19858071 = r19858056 <= r19858070;
        double r19858072 = -r19858062;
        double r19858073 = 0.5641895835477563;
        double r19858074 = fma(r19858073, r19858055, r19858065);
        double r19858075 = fma(r19858055, r19858074, r19858065);
        double r19858076 = -r19858075;
        double r19858077 = fma(r19858062, r19858059, r19858076);
        double r19858078 = r19858072 / r19858077;
        double r19858079 = r19858059 + r19858078;
        double r19858080 = r19858056 * r19858065;
        double r19858081 = r19858080 - r19858063;
        double r19858082 = r19858062 / r19858081;
        double r19858083 = /* ERROR: no posit support in C */;
        double r19858084 = /* ERROR: no posit support in C */;
        double r19858085 = r19858059 + r19858084;
        double r19858086 = r19858071 ? r19858079 : r19858085;
        double r19858087 = r19858058 ? r19858069 : r19858086;
        return r19858087;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original2.7
Target0.0
Herbie3.1
\[x + \frac{1}{\frac{1.1283791670955126}{y} \cdot e^{z} - x}\]

Derivation

  1. Split input into 3 regimes
  2. if (exp z) < 0.0

    1. Initial program 7.1

      \[x + \frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}\]
    2. Taylor expanded around inf 18.3

      \[\leadsto x + \color{blue}{\left(-\left(\frac{1}{x} + 1.1283791670955126 \cdot \frac{e^{z}}{{x}^{2} \cdot y}\right)\right)}\]
    3. Simplified6.7

      \[\leadsto x + \color{blue}{\left(\frac{-1}{x} - \frac{1.1283791670955126}{x} \cdot \frac{e^{z}}{y \cdot x}\right)}\]

    if 0.0 < (exp z) < 1.0

    1. Initial program 0.0

      \[x + \frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}\]
    2. Taylor expanded around 0 0.1

      \[\leadsto x + \frac{y}{\color{blue}{\left(1.1283791670955126 \cdot z + \left(0.5641895835477563 \cdot {z}^{2} + 1.1283791670955126\right)\right)} - x \cdot y}\]
    3. Simplified0.1

      \[\leadsto x + \frac{y}{\color{blue}{\mathsf{fma}\left(z, \mathsf{fma}\left(z, 0.5641895835477563, 1.1283791670955126\right), 1.1283791670955126\right)} - x \cdot y}\]
    4. Using strategy rm
    5. Applied frac-2neg0.1

      \[\leadsto x + \color{blue}{\frac{-y}{-\left(\mathsf{fma}\left(z, \mathsf{fma}\left(z, 0.5641895835477563, 1.1283791670955126\right), 1.1283791670955126\right) - x \cdot y\right)}}\]
    6. Simplified0.1

      \[\leadsto x + \frac{-y}{\color{blue}{\mathsf{fma}\left(y, x, -\mathsf{fma}\left(z, \mathsf{fma}\left(0.5641895835477563, z, 1.1283791670955126\right), 1.1283791670955126\right)\right)}}\]

    if 1.0 < (exp z)

    1. Initial program 3.5

      \[x + \frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}\]
    2. Using strategy rm
    3. Applied insert-posit165.4

      \[\leadsto x + \color{blue}{\left(\left(\frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}\right)\right)}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification3.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;e^{z} \le 0.0:\\ \;\;\;\;x + \left(\frac{-1}{x} - \frac{e^{z}}{x \cdot y} \cdot \frac{1.1283791670955126}{x}\right)\\ \mathbf{elif}\;e^{z} \le 1.0:\\ \;\;\;\;x + \frac{-y}{\mathsf{fma}\left(y, x, -\mathsf{fma}\left(z, \mathsf{fma}\left(0.5641895835477563, z, 1.1283791670955126\right), 1.1283791670955126\right)\right)}\\ \mathbf{else}:\\ \;\;\;\;x + \left(\left(\frac{y}{e^{z} \cdot 1.1283791670955126 - x \cdot y}\right)\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019164 +o rules:numerics
(FPCore (x y z)
  :name "Numeric.SpecFunctions:invErfc from math-functions-0.1.5.2, A"

  :herbie-target
  (+ x (/ 1 (- (* (/ 1.1283791670955126 y) (exp z)) x)))

  (+ x (/ y (- (* 1.1283791670955126 (exp z)) (* x y)))))