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 r7012138 = 0.5;
double r7012139 = 2.0;
double r7012140 = re;
double r7012141 = r7012140 * r7012140;
double r7012142 = im;
double r7012143 = r7012142 * r7012142;
double r7012144 = r7012141 + r7012143;
double r7012145 = sqrt(r7012144);
double r7012146 = r7012145 + r7012140;
double r7012147 = r7012139 * r7012146;
double r7012148 = sqrt(r7012147);
double r7012149 = r7012138 * r7012148;
return r7012149;
}
double f(double re, double im) {
double r7012150 = re;
double r7012151 = im;
double r7012152 = hypot(r7012150, r7012151);
double r7012153 = r7012150 + r7012152;
double r7012154 = 2.0;
double r7012155 = r7012153 * r7012154;
double r7012156 = sqrt(r7012155);
double r7012157 = 0.5;
double r7012158 = r7012156 * r7012157;
return r7012158;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.4 |
|---|---|
| Target | 32.3 |
| Herbie | 13.4 |
Initial program 37.4
Simplified13.4
Final simplification13.4
herbie shell --seed 2019164 +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)))))