\left(x.re \cdot x.re - x.im \cdot x.im\right) \cdot x.re - \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.im
\mathsf{fma}\left(3, \left(x.re \cdot x.im\right) \cdot \left(-x.im\right), {x.re}^{3}\right)double f(double x_re, double x_im) {
double r247105 = x_re;
double r247106 = r247105 * r247105;
double r247107 = x_im;
double r247108 = r247107 * r247107;
double r247109 = r247106 - r247108;
double r247110 = r247109 * r247105;
double r247111 = r247105 * r247107;
double r247112 = r247107 * r247105;
double r247113 = r247111 + r247112;
double r247114 = r247113 * r247107;
double r247115 = r247110 - r247114;
return r247115;
}
double f(double x_re, double x_im) {
double r247116 = 3.0;
double r247117 = x_re;
double r247118 = x_im;
double r247119 = r247117 * r247118;
double r247120 = -r247118;
double r247121 = r247119 * r247120;
double r247122 = pow(r247117, r247116);
double r247123 = fma(r247116, r247121, r247122);
return r247123;
}




Bits error versus x.re




Bits error versus x.im
| Original | 7.0 |
|---|---|
| Target | 0.2 |
| Herbie | 0.2 |
Initial program 7.0
Simplified6.9
rmApplied distribute-rgt-neg-in6.9
Applied associate-*r*0.2
Final simplification0.2
herbie shell --seed 2020018 +o rules:numerics
(FPCore (x.re x.im)
:name "math.cube on complex, real part"
:precision binary64
:herbie-target
(+ (* (* x.re x.re) (- x.re x.im)) (* (* x.re x.im) (- x.re (* 3 x.im))))
(- (* (- (* x.re x.re) (* x.im x.im)) x.re) (* (+ (* x.re x.im) (* x.im x.re)) x.im)))