0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}0.5 \cdot \sqrt{\left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \left(\sqrt{\sqrt{\mathsf{hypot}\left(re, im\right)}} \cdot \sqrt{\sqrt{\mathsf{hypot}\left(re, im\right)}}\right)\right) \cdot 2}double f(double re, double im) {
double r284362 = 0.5;
double r284363 = 2.0;
double r284364 = re;
double r284365 = r284364 * r284364;
double r284366 = im;
double r284367 = r284366 * r284366;
double r284368 = r284365 + r284367;
double r284369 = sqrt(r284368);
double r284370 = r284369 + r284364;
double r284371 = r284363 * r284370;
double r284372 = sqrt(r284371);
double r284373 = r284362 * r284372;
return r284373;
}
double f(double re, double im) {
double r284374 = 0.5;
double r284375 = re;
double r284376 = im;
double r284377 = hypot(r284375, r284376);
double r284378 = sqrt(r284377);
double r284379 = sqrt(r284378);
double r284380 = r284379 * r284379;
double r284381 = r284378 * r284380;
double r284382 = r284375 + r284381;
double r284383 = 2.0;
double r284384 = r284382 * r284383;
double r284385 = sqrt(r284384);
double r284386 = r284374 * r284385;
return r284386;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.8 |
|---|---|
| Target | 33.8 |
| Herbie | 14.8 |
Initial program 38.8
Simplified13.2
rmApplied add-sqr-sqrt14.5
rmApplied add-sqr-sqrt14.5
Applied sqrt-prod14.8
Final simplification14.8
herbie shell --seed 2020043 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))