Average Error: 3.5 → 0.2
Time: 3.2s
Precision: 64
\[x \cdot \left(1 - \left(1 - y\right) \cdot z\right)\]
\[\begin{array}{l} \mathbf{if}\;z \le -1.38475248412688293 \cdot 10^{-18} \lor \neg \left(z \le 5.00050212150308561 \cdot 10^{-55}\right):\\ \;\;\;\;\mathsf{fma}\left(x \cdot z, y - 1, 1 \cdot x\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(y - 1, z, 1\right) \cdot x\\ \end{array}\]
x \cdot \left(1 - \left(1 - y\right) \cdot z\right)
\begin{array}{l}
\mathbf{if}\;z \le -1.38475248412688293 \cdot 10^{-18} \lor \neg \left(z \le 5.00050212150308561 \cdot 10^{-55}\right):\\
\;\;\;\;\mathsf{fma}\left(x \cdot z, y - 1, 1 \cdot x\right)\\

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

\end{array}
double f(double x, double y, double z) {
        double r803969 = x;
        double r803970 = 1.0;
        double r803971 = y;
        double r803972 = r803970 - r803971;
        double r803973 = z;
        double r803974 = r803972 * r803973;
        double r803975 = r803970 - r803974;
        double r803976 = r803969 * r803975;
        return r803976;
}

double f(double x, double y, double z) {
        double r803977 = z;
        double r803978 = -1.384752484126883e-18;
        bool r803979 = r803977 <= r803978;
        double r803980 = 5.0005021215030856e-55;
        bool r803981 = r803977 <= r803980;
        double r803982 = !r803981;
        bool r803983 = r803979 || r803982;
        double r803984 = x;
        double r803985 = r803984 * r803977;
        double r803986 = y;
        double r803987 = 1.0;
        double r803988 = r803986 - r803987;
        double r803989 = r803987 * r803984;
        double r803990 = fma(r803985, r803988, r803989);
        double r803991 = fma(r803988, r803977, r803987);
        double r803992 = r803991 * r803984;
        double r803993 = r803983 ? r803990 : r803992;
        return r803993;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Target

Original3.5
Target0.3
Herbie0.2
\[\begin{array}{l} \mathbf{if}\;x \cdot \left(1 - \left(1 - y\right) \cdot z\right) \lt -1.618195973607049 \cdot 10^{50}:\\ \;\;\;\;x + \left(1 - y\right) \cdot \left(\left(-z\right) \cdot x\right)\\ \mathbf{elif}\;x \cdot \left(1 - \left(1 - y\right) \cdot z\right) \lt 3.8922376496639029 \cdot 10^{134}:\\ \;\;\;\;\left(x \cdot y\right) \cdot z - \left(x \cdot z - x\right)\\ \mathbf{else}:\\ \;\;\;\;x + \left(1 - y\right) \cdot \left(\left(-z\right) \cdot x\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if z < -1.384752484126883e-18 or 5.0005021215030856e-55 < z

    1. Initial program 7.6

      \[x \cdot \left(1 - \left(1 - y\right) \cdot z\right)\]
    2. Simplified7.6

      \[\leadsto \color{blue}{\mathsf{fma}\left(y - 1, z, 1\right) \cdot x}\]
    3. Using strategy rm
    4. Applied add-cube-cbrt8.5

      \[\leadsto \color{blue}{\left(\left(\sqrt[3]{\mathsf{fma}\left(y - 1, z, 1\right)} \cdot \sqrt[3]{\mathsf{fma}\left(y - 1, z, 1\right)}\right) \cdot \sqrt[3]{\mathsf{fma}\left(y - 1, z, 1\right)}\right)} \cdot x\]
    5. Taylor expanded around inf 7.6

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

      \[\leadsto \color{blue}{\mathsf{fma}\left(x \cdot z, y - 1, 1 \cdot x\right)}\]

    if -1.384752484126883e-18 < z < 5.0005021215030856e-55

    1. Initial program 0.1

      \[x \cdot \left(1 - \left(1 - y\right) \cdot z\right)\]
    2. Simplified0.1

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;z \le -1.38475248412688293 \cdot 10^{-18} \lor \neg \left(z \le 5.00050212150308561 \cdot 10^{-55}\right):\\ \;\;\;\;\mathsf{fma}\left(x \cdot z, y - 1, 1 \cdot x\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(y - 1, z, 1\right) \cdot x\\ \end{array}\]

Reproduce

herbie shell --seed 2020089 +o rules:numerics
(FPCore (x y z)
  :name "Data.Colour.RGBSpace.HSV:hsv from colour-2.3.3, J"
  :precision binary64

  :herbie-target
  (if (< (* x (- 1 (* (- 1 y) z))) -1.618195973607049e+50) (+ x (* (- 1 y) (* (- z) x))) (if (< (* x (- 1 (* (- 1 y) z))) 3.892237649663903e+134) (- (* (* x y) z) (- (* x z) x)) (+ x (* (- 1 y) (* (- z) x)))))

  (* x (- 1 (* (- 1 y) z))))