\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 r298278 = x_re;
double r298279 = r298278 * r298278;
double r298280 = x_im;
double r298281 = r298280 * r298280;
double r298282 = r298279 - r298281;
double r298283 = r298282 * r298278;
double r298284 = r298278 * r298280;
double r298285 = r298280 * r298278;
double r298286 = r298284 + r298285;
double r298287 = r298286 * r298280;
double r298288 = r298283 - r298287;
return r298288;
}
double f(double x_re, double x_im) {
double r298289 = 3.0;
double r298290 = x_re;
double r298291 = x_im;
double r298292 = r298290 * r298291;
double r298293 = -r298291;
double r298294 = r298292 * r298293;
double r298295 = pow(r298290, r298289);
double r298296 = fma(r298289, r298294, r298295);
return r298296;
}




Bits error versus x.re




Bits error versus x.im
| Original | 7.2 |
|---|---|
| Target | 0.3 |
| Herbie | 0.2 |
Initial program 7.2
Simplified7.1
rmApplied distribute-rgt-neg-in7.1
Applied associate-*r*0.2
Final simplification0.2
herbie shell --seed 2020049 +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)))