double f(double re, double im) {
double r18774071 = 0.5;
double r18774072 = 2.0;
double r18774073 = re;
double r18774074 = r18774073 * r18774073;
double r18774075 = im;
double r18774076 = r18774075 * r18774075;
double r18774077 = r18774074 + r18774076;
double r18774078 = sqrt(r18774077);
double r18774079 = r18774078 + r18774073;
double r18774080 = r18774072 * r18774079;
double r18774081 = sqrt(r18774080);
double r18774082 = r18774071 * r18774081;
return r18774082;
}
double f(double re, double im) {
double r18774083 = re;
double r18774084 = im;
double r18774085 = hypot(r18774083, r18774084);
double r18774086 = r18774083 + r18774085;
double r18774087 = 2.0;
double r18774088 = r18774086 * r18774087;
double r18774089 = sqrt(r18774088);
double r18774090 = 0.5;
double r18774091 = r18774089 * r18774090;
return r18774091;
}
0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\sqrt{\left(re + \sqrt{re^2 + im^2}^*\right) \cdot 2.0} \cdot 0.5



Bits error versus re




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