Average Error: 2.1 → 0.6
Time: 4.5s
Precision: 64
\[\left(\left(x + y \cdot z\right) + t \cdot a\right) + \left(a \cdot z\right) \cdot b\]
\[\begin{array}{l} \mathbf{if}\;b \le -1.0890740179526285 \cdot 10^{-10} \lor \neg \left(b \le 1.3831953550132272 \cdot 10^{-189}\right):\\ \;\;\;\;\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \left(a \cdot z\right) \cdot b\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + {\left(a \cdot \left(z \cdot b\right)\right)}^{1}\\ \end{array}\]
\left(\left(x + y \cdot z\right) + t \cdot a\right) + \left(a \cdot z\right) \cdot b
\begin{array}{l}
\mathbf{if}\;b \le -1.0890740179526285 \cdot 10^{-10} \lor \neg \left(b \le 1.3831953550132272 \cdot 10^{-189}\right):\\
\;\;\;\;\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \left(a \cdot z\right) \cdot b\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + {\left(a \cdot \left(z \cdot b\right)\right)}^{1}\\

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r653020 = x;
        double r653021 = y;
        double r653022 = z;
        double r653023 = r653021 * r653022;
        double r653024 = r653020 + r653023;
        double r653025 = t;
        double r653026 = a;
        double r653027 = r653025 * r653026;
        double r653028 = r653024 + r653027;
        double r653029 = r653026 * r653022;
        double r653030 = b;
        double r653031 = r653029 * r653030;
        double r653032 = r653028 + r653031;
        return r653032;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r653033 = b;
        double r653034 = -1.0890740179526285e-10;
        bool r653035 = r653033 <= r653034;
        double r653036 = 1.3831953550132272e-189;
        bool r653037 = r653033 <= r653036;
        double r653038 = !r653037;
        bool r653039 = r653035 || r653038;
        double r653040 = y;
        double r653041 = z;
        double r653042 = a;
        double r653043 = t;
        double r653044 = x;
        double r653045 = fma(r653042, r653043, r653044);
        double r653046 = fma(r653040, r653041, r653045);
        double r653047 = r653042 * r653041;
        double r653048 = r653047 * r653033;
        double r653049 = r653046 + r653048;
        double r653050 = r653041 * r653033;
        double r653051 = r653042 * r653050;
        double r653052 = 1.0;
        double r653053 = pow(r653051, r653052);
        double r653054 = r653046 + r653053;
        double r653055 = r653039 ? r653049 : r653054;
        return r653055;
}

Error

Bits error versus x

Bits error versus y

Bits error versus z

Bits error versus t

Bits error versus a

Bits error versus b

Target

Original2.1
Target0.3
Herbie0.6
\[\begin{array}{l} \mathbf{if}\;z \lt -11820553527347888000:\\ \;\;\;\;z \cdot \left(b \cdot a + y\right) + \left(x + t \cdot a\right)\\ \mathbf{elif}\;z \lt 4.75897431883642871 \cdot 10^{-122}:\\ \;\;\;\;\left(b \cdot z + t\right) \cdot a + \left(z \cdot y + x\right)\\ \mathbf{else}:\\ \;\;\;\;z \cdot \left(b \cdot a + y\right) + \left(x + t \cdot a\right)\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if b < -1.0890740179526285e-10 or 1.3831953550132272e-189 < b

    1. Initial program 1.0

      \[\left(\left(x + y \cdot z\right) + t \cdot a\right) + \left(a \cdot z\right) \cdot b\]
    2. Taylor expanded around inf 1.0

      \[\leadsto \color{blue}{\left(z \cdot y + \left(x + a \cdot t\right)\right)} + \left(a \cdot z\right) \cdot b\]
    3. Simplified1.0

      \[\leadsto \color{blue}{\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right)} + \left(a \cdot z\right) \cdot b\]

    if -1.0890740179526285e-10 < b < 1.3831953550132272e-189

    1. Initial program 3.8

      \[\left(\left(x + y \cdot z\right) + t \cdot a\right) + \left(a \cdot z\right) \cdot b\]
    2. Taylor expanded around inf 3.8

      \[\leadsto \color{blue}{\left(z \cdot y + \left(x + a \cdot t\right)\right)} + \left(a \cdot z\right) \cdot b\]
    3. Simplified3.8

      \[\leadsto \color{blue}{\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right)} + \left(a \cdot z\right) \cdot b\]
    4. Using strategy rm
    5. Applied pow13.8

      \[\leadsto \mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \left(a \cdot z\right) \cdot \color{blue}{{b}^{1}}\]
    6. Applied pow13.8

      \[\leadsto \mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \left(a \cdot \color{blue}{{z}^{1}}\right) \cdot {b}^{1}\]
    7. Applied pow13.8

      \[\leadsto \mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \left(\color{blue}{{a}^{1}} \cdot {z}^{1}\right) \cdot {b}^{1}\]
    8. Applied pow-prod-down3.8

      \[\leadsto \mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \color{blue}{{\left(a \cdot z\right)}^{1}} \cdot {b}^{1}\]
    9. Applied pow-prod-down3.8

      \[\leadsto \mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \color{blue}{{\left(\left(a \cdot z\right) \cdot b\right)}^{1}}\]
    10. Simplified0.0

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b \le -1.0890740179526285 \cdot 10^{-10} \lor \neg \left(b \le 1.3831953550132272 \cdot 10^{-189}\right):\\ \;\;\;\;\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + \left(a \cdot z\right) \cdot b\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(y, z, \mathsf{fma}\left(a, t, x\right)\right) + {\left(a \cdot \left(z \cdot b\right)\right)}^{1}\\ \end{array}\]

Reproduce

herbie shell --seed 2020056 +o rules:numerics
(FPCore (x y z t a b)
  :name "Graphics.Rasterific.CubicBezier:cachedBezierAt from Rasterific-0.6.1"
  :precision binary64

  :herbie-target
  (if (< z -11820553527347888000) (+ (* z (+ (* b a) y)) (+ x (* t a))) (if (< z 4.7589743188364287e-122) (+ (* (+ (* b z) t) a) (+ (* z y) x)) (+ (* z (+ (* b a) y)) (+ x (* t a)))))

  (+ (+ (+ x (* y z)) (* t a)) (* (* a z) b)))