0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -1.68133238957017115 \cdot 10^{161}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{1}}{\frac{-1 \cdot re - re}{im}}}\\
\mathbf{elif}\;re \le 1.4937844730964523 \cdot 10^{-255}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left|im\right| \cdot \frac{\left|im\right|}{\sqrt{re \cdot re + im \cdot im} - re}\right)}\\
\mathbf{elif}\;re \le 2.37750825737911996 \cdot 10^{102}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(e^{\log \left(\sqrt{re \cdot re + im \cdot im}\right)} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\end{array}double f(double re, double im) {
double r192430 = 0.5;
double r192431 = 2.0;
double r192432 = re;
double r192433 = r192432 * r192432;
double r192434 = im;
double r192435 = r192434 * r192434;
double r192436 = r192433 + r192435;
double r192437 = sqrt(r192436);
double r192438 = r192437 + r192432;
double r192439 = r192431 * r192438;
double r192440 = sqrt(r192439);
double r192441 = r192430 * r192440;
return r192441;
}
double f(double re, double im) {
double r192442 = re;
double r192443 = -1.6813323895701712e+161;
bool r192444 = r192442 <= r192443;
double r192445 = 0.5;
double r192446 = 2.0;
double r192447 = im;
double r192448 = 1.0;
double r192449 = pow(r192447, r192448);
double r192450 = -1.0;
double r192451 = r192450 * r192442;
double r192452 = r192451 - r192442;
double r192453 = r192452 / r192447;
double r192454 = r192449 / r192453;
double r192455 = r192446 * r192454;
double r192456 = sqrt(r192455);
double r192457 = r192445 * r192456;
double r192458 = 1.4937844730964523e-255;
bool r192459 = r192442 <= r192458;
double r192460 = fabs(r192447);
double r192461 = r192442 * r192442;
double r192462 = r192447 * r192447;
double r192463 = r192461 + r192462;
double r192464 = sqrt(r192463);
double r192465 = r192464 - r192442;
double r192466 = r192460 / r192465;
double r192467 = r192460 * r192466;
double r192468 = r192446 * r192467;
double r192469 = sqrt(r192468);
double r192470 = r192445 * r192469;
double r192471 = 2.37750825737912e+102;
bool r192472 = r192442 <= r192471;
double r192473 = log(r192464);
double r192474 = exp(r192473);
double r192475 = r192474 + r192442;
double r192476 = r192446 * r192475;
double r192477 = sqrt(r192476);
double r192478 = r192445 * r192477;
double r192479 = 2.0;
double r192480 = r192479 * r192442;
double r192481 = r192446 * r192480;
double r192482 = sqrt(r192481);
double r192483 = r192445 * r192482;
double r192484 = r192472 ? r192478 : r192483;
double r192485 = r192459 ? r192470 : r192484;
double r192486 = r192444 ? r192457 : r192485;
return r192486;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.8 |
| Herbie | 23.2 |
if re < -1.6813323895701712e+161Initial program 64.0
rmApplied flip-+64.0
Simplified51.6
rmApplied sqr-pow51.6
Applied associate-/l*51.2
Simplified51.2
Taylor expanded around -inf 23.4
if -1.6813323895701712e+161 < re < 1.4937844730964523e-255Initial program 38.9
rmApplied flip-+38.9
Simplified31.0
rmApplied *-un-lft-identity31.0
Applied add-sqr-sqrt31.0
Applied times-frac31.0
Simplified30.8
Simplified29.3
if 1.4937844730964523e-255 < re < 2.37750825737912e+102Initial program 19.3
rmApplied add-exp-log21.6
if 2.37750825737912e+102 < re Initial program 52.7
Taylor expanded around inf 10.4
Final simplification23.2
herbie shell --seed 2020060
(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)))))