0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -1.15605472970223693 \cdot 10^{174}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{0 + {im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{1} \cdot \mathsf{hypot}\left(re, im\right) + re\right)}\\
\end{array}double f(double re, double im) {
double r190227 = 0.5;
double r190228 = 2.0;
double r190229 = re;
double r190230 = r190229 * r190229;
double r190231 = im;
double r190232 = r190231 * r190231;
double r190233 = r190230 + r190232;
double r190234 = sqrt(r190233);
double r190235 = r190234 + r190229;
double r190236 = r190228 * r190235;
double r190237 = sqrt(r190236);
double r190238 = r190227 * r190237;
return r190238;
}
double f(double re, double im) {
double r190239 = re;
double r190240 = -1.156054729702237e+174;
bool r190241 = r190239 <= r190240;
double r190242 = 0.5;
double r190243 = 2.0;
double r190244 = 0.0;
double r190245 = im;
double r190246 = 2.0;
double r190247 = pow(r190245, r190246);
double r190248 = r190244 + r190247;
double r190249 = hypot(r190239, r190245);
double r190250 = r190249 - r190239;
double r190251 = r190248 / r190250;
double r190252 = r190243 * r190251;
double r190253 = sqrt(r190252);
double r190254 = r190242 * r190253;
double r190255 = 1.0;
double r190256 = sqrt(r190255);
double r190257 = r190256 * r190249;
double r190258 = r190257 + r190239;
double r190259 = r190243 * r190258;
double r190260 = sqrt(r190259);
double r190261 = r190242 * r190260;
double r190262 = r190241 ? r190254 : r190261;
return r190262;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.9 |
|---|---|
| Target | 34.0 |
| Herbie | 11.9 |
if re < -1.156054729702237e+174Initial program 64.0
rmApplied flip-+64.0
Simplified50.6
Simplified32.3
if -1.156054729702237e+174 < re Initial program 35.8
rmApplied *-un-lft-identity35.8
Applied sqrt-prod35.8
Simplified9.5
Final simplification11.9
herbie shell --seed 2020089 +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)))))