0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -6.4397722734901768 \cdot 10^{138}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2} \cdot \left|im\right|}{\sqrt{-2 \cdot re}}\\
\mathbf{elif}\;re \le 1.73514039595624235 \cdot 10^{-43}:\\
\;\;\;\;0.5 \cdot \frac{\left(\sqrt[3]{\sqrt{2}} \cdot \sqrt[3]{\sqrt{2}}\right) \cdot \left(\sqrt[3]{\sqrt{2}} \cdot \left|im\right|\right)}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r185428 = 0.5;
double r185429 = 2.0;
double r185430 = re;
double r185431 = r185430 * r185430;
double r185432 = im;
double r185433 = r185432 * r185432;
double r185434 = r185431 + r185433;
double r185435 = sqrt(r185434);
double r185436 = r185435 + r185430;
double r185437 = r185429 * r185436;
double r185438 = sqrt(r185437);
double r185439 = r185428 * r185438;
return r185439;
}
double f(double re, double im) {
double r185440 = re;
double r185441 = -6.439772273490177e+138;
bool r185442 = r185440 <= r185441;
double r185443 = 0.5;
double r185444 = 2.0;
double r185445 = sqrt(r185444);
double r185446 = im;
double r185447 = fabs(r185446);
double r185448 = r185445 * r185447;
double r185449 = -2.0;
double r185450 = r185449 * r185440;
double r185451 = sqrt(r185450);
double r185452 = r185448 / r185451;
double r185453 = r185443 * r185452;
double r185454 = 1.7351403959562423e-43;
bool r185455 = r185440 <= r185454;
double r185456 = cbrt(r185445);
double r185457 = r185456 * r185456;
double r185458 = r185456 * r185447;
double r185459 = r185457 * r185458;
double r185460 = r185440 * r185440;
double r185461 = r185446 * r185446;
double r185462 = r185460 + r185461;
double r185463 = sqrt(r185462);
double r185464 = r185463 - r185440;
double r185465 = sqrt(r185464);
double r185466 = r185459 / r185465;
double r185467 = r185443 * r185466;
double r185468 = r185440 + r185440;
double r185469 = r185444 * r185468;
double r185470 = sqrt(r185469);
double r185471 = r185443 * r185470;
double r185472 = r185455 ? r185467 : r185471;
double r185473 = r185442 ? r185453 : r185472;
return r185473;
}




Bits error versus re




Bits error versus im
Results
| Original | 39.0 |
|---|---|
| Target | 33.9 |
| Herbie | 20.9 |
if re < -6.439772273490177e+138Initial program 63.1
rmApplied flip-+63.1
Applied associate-*r/63.1
Applied sqrt-div63.1
Simplified48.0
rmApplied sqrt-prod48.0
Simplified46.8
Taylor expanded around -inf 8.5
if -6.439772273490177e+138 < re < 1.7351403959562423e-43Initial program 33.7
rmApplied flip-+37.4
Applied associate-*r/37.4
Applied sqrt-div37.7
Simplified31.7
rmApplied sqrt-prod31.7
Simplified25.7
rmApplied add-cube-cbrt25.7
Applied associate-*l*25.7
if 1.7351403959562423e-43 < re Initial program 37.8
Taylor expanded around inf 17.4
Final simplification20.9
herbie shell --seed 2019199
(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)))))