\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(x.im + x.re, \left(x.re - x.im\right) \cdot x.re, \left(\left(-x.im\right) \cdot x.re + \left(-x.im\right) \cdot x.re\right) \cdot x.im\right)double f(double x_re, double x_im) {
double r4060417 = x_re;
double r4060418 = r4060417 * r4060417;
double r4060419 = x_im;
double r4060420 = r4060419 * r4060419;
double r4060421 = r4060418 - r4060420;
double r4060422 = r4060421 * r4060417;
double r4060423 = r4060417 * r4060419;
double r4060424 = r4060419 * r4060417;
double r4060425 = r4060423 + r4060424;
double r4060426 = r4060425 * r4060419;
double r4060427 = r4060422 - r4060426;
return r4060427;
}
double f(double x_re, double x_im) {
double r4060428 = x_im;
double r4060429 = x_re;
double r4060430 = r4060428 + r4060429;
double r4060431 = r4060429 - r4060428;
double r4060432 = r4060431 * r4060429;
double r4060433 = -r4060428;
double r4060434 = r4060433 * r4060429;
double r4060435 = r4060434 + r4060434;
double r4060436 = r4060435 * r4060428;
double r4060437 = fma(r4060430, r4060432, r4060436);
return r4060437;
}




Bits error versus x.re




Bits error versus x.im
| Original | 7.3 |
|---|---|
| Target | 0.2 |
| Herbie | 0.2 |
Initial program 7.3
rmApplied difference-of-squares7.3
Applied associate-*l*0.2
rmApplied fma-neg0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019144 +o rules:numerics
(FPCore (x.re x.im)
:name "math.cube on complex, real part"
: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)))