\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, -3 \cdot \left(x.im \cdot x.re\right), {x.re}^{3}\right)double f(double x_re, double x_im) {
double r121579 = x_re;
double r121580 = r121579 * r121579;
double r121581 = x_im;
double r121582 = r121581 * r121581;
double r121583 = r121580 - r121582;
double r121584 = r121583 * r121579;
double r121585 = r121579 * r121581;
double r121586 = r121581 * r121579;
double r121587 = r121585 + r121586;
double r121588 = r121587 * r121581;
double r121589 = r121584 - r121588;
return r121589;
}
double f(double x_re, double x_im) {
double r121590 = x_im;
double r121591 = -3.0;
double r121592 = x_re;
double r121593 = r121590 * r121592;
double r121594 = r121591 * r121593;
double r121595 = 3.0;
double r121596 = pow(r121592, r121595);
double r121597 = fma(r121590, r121594, r121596);
return r121597;
}




Bits error versus x.re




Bits error versus x.im
| Original | 7.7 |
|---|---|
| Target | 0.3 |
| Herbie | 0.2 |
Initial program 7.7
Simplified0.2
Final simplification0.2
herbie shell --seed 2019325 +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)))