Average Error: 0.1 → 0.0
Time: 15.0s
Precision: 64
\[1.0 + \frac{4.0 \cdot \left(\left(x + y \cdot 0.25\right) - z\right)}{y}\]
\[\mathsf{fma}\left(4.0, \frac{x - z}{y}, 2.0\right)\]
1.0 + \frac{4.0 \cdot \left(\left(x + y \cdot 0.25\right) - z\right)}{y}
\mathsf{fma}\left(4.0, \frac{x - z}{y}, 2.0\right)
double f(double x, double y, double z) {
        double r11750878 = 1.0;
        double r11750879 = 4.0;
        double r11750880 = x;
        double r11750881 = y;
        double r11750882 = 0.25;
        double r11750883 = r11750881 * r11750882;
        double r11750884 = r11750880 + r11750883;
        double r11750885 = z;
        double r11750886 = r11750884 - r11750885;
        double r11750887 = r11750879 * r11750886;
        double r11750888 = r11750887 / r11750881;
        double r11750889 = r11750878 + r11750888;
        return r11750889;
}

double f(double x, double y, double z) {
        double r11750890 = 4.0;
        double r11750891 = x;
        double r11750892 = z;
        double r11750893 = r11750891 - r11750892;
        double r11750894 = y;
        double r11750895 = r11750893 / r11750894;
        double r11750896 = 2.0;
        double r11750897 = fma(r11750890, r11750895, r11750896);
        return r11750897;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Derivation

  1. Initial program 0.1

    \[1.0 + \frac{4.0 \cdot \left(\left(x + y \cdot 0.25\right) - z\right)}{y}\]
  2. Simplified0.0

    \[\leadsto \color{blue}{\mathsf{fma}\left(4.0, 0.25 + \frac{x - z}{y}, 1.0\right)}\]
  3. Taylor expanded around 0 0.0

    \[\leadsto \color{blue}{\left(4.0 \cdot \frac{x}{y} + 2.0\right) - 4.0 \cdot \frac{z}{y}}\]
  4. Simplified0.0

    \[\leadsto \color{blue}{\mathsf{fma}\left(4.0, \frac{x - z}{y}, 2.0\right)}\]
  5. Final simplification0.0

    \[\leadsto \mathsf{fma}\left(4.0, \frac{x - z}{y}, 2.0\right)\]

Reproduce

herbie shell --seed 2019163 +o rules:numerics
(FPCore (x y z)
  :name "Data.Array.Repa.Algorithms.ColorRamp:rampColorHotToCold from repa-algorithms-3.4.0.1, C"
  (+ 1.0 (/ (* 4.0 (- (+ x (* y 0.25)) z)) y)))