0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}0.5 \cdot \sqrt{\left(re + \left(\left|\sqrt[3]{\mathsf{hypot}\left(re, im\right)}\right| \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot \sqrt{\sqrt[3]{\mathsf{hypot}\left(re, im\right)}}\right) \cdot 2}double f(double re, double im) {
double r145605 = 0.5;
double r145606 = 2.0;
double r145607 = re;
double r145608 = r145607 * r145607;
double r145609 = im;
double r145610 = r145609 * r145609;
double r145611 = r145608 + r145610;
double r145612 = sqrt(r145611);
double r145613 = r145612 + r145607;
double r145614 = r145606 * r145613;
double r145615 = sqrt(r145614);
double r145616 = r145605 * r145615;
return r145616;
}
double f(double re, double im) {
double r145617 = 0.5;
double r145618 = re;
double r145619 = im;
double r145620 = hypot(r145618, r145619);
double r145621 = cbrt(r145620);
double r145622 = fabs(r145621);
double r145623 = sqrt(r145620);
double r145624 = r145622 * r145623;
double r145625 = sqrt(r145621);
double r145626 = r145624 * r145625;
double r145627 = r145618 + r145626;
double r145628 = 2.0;
double r145629 = r145627 * r145628;
double r145630 = sqrt(r145629);
double r145631 = r145617 * r145630;
return r145631;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.3 |
|---|---|
| Target | 33.3 |
| Herbie | 15.1 |
Initial program 38.3
Simplified13.3
rmApplied add-sqr-sqrt14.5
rmApplied add-cube-cbrt15.2
Applied sqrt-prod15.0
Applied associate-*r*15.1
Simplified15.1
Final simplification15.1
herbie shell --seed 2019198 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2.0) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))