\left(x.re \cdot x.re - x.im \cdot x.im\right) \cdot x.im + \left(x.re \cdot x.im + x.im \cdot x.re\right) \cdot x.re
\mathsf{fma}\left(x.im + x.re, \left(x.re - x.im\right) \cdot x.im, \left(\left(\left(\left(x.re + x.re\right) \cdot x.im\right) \cdot \sqrt[3]{x.re}\right) \cdot \sqrt[3]{x.re}\right) \cdot \sqrt[3]{x.re}\right)double f(double x_re, double x_im) {
double r7477109 = x_re;
double r7477110 = r7477109 * r7477109;
double r7477111 = x_im;
double r7477112 = r7477111 * r7477111;
double r7477113 = r7477110 - r7477112;
double r7477114 = r7477113 * r7477111;
double r7477115 = r7477109 * r7477111;
double r7477116 = r7477111 * r7477109;
double r7477117 = r7477115 + r7477116;
double r7477118 = r7477117 * r7477109;
double r7477119 = r7477114 + r7477118;
return r7477119;
}
double f(double x_re, double x_im) {
double r7477120 = x_im;
double r7477121 = x_re;
double r7477122 = r7477120 + r7477121;
double r7477123 = r7477121 - r7477120;
double r7477124 = r7477123 * r7477120;
double r7477125 = r7477121 + r7477121;
double r7477126 = r7477125 * r7477120;
double r7477127 = cbrt(r7477121);
double r7477128 = r7477126 * r7477127;
double r7477129 = r7477128 * r7477127;
double r7477130 = r7477129 * r7477127;
double r7477131 = fma(r7477122, r7477124, r7477130);
return r7477131;
}




Bits error versus x.re




Bits error versus x.im
| Original | 6.7 |
|---|---|
| Target | 0.2 |
| Herbie | 0.5 |
Initial program 6.7
rmApplied difference-of-squares6.7
Applied associate-*l*0.2
rmApplied fma-def0.2
rmApplied add-cube-cbrt0.5
Applied associate-*r*0.5
Simplified0.5
Final simplification0.5
herbie shell --seed 2019168 +o rules:numerics
(FPCore (x.re x.im)
:name "math.cube on complex, imaginary part"
:herbie-target
(+ (* (* x.re x.im) (* 2 x.re)) (* (* x.im (- x.re x.im)) (+ x.re x.im)))
(+ (* (- (* x.re x.re) (* x.im x.im)) x.im) (* (+ (* x.re x.im) (* x.im x.re)) x.re)))