\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(\left(-x.im\right) \cdot \left(x.re \cdot x.im + x.re \cdot x.im\right)\right)\right)double f(double x_re, double x_im) {
double r2115200 = x_re;
double r2115201 = r2115200 * r2115200;
double r2115202 = x_im;
double r2115203 = r2115202 * r2115202;
double r2115204 = r2115201 - r2115203;
double r2115205 = r2115204 * r2115200;
double r2115206 = r2115200 * r2115202;
double r2115207 = r2115202 * r2115200;
double r2115208 = r2115206 + r2115207;
double r2115209 = r2115208 * r2115202;
double r2115210 = r2115205 - r2115209;
return r2115210;
}
double f(double x_re, double x_im) {
double r2115211 = x_im;
double r2115212 = x_re;
double r2115213 = r2115211 + r2115212;
double r2115214 = r2115212 - r2115211;
double r2115215 = r2115214 * r2115212;
double r2115216 = -r2115211;
double r2115217 = r2115212 * r2115211;
double r2115218 = r2115217 + r2115217;
double r2115219 = r2115216 * r2115218;
double r2115220 = fma(r2115213, r2115215, r2115219);
return r2115220;
}




Bits error versus x.re




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