0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\sqrt{\left(re + \mathsf{hypot}\left(re, im\right)\right) \cdot 2} \cdot 0.5double f(double re, double im) {
double r133855 = 0.5;
double r133856 = 2.0;
double r133857 = re;
double r133858 = r133857 * r133857;
double r133859 = im;
double r133860 = r133859 * r133859;
double r133861 = r133858 + r133860;
double r133862 = sqrt(r133861);
double r133863 = r133862 + r133857;
double r133864 = r133856 * r133863;
double r133865 = sqrt(r133864);
double r133866 = r133855 * r133865;
return r133866;
}
double f(double re, double im) {
double r133867 = re;
double r133868 = im;
double r133869 = hypot(r133867, r133868);
double r133870 = r133867 + r133869;
double r133871 = 2.0;
double r133872 = r133870 * r133871;
double r133873 = sqrt(r133872);
double r133874 = 0.5;
double r133875 = r133873 * r133874;
return r133875;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.4 |
|---|---|
| Target | 33.3 |
| Herbie | 13.1 |
Initial program 38.4
Simplified13.1
Final simplification13.1
herbie shell --seed 2019179 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2.0) (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)))))