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 r27720364 = 0.5;
double r27720365 = 2.0;
double r27720366 = re;
double r27720367 = r27720366 * r27720366;
double r27720368 = im;
double r27720369 = r27720368 * r27720368;
double r27720370 = r27720367 + r27720369;
double r27720371 = sqrt(r27720370);
double r27720372 = r27720371 + r27720366;
double r27720373 = r27720365 * r27720372;
double r27720374 = sqrt(r27720373);
double r27720375 = r27720364 * r27720374;
return r27720375;
}
double f(double re, double im) {
double r27720376 = re;
double r27720377 = im;
double r27720378 = hypot(r27720376, r27720377);
double r27720379 = r27720376 + r27720378;
double r27720380 = 2.0;
double r27720381 = r27720379 * r27720380;
double r27720382 = sqrt(r27720381);
double r27720383 = 0.5;
double r27720384 = r27720382 * r27720383;
return r27720384;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.6 |
|---|---|
| Target | 32.6 |
| Herbie | 13.3 |
Initial program 37.6
Simplified13.3
Final simplification13.3
herbie shell --seed 2019107 +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)))))