0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\sqrt{\left(re + \sqrt{re^2 + im^2}^*\right) \cdot 2.0} \cdot 0.5double f(double re, double im) {
double r16332009 = 0.5;
double r16332010 = 2.0;
double r16332011 = re;
double r16332012 = r16332011 * r16332011;
double r16332013 = im;
double r16332014 = r16332013 * r16332013;
double r16332015 = r16332012 + r16332014;
double r16332016 = sqrt(r16332015);
double r16332017 = r16332016 + r16332011;
double r16332018 = r16332010 * r16332017;
double r16332019 = sqrt(r16332018);
double r16332020 = r16332009 * r16332019;
return r16332020;
}
double f(double re, double im) {
double r16332021 = re;
double r16332022 = im;
double r16332023 = hypot(r16332021, r16332022);
double r16332024 = r16332021 + r16332023;
double r16332025 = 2.0;
double r16332026 = r16332024 * r16332025;
double r16332027 = sqrt(r16332026);
double r16332028 = 0.5;
double r16332029 = r16332027 * r16332028;
return r16332029;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.5 |
|---|---|
| Target | 32.8 |
| Herbie | 12.9 |
Initial program 37.5
Simplified12.9
Final simplification12.9
herbie shell --seed 2019112 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0) (* 0.5 (* (sqrt 2) (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)))))