0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\sqrt{\left(re + \mathsf{hypot}\left(re, im\right)\right) \cdot 2} \cdot 0.5double f(double re, double im) {
double r5362506 = 0.5;
double r5362507 = 2.0;
double r5362508 = re;
double r5362509 = r5362508 * r5362508;
double r5362510 = im;
double r5362511 = r5362510 * r5362510;
double r5362512 = r5362509 + r5362511;
double r5362513 = sqrt(r5362512);
double r5362514 = r5362513 + r5362508;
double r5362515 = r5362507 * r5362514;
double r5362516 = sqrt(r5362515);
double r5362517 = r5362506 * r5362516;
return r5362517;
}
double f(double re, double im) {
double r5362518 = re;
double r5362519 = im;
double r5362520 = hypot(r5362518, r5362519);
double r5362521 = r5362518 + r5362520;
double r5362522 = 2.0;
double r5362523 = r5362521 * r5362522;
double r5362524 = sqrt(r5362523);
double r5362525 = 0.5;
double r5362526 = r5362524 * r5362525;
return r5362526;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.9 |
|---|---|
| Target | 32.7 |
| Herbie | 13.1 |
Initial program 37.9
Simplified13.1
Final simplification13.1
herbie shell --seed 2019172 +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)))))