Average Error: 0.2 → 0.0
Time: 11.4s
Precision: 64
\[1.0 + \frac{4.0 \cdot \left(\left(x + y \cdot 0.75\right) - z\right)}{y}\]
\[\mathsf{fma}\left(\frac{x - z}{y} + 0.75, 4.0, 1.0\right)\]
1.0 + \frac{4.0 \cdot \left(\left(x + y \cdot 0.75\right) - z\right)}{y}
\mathsf{fma}\left(\frac{x - z}{y} + 0.75, 4.0, 1.0\right)
double f(double x, double y, double z) {
        double r12249834 = 1.0;
        double r12249835 = 4.0;
        double r12249836 = x;
        double r12249837 = y;
        double r12249838 = 0.75;
        double r12249839 = r12249837 * r12249838;
        double r12249840 = r12249836 + r12249839;
        double r12249841 = z;
        double r12249842 = r12249840 - r12249841;
        double r12249843 = r12249835 * r12249842;
        double r12249844 = r12249843 / r12249837;
        double r12249845 = r12249834 + r12249844;
        return r12249845;
}

double f(double x, double y, double z) {
        double r12249846 = x;
        double r12249847 = z;
        double r12249848 = r12249846 - r12249847;
        double r12249849 = y;
        double r12249850 = r12249848 / r12249849;
        double r12249851 = 0.75;
        double r12249852 = r12249850 + r12249851;
        double r12249853 = 4.0;
        double r12249854 = 1.0;
        double r12249855 = fma(r12249852, r12249853, r12249854);
        return r12249855;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Derivation

  1. Initial program 0.2

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

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

    \[\leadsto \mathsf{fma}\left(\frac{x - z}{y} + 0.75, 4.0, 1.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, A"
  (+ 1.0 (/ (* 4.0 (- (+ x (* y 0.75)) z)) y)))