0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\sqrt{\left(re + \mathsf{hypot}\left(re, im\right)\right) \cdot 2.0} \cdot 0.5double f(double re, double im) {
double r5228197 = 0.5;
double r5228198 = 2.0;
double r5228199 = re;
double r5228200 = r5228199 * r5228199;
double r5228201 = im;
double r5228202 = r5228201 * r5228201;
double r5228203 = r5228200 + r5228202;
double r5228204 = sqrt(r5228203);
double r5228205 = r5228204 + r5228199;
double r5228206 = r5228198 * r5228205;
double r5228207 = sqrt(r5228206);
double r5228208 = r5228197 * r5228207;
return r5228208;
}
double f(double re, double im) {
double r5228209 = re;
double r5228210 = im;
double r5228211 = hypot(r5228209, r5228210);
double r5228212 = r5228209 + r5228211;
double r5228213 = 2.0;
double r5228214 = r5228212 * r5228213;
double r5228215 = sqrt(r5228214);
double r5228216 = 0.5;
double r5228217 = r5228215 * r5228216;
return r5228217;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.0 |
|---|---|
| Target | 33.1 |
| Herbie | 13.7 |
Initial program 38.0
Simplified13.7
Final simplification13.7
herbie shell --seed 2019144 +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)))))