Average Error: 1.7 → 0.8
Time: 41.7s
Precision: 64
\[\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|\]
\[\begin{array}{l} \mathbf{if}\;\left|\frac{4 + x}{y} - \frac{x}{y} \cdot z\right| \le 1.5810969147855623 \cdot 10^{+194}:\\ \;\;\;\;\left|\frac{4 + x}{y} - \frac{z}{y} \cdot x\right|\\ \mathbf{else}:\\ \;\;\;\;\left|\frac{4 + x}{y} - \frac{x}{y} \cdot z\right|\\ \end{array}\]
double f(double x, double y, double z) {
        double r1745199 = x;
        double r1745200 = 4.0;
        double r1745201 = r1745199 + r1745200;
        double r1745202 = y;
        double r1745203 = r1745201 / r1745202;
        double r1745204 = r1745199 / r1745202;
        double r1745205 = z;
        double r1745206 = r1745204 * r1745205;
        double r1745207 = r1745203 - r1745206;
        double r1745208 = fabs(r1745207);
        return r1745208;
}

double f(double x, double y, double z) {
        double r1745209 = 4.0;
        double r1745210 = x;
        double r1745211 = r1745209 + r1745210;
        double r1745212 = y;
        double r1745213 = r1745211 / r1745212;
        double r1745214 = r1745210 / r1745212;
        double r1745215 = z;
        double r1745216 = r1745214 * r1745215;
        double r1745217 = r1745213 - r1745216;
        double r1745218 = fabs(r1745217);
        double r1745219 = 1.5810969147855623e+194;
        bool r1745220 = r1745218 <= r1745219;
        double r1745221 = r1745215 / r1745212;
        double r1745222 = r1745221 * r1745210;
        double r1745223 = r1745213 - r1745222;
        double r1745224 = fabs(r1745223);
        double r1745225 = r1745220 ? r1745224 : r1745218;
        return r1745225;
}

\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|
\begin{array}{l}
\mathbf{if}\;\left|\frac{4 + x}{y} - \frac{x}{y} \cdot z\right| \le 1.5810969147855623 \cdot 10^{+194}:\\
\;\;\;\;\left|\frac{4 + x}{y} - \frac{z}{y} \cdot x\right|\\

\mathbf{else}:\\
\;\;\;\;\left|\frac{4 + x}{y} - \frac{x}{y} \cdot z\right|\\

\end{array}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Derivation

  1. Split input into 2 regimes
  2. if (fabs (- (/ (+ x 4) y) (* (/ x y) z))) < 1.5810969147855623e+194

    1. Initial program 2.1

      \[\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|\]
    2. Using strategy rm
    3. Applied div-inv2.2

      \[\leadsto \left|\frac{x + 4}{y} - \color{blue}{\left(x \cdot \frac{1}{y}\right)} \cdot z\right|\]
    4. Applied associate-*l*1.0

      \[\leadsto \left|\frac{x + 4}{y} - \color{blue}{x \cdot \left(\frac{1}{y} \cdot z\right)}\right|\]
    5. Taylor expanded around -inf 1.0

      \[\leadsto \left|\frac{x + 4}{y} - x \cdot \color{blue}{\frac{z}{y}}\right|\]

    if 1.5810969147855623e+194 < (fabs (- (/ (+ x 4) y) (* (/ x y) z)))

    1. Initial program 0.1

      \[\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;\left|\frac{4 + x}{y} - \frac{x}{y} \cdot z\right| \le 1.5810969147855623 \cdot 10^{+194}:\\ \;\;\;\;\left|\frac{4 + x}{y} - \frac{z}{y} \cdot x\right|\\ \mathbf{else}:\\ \;\;\;\;\left|\frac{4 + x}{y} - \frac{x}{y} \cdot z\right|\\ \end{array}\]

Reproduce

herbie shell --seed 2019102 +o rules:numerics
(FPCore (x y z)
  :name "fabs fraction 1"
  (fabs (- (/ (+ x 4) y) (* (/ x y) z))))