Average Error: 1.6 → 1.6
Time: 15.0s
Precision: 64
\[\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|\]
\[\left|\mathsf{fma}\left(\frac{x}{y}, 1 - z, \frac{4}{y}\right)\right|\]
\left|\frac{x + 4}{y} - \frac{x}{y} \cdot z\right|
\left|\mathsf{fma}\left(\frac{x}{y}, 1 - z, \frac{4}{y}\right)\right|
double f(double x, double y, double z) {
        double r33805 = x;
        double r33806 = 4.0;
        double r33807 = r33805 + r33806;
        double r33808 = y;
        double r33809 = r33807 / r33808;
        double r33810 = r33805 / r33808;
        double r33811 = z;
        double r33812 = r33810 * r33811;
        double r33813 = r33809 - r33812;
        double r33814 = fabs(r33813);
        return r33814;
}

double f(double x, double y, double z) {
        double r33815 = x;
        double r33816 = y;
        double r33817 = r33815 / r33816;
        double r33818 = 1.0;
        double r33819 = z;
        double r33820 = r33818 - r33819;
        double r33821 = 4.0;
        double r33822 = r33821 / r33816;
        double r33823 = fma(r33817, r33820, r33822);
        double r33824 = fabs(r33823);
        return r33824;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Derivation

  1. Initial program 1.6

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

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

    \[\leadsto \left|\color{blue}{\mathsf{fma}\left(\frac{x}{y}, 1 - z, \frac{4}{y}\right)}\right|\]
  4. Final simplification1.6

    \[\leadsto \left|\mathsf{fma}\left(\frac{x}{y}, 1 - z, \frac{4}{y}\right)\right|\]

Reproduce

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