\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(\left(x.im + x.re\right), \left(\left(x.re - x.im\right) \cdot x.re\right), \left(x.im \cdot \left(x.re \cdot \left(-x.im\right) + x.re \cdot \left(-x.im\right)\right)\right)\right)double f(double x_re, double x_im) {
double r4555214 = x_re;
double r4555215 = r4555214 * r4555214;
double r4555216 = x_im;
double r4555217 = r4555216 * r4555216;
double r4555218 = r4555215 - r4555217;
double r4555219 = r4555218 * r4555214;
double r4555220 = r4555214 * r4555216;
double r4555221 = r4555216 * r4555214;
double r4555222 = r4555220 + r4555221;
double r4555223 = r4555222 * r4555216;
double r4555224 = r4555219 - r4555223;
return r4555224;
}
double f(double x_re, double x_im) {
double r4555225 = x_im;
double r4555226 = x_re;
double r4555227 = r4555225 + r4555226;
double r4555228 = r4555226 - r4555225;
double r4555229 = r4555228 * r4555226;
double r4555230 = -r4555225;
double r4555231 = r4555226 * r4555230;
double r4555232 = r4555231 + r4555231;
double r4555233 = r4555225 * r4555232;
double r4555234 = fma(r4555227, r4555229, r4555233);
return r4555234;
}




Bits error versus x.re




Bits error versus x.im
| Original | 7.1 |
|---|---|
| Target | 0.3 |
| Herbie | 0.2 |
Initial program 7.1
rmApplied difference-of-squares7.1
Applied associate-*l*0.2
rmApplied fma-neg0.2
Simplified0.2
Final simplification0.2
herbie shell --seed 2019129 +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)))