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 r6689944 = 0.5;
double r6689945 = 2.0;
double r6689946 = re;
double r6689947 = r6689946 * r6689946;
double r6689948 = im;
double r6689949 = r6689948 * r6689948;
double r6689950 = r6689947 + r6689949;
double r6689951 = sqrt(r6689950);
double r6689952 = r6689951 + r6689946;
double r6689953 = r6689945 * r6689952;
double r6689954 = sqrt(r6689953);
double r6689955 = r6689944 * r6689954;
return r6689955;
}
double f(double re, double im) {
double r6689956 = re;
double r6689957 = im;
double r6689958 = hypot(r6689956, r6689957);
double r6689959 = r6689956 + r6689958;
double r6689960 = 2.0;
double r6689961 = r6689959 * r6689960;
double r6689962 = sqrt(r6689961);
double r6689963 = 0.5;
double r6689964 = r6689962 * r6689963;
return r6689964;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.5 |
|---|---|
| Target | 32.8 |
| Herbie | 13.3 |
Initial program 37.5
Simplified13.3
Final simplification13.3
herbie shell --seed 2019134 +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)))))