Average Error: 3.6 → 1.0
Time: 15.6s
Precision: 64
\[\left(x \cdot 2.0 - \left(\left(y \cdot 9.0\right) \cdot z\right) \cdot t\right) + \left(a \cdot 27.0\right) \cdot b\]
\[\begin{array}{l} \mathbf{if}\;y \cdot 9.0 \le -2.571496331294558 \cdot 10^{+88}:\\ \;\;\;\;\left(x \cdot 2.0 - \left(y \cdot 9.0\right) \cdot \left(t \cdot z\right)\right) + a \cdot \left(b \cdot 27.0\right)\\ \mathbf{elif}\;y \cdot 9.0 \le 2.1986188378929088 \cdot 10^{-131}:\\ \;\;\;\;\left(x \cdot 2.0 + 27.0 \cdot \left(a \cdot b\right)\right) - \left(\left(y \cdot z\right) \cdot t\right) \cdot 9.0\\ \mathbf{else}:\\ \;\;\;\;\left(x \cdot 2.0 - \left(y \cdot 9.0\right) \cdot \left(t \cdot z\right)\right) + a \cdot \left(b \cdot 27.0\right)\\ \end{array}\]
\left(x \cdot 2.0 - \left(\left(y \cdot 9.0\right) \cdot z\right) \cdot t\right) + \left(a \cdot 27.0\right) \cdot b
\begin{array}{l}
\mathbf{if}\;y \cdot 9.0 \le -2.571496331294558 \cdot 10^{+88}:\\
\;\;\;\;\left(x \cdot 2.0 - \left(y \cdot 9.0\right) \cdot \left(t \cdot z\right)\right) + a \cdot \left(b \cdot 27.0\right)\\

\mathbf{elif}\;y \cdot 9.0 \le 2.1986188378929088 \cdot 10^{-131}:\\
\;\;\;\;\left(x \cdot 2.0 + 27.0 \cdot \left(a \cdot b\right)\right) - \left(\left(y \cdot z\right) \cdot t\right) \cdot 9.0\\

\mathbf{else}:\\
\;\;\;\;\left(x \cdot 2.0 - \left(y \cdot 9.0\right) \cdot \left(t \cdot z\right)\right) + a \cdot \left(b \cdot 27.0\right)\\

\end{array}
double f(double x, double y, double z, double t, double a, double b) {
        double r35616145 = x;
        double r35616146 = 2.0;
        double r35616147 = r35616145 * r35616146;
        double r35616148 = y;
        double r35616149 = 9.0;
        double r35616150 = r35616148 * r35616149;
        double r35616151 = z;
        double r35616152 = r35616150 * r35616151;
        double r35616153 = t;
        double r35616154 = r35616152 * r35616153;
        double r35616155 = r35616147 - r35616154;
        double r35616156 = a;
        double r35616157 = 27.0;
        double r35616158 = r35616156 * r35616157;
        double r35616159 = b;
        double r35616160 = r35616158 * r35616159;
        double r35616161 = r35616155 + r35616160;
        return r35616161;
}

double f(double x, double y, double z, double t, double a, double b) {
        double r35616162 = y;
        double r35616163 = 9.0;
        double r35616164 = r35616162 * r35616163;
        double r35616165 = -2.571496331294558e+88;
        bool r35616166 = r35616164 <= r35616165;
        double r35616167 = x;
        double r35616168 = 2.0;
        double r35616169 = r35616167 * r35616168;
        double r35616170 = t;
        double r35616171 = z;
        double r35616172 = r35616170 * r35616171;
        double r35616173 = r35616164 * r35616172;
        double r35616174 = r35616169 - r35616173;
        double r35616175 = a;
        double r35616176 = b;
        double r35616177 = 27.0;
        double r35616178 = r35616176 * r35616177;
        double r35616179 = r35616175 * r35616178;
        double r35616180 = r35616174 + r35616179;
        double r35616181 = 2.1986188378929088e-131;
        bool r35616182 = r35616164 <= r35616181;
        double r35616183 = r35616175 * r35616176;
        double r35616184 = r35616177 * r35616183;
        double r35616185 = r35616169 + r35616184;
        double r35616186 = r35616162 * r35616171;
        double r35616187 = r35616186 * r35616170;
        double r35616188 = r35616187 * r35616163;
        double r35616189 = r35616185 - r35616188;
        double r35616190 = r35616182 ? r35616189 : r35616180;
        double r35616191 = r35616166 ? r35616180 : r35616190;
        return r35616191;
}

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

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original3.6
Target2.4
Herbie1.0
\[\begin{array}{l} \mathbf{if}\;y \lt 7.590524218811189 \cdot 10^{-161}:\\ \;\;\;\;\left(x \cdot 2.0 - \left(\left(y \cdot 9.0\right) \cdot z\right) \cdot t\right) + a \cdot \left(27.0 \cdot b\right)\\ \mathbf{else}:\\ \;\;\;\;\left(x \cdot 2.0 - 9.0 \cdot \left(y \cdot \left(t \cdot z\right)\right)\right) + \left(a \cdot 27.0\right) \cdot b\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if (* y 9.0) < -2.571496331294558e+88 or 2.1986188378929088e-131 < (* y 9.0)

    1. Initial program 6.6

      \[\left(x \cdot 2.0 - \left(\left(y \cdot 9.0\right) \cdot z\right) \cdot t\right) + \left(a \cdot 27.0\right) \cdot b\]
    2. Using strategy rm
    3. Applied associate-*l*1.3

      \[\leadsto \left(x \cdot 2.0 - \color{blue}{\left(y \cdot 9.0\right) \cdot \left(z \cdot t\right)}\right) + \left(a \cdot 27.0\right) \cdot b\]
    4. Using strategy rm
    5. Applied associate-*l*1.3

      \[\leadsto \left(x \cdot 2.0 - \left(y \cdot 9.0\right) \cdot \left(z \cdot t\right)\right) + \color{blue}{a \cdot \left(27.0 \cdot b\right)}\]

    if -2.571496331294558e+88 < (* y 9.0) < 2.1986188378929088e-131

    1. Initial program 0.9

      \[\left(x \cdot 2.0 - \left(\left(y \cdot 9.0\right) \cdot z\right) \cdot t\right) + \left(a \cdot 27.0\right) \cdot b\]
    2. Using strategy rm
    3. Applied associate-*l*5.0

      \[\leadsto \left(x \cdot 2.0 - \color{blue}{\left(y \cdot 9.0\right) \cdot \left(z \cdot t\right)}\right) + \left(a \cdot 27.0\right) \cdot b\]
    4. Taylor expanded around inf 0.7

      \[\leadsto \color{blue}{\left(2.0 \cdot x + 27.0 \cdot \left(a \cdot b\right)\right) - 9.0 \cdot \left(t \cdot \left(z \cdot y\right)\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification1.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;y \cdot 9.0 \le -2.571496331294558 \cdot 10^{+88}:\\ \;\;\;\;\left(x \cdot 2.0 - \left(y \cdot 9.0\right) \cdot \left(t \cdot z\right)\right) + a \cdot \left(b \cdot 27.0\right)\\ \mathbf{elif}\;y \cdot 9.0 \le 2.1986188378929088 \cdot 10^{-131}:\\ \;\;\;\;\left(x \cdot 2.0 + 27.0 \cdot \left(a \cdot b\right)\right) - \left(\left(y \cdot z\right) \cdot t\right) \cdot 9.0\\ \mathbf{else}:\\ \;\;\;\;\left(x \cdot 2.0 - \left(y \cdot 9.0\right) \cdot \left(t \cdot z\right)\right) + a \cdot \left(b \cdot 27.0\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019162 
(FPCore (x y z t a b)
  :name "Diagrams.Solve.Polynomial:cubForm  from diagrams-solve-0.1, A"

  :herbie-target
  (if (< y 7.590524218811189e-161) (+ (- (* x 2.0) (* (* (* y 9.0) z) t)) (* a (* 27.0 b))) (+ (- (* x 2.0) (* 9.0 (* y (* t z)))) (* (* a 27.0) b)))

  (+ (- (* x 2.0) (* (* (* y 9.0) z) t)) (* (* a 27.0) b)))