0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0} \le 0.0:\\
\;\;\;\;\sqrt{2.0 \cdot \frac{im \cdot im}{\sqrt{im \cdot im + re \cdot re} - re}} \cdot 0.5\\
\mathbf{elif}\;\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0} \le 1.2368170361048602 \cdot 10^{-84}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(re + re\right)} \cdot 0.5\\
\mathbf{elif}\;\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0} \le 1.1723558459928398 \cdot 10^{+77}:\\
\;\;\;\;\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + im\right) \cdot 2.0}\\
\end{array}double f(double re, double im) {
double r5729424 = 0.5;
double r5729425 = 2.0;
double r5729426 = re;
double r5729427 = r5729426 * r5729426;
double r5729428 = im;
double r5729429 = r5729428 * r5729428;
double r5729430 = r5729427 + r5729429;
double r5729431 = sqrt(r5729430);
double r5729432 = r5729431 + r5729426;
double r5729433 = r5729425 * r5729432;
double r5729434 = sqrt(r5729433);
double r5729435 = r5729424 * r5729434;
return r5729435;
}
double f(double re, double im) {
double r5729436 = re;
double r5729437 = im;
double r5729438 = r5729437 * r5729437;
double r5729439 = r5729436 * r5729436;
double r5729440 = r5729438 + r5729439;
double r5729441 = sqrt(r5729440);
double r5729442 = r5729436 + r5729441;
double r5729443 = 2.0;
double r5729444 = r5729442 * r5729443;
double r5729445 = sqrt(r5729444);
double r5729446 = 0.0;
bool r5729447 = r5729445 <= r5729446;
double r5729448 = r5729441 - r5729436;
double r5729449 = r5729438 / r5729448;
double r5729450 = r5729443 * r5729449;
double r5729451 = sqrt(r5729450);
double r5729452 = 0.5;
double r5729453 = r5729451 * r5729452;
double r5729454 = 1.2368170361048602e-84;
bool r5729455 = r5729445 <= r5729454;
double r5729456 = r5729436 + r5729436;
double r5729457 = r5729443 * r5729456;
double r5729458 = sqrt(r5729457);
double r5729459 = r5729458 * r5729452;
double r5729460 = 1.1723558459928398e+77;
bool r5729461 = r5729445 <= r5729460;
double r5729462 = r5729445 * r5729452;
double r5729463 = r5729436 + r5729437;
double r5729464 = r5729463 * r5729443;
double r5729465 = sqrt(r5729464);
double r5729466 = r5729452 * r5729465;
double r5729467 = r5729461 ? r5729462 : r5729466;
double r5729468 = r5729455 ? r5729459 : r5729467;
double r5729469 = r5729447 ? r5729453 : r5729468;
return r5729469;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.5 |
|---|---|
| Target | 32.8 |
| Herbie | 25.4 |
if (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) < 0.0Initial program 58.1
rmApplied add-sqr-sqrt58.1
Applied sqrt-prod60.1
rmApplied flip-+60.1
Simplified32.3
Simplified32.3
if 0.0 < (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) < 1.2368170361048602e-84Initial program 55.1
Taylor expanded around inf 36.1
if 1.2368170361048602e-84 < (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) < 1.1723558459928398e+77Initial program 0.9
rmApplied add-sqr-sqrt0.9
Applied sqrt-prod1.0
rmApplied sqrt-unprod0.9
Simplified0.9
if 1.1723558459928398e+77 < (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) Initial program 61.6
rmApplied add-sqr-sqrt61.6
Applied sqrt-prod61.6
Taylor expanded around 0 43.4
Final simplification25.4
herbie shell --seed 2019134
(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)))))