Average Error: 1.8 → 0.2
Time: 3.0s
Precision: 64
\[\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|\]
\[\begin{array}{l} \mathbf{if}\;x \le -5.761115116279560819897916091491976758654 \cdot 10^{-47}:\\ \;\;\;\;\left|\frac{x + 4}{y} - x \cdot \frac{z}{y}\right|\\ \mathbf{elif}\;x \le 2.987849844254570348767285954039240447636 \cdot 10^{-47}:\\ \;\;\;\;\left|\frac{x + 4}{y} - \left(x \cdot z\right) \cdot \frac{1}{y}\right|\\ \mathbf{else}:\\ \;\;\;\;\left|\mathsf{fma}\left(4, \frac{1}{y}, \frac{x}{y} \cdot \left(1 - z\right)\right)\right|\\ \end{array}\]
\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|
\begin{array}{l}
\mathbf{if}\;x \le -5.761115116279560819897916091491976758654 \cdot 10^{-47}:\\
\;\;\;\;\left|\frac{x + 4}{y} - x \cdot \frac{z}{y}\right|\\

\mathbf{elif}\;x \le 2.987849844254570348767285954039240447636 \cdot 10^{-47}:\\
\;\;\;\;\left|\frac{x + 4}{y} - \left(x \cdot z\right) \cdot \frac{1}{y}\right|\\

\mathbf{else}:\\
\;\;\;\;\left|\mathsf{fma}\left(4, \frac{1}{y}, \frac{x}{y} \cdot \left(1 - z\right)\right)\right|\\

\end{array}
double f(double x, double y, double z) {
        double r29782 = x;
        double r29783 = 4.0;
        double r29784 = r29782 + r29783;
        double r29785 = y;
        double r29786 = r29784 / r29785;
        double r29787 = r29782 / r29785;
        double r29788 = z;
        double r29789 = r29787 * r29788;
        double r29790 = r29786 - r29789;
        double r29791 = fabs(r29790);
        return r29791;
}

double f(double x, double y, double z) {
        double r29792 = x;
        double r29793 = -5.761115116279561e-47;
        bool r29794 = r29792 <= r29793;
        double r29795 = 4.0;
        double r29796 = r29792 + r29795;
        double r29797 = y;
        double r29798 = r29796 / r29797;
        double r29799 = z;
        double r29800 = r29799 / r29797;
        double r29801 = r29792 * r29800;
        double r29802 = r29798 - r29801;
        double r29803 = fabs(r29802);
        double r29804 = 2.9878498442545703e-47;
        bool r29805 = r29792 <= r29804;
        double r29806 = r29792 * r29799;
        double r29807 = 1.0;
        double r29808 = r29807 / r29797;
        double r29809 = r29806 * r29808;
        double r29810 = r29798 - r29809;
        double r29811 = fabs(r29810);
        double r29812 = r29792 / r29797;
        double r29813 = r29807 - r29799;
        double r29814 = r29812 * r29813;
        double r29815 = fma(r29795, r29808, r29814);
        double r29816 = fabs(r29815);
        double r29817 = r29805 ? r29811 : r29816;
        double r29818 = r29794 ? r29803 : r29817;
        return r29818;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Derivation

  1. Split input into 3 regimes
  2. if x < -5.761115116279561e-47

    1. Initial program 0.4

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

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

      \[\leadsto \left|\frac{x + 4}{y} - \color{blue}{x \cdot \left(\frac{1}{y} \cdot z\right)}\right|\]
    5. Simplified0.3

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

    if -5.761115116279561e-47 < x < 2.9878498442545703e-47

    1. Initial program 3.2

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

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

      \[\leadsto \left|\frac{x + 4}{y} - \color{blue}{x \cdot \left(\frac{1}{y} \cdot z\right)}\right|\]
    5. Simplified6.6

      \[\leadsto \left|\frac{x + 4}{y} - x \cdot \color{blue}{\frac{z}{y}}\right|\]
    6. Using strategy rm
    7. Applied div-inv6.6

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

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

    if 2.9878498442545703e-47 < x

    1. Initial program 0.3

      \[\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|\]
    2. Taylor expanded around 0 7.2

      \[\leadsto \left|\color{blue}{\left(4 \cdot \frac{1}{y} + \frac{x}{y}\right) - \frac{x \cdot z}{y}}\right|\]
    3. Simplified0.3

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -5.761115116279560819897916091491976758654 \cdot 10^{-47}:\\ \;\;\;\;\left|\frac{x + 4}{y} - x \cdot \frac{z}{y}\right|\\ \mathbf{elif}\;x \le 2.987849844254570348767285954039240447636 \cdot 10^{-47}:\\ \;\;\;\;\left|\frac{x + 4}{y} - \left(x \cdot z\right) \cdot \frac{1}{y}\right|\\ \mathbf{else}:\\ \;\;\;\;\left|\mathsf{fma}\left(4, \frac{1}{y}, \frac{x}{y} \cdot \left(1 - z\right)\right)\right|\\ \end{array}\]

Reproduce

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