Average Error: 0.2 → 0.0
Time: 3.3s
Precision: 64
\[1 + \frac{4 \cdot \left(\left(x + y \cdot 0.75\right) - z\right)}{y}\]
\[1 + \mathsf{fma}\left(4, \frac{x}{y}, 3 - 4 \cdot \frac{z}{y}\right)\]
1 + \frac{4 \cdot \left(\left(x + y \cdot 0.75\right) - z\right)}{y}
1 + \mathsf{fma}\left(4, \frac{x}{y}, 3 - 4 \cdot \frac{z}{y}\right)
double f(double x, double y, double z) {
        double r238620 = 1.0;
        double r238621 = 4.0;
        double r238622 = x;
        double r238623 = y;
        double r238624 = 0.75;
        double r238625 = r238623 * r238624;
        double r238626 = r238622 + r238625;
        double r238627 = z;
        double r238628 = r238626 - r238627;
        double r238629 = r238621 * r238628;
        double r238630 = r238629 / r238623;
        double r238631 = r238620 + r238630;
        return r238631;
}

double f(double x, double y, double z) {
        double r238632 = 1.0;
        double r238633 = 4.0;
        double r238634 = x;
        double r238635 = y;
        double r238636 = r238634 / r238635;
        double r238637 = 3.0;
        double r238638 = z;
        double r238639 = r238638 / r238635;
        double r238640 = r238633 * r238639;
        double r238641 = r238637 - r238640;
        double r238642 = fma(r238633, r238636, r238641);
        double r238643 = r238632 + r238642;
        return r238643;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Derivation

  1. Initial program 0.2

    \[1 + \frac{4 \cdot \left(\left(x + y \cdot 0.75\right) - z\right)}{y}\]
  2. Taylor expanded around 0 0.0

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

    \[\leadsto 1 + \color{blue}{\mathsf{fma}\left(4, \frac{x}{y}, 3 - 4 \cdot \frac{z}{y}\right)}\]
  4. Final simplification0.0

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

Reproduce

herbie shell --seed 2020001 +o rules:numerics
(FPCore (x y z)
  :name "Data.Array.Repa.Algorithms.ColorRamp:rampColorHotToCold from repa-algorithms-3.4.0.1, A"
  :precision binary64
  (+ 1 (/ (* 4 (- (+ x (* y 0.75)) z)) y)))