0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}0.5 \cdot \sqrt{\left(\sqrt{\mathsf{hypot}\left(re, im\right) + re} \cdot \sqrt{\mathsf{hypot}\left(re, im\right) + re}\right) \cdot 2}double f(double re, double im) {
double r145116 = 0.5;
double r145117 = 2.0;
double r145118 = re;
double r145119 = r145118 * r145118;
double r145120 = im;
double r145121 = r145120 * r145120;
double r145122 = r145119 + r145121;
double r145123 = sqrt(r145122);
double r145124 = r145123 + r145118;
double r145125 = r145117 * r145124;
double r145126 = sqrt(r145125);
double r145127 = r145116 * r145126;
return r145127;
}
double f(double re, double im) {
double r145128 = 0.5;
double r145129 = re;
double r145130 = im;
double r145131 = hypot(r145129, r145130);
double r145132 = r145131 + r145129;
double r145133 = sqrt(r145132);
double r145134 = r145133 * r145133;
double r145135 = 2.0;
double r145136 = r145134 * r145135;
double r145137 = sqrt(r145136);
double r145138 = r145128 * r145137;
return r145138;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.4 |
|---|---|
| Target | 33.5 |
| Herbie | 13.5 |
Initial program 38.4
Simplified13.3
rmApplied add-sqr-sqrt14.4
rmApplied add-sqr-sqrt14.4
Simplified14.1
Simplified13.5
Final simplification13.5
herbie shell --seed 2019326 +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)))))