0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -2.6219396713989246 \cdot 10^{+28}:\\
\;\;\;\;\frac{\sqrt{\left(im \cdot im\right) \cdot 2.0}}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}} \cdot 0.5\\
\mathbf{elif}\;re \le -3.0560575984185278 \cdot 10^{-28}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(im + re\right)} \cdot 0.5\\
\mathbf{elif}\;re \le -2.4751289839842727 \cdot 10^{-197}:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \frac{im \cdot im}{\sqrt{im \cdot im + re \cdot re} - re}}\\
\mathbf{elif}\;re \le -1.0467551994962917 \cdot 10^{-267}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(im + re\right)} \cdot 0.5\\
\mathbf{elif}\;re \le 9.007455771870733 \cdot 10^{+76}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0}} \cdot \sqrt{\sqrt{\left(re + \sqrt{im \cdot im + re \cdot re}\right) \cdot 2.0}}\right)\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\left(re + re\right) \cdot 2.0} \cdot 0.5\\
\end{array}double f(double re, double im) {
double r8470318 = 0.5;
double r8470319 = 2.0;
double r8470320 = re;
double r8470321 = r8470320 * r8470320;
double r8470322 = im;
double r8470323 = r8470322 * r8470322;
double r8470324 = r8470321 + r8470323;
double r8470325 = sqrt(r8470324);
double r8470326 = r8470325 + r8470320;
double r8470327 = r8470319 * r8470326;
double r8470328 = sqrt(r8470327);
double r8470329 = r8470318 * r8470328;
return r8470329;
}
double f(double re, double im) {
double r8470330 = re;
double r8470331 = -2.6219396713989246e+28;
bool r8470332 = r8470330 <= r8470331;
double r8470333 = im;
double r8470334 = r8470333 * r8470333;
double r8470335 = 2.0;
double r8470336 = r8470334 * r8470335;
double r8470337 = sqrt(r8470336);
double r8470338 = r8470330 * r8470330;
double r8470339 = r8470334 + r8470338;
double r8470340 = sqrt(r8470339);
double r8470341 = r8470340 - r8470330;
double r8470342 = sqrt(r8470341);
double r8470343 = r8470337 / r8470342;
double r8470344 = 0.5;
double r8470345 = r8470343 * r8470344;
double r8470346 = -3.0560575984185278e-28;
bool r8470347 = r8470330 <= r8470346;
double r8470348 = r8470333 + r8470330;
double r8470349 = r8470335 * r8470348;
double r8470350 = sqrt(r8470349);
double r8470351 = r8470350 * r8470344;
double r8470352 = -2.4751289839842727e-197;
bool r8470353 = r8470330 <= r8470352;
double r8470354 = r8470334 / r8470341;
double r8470355 = r8470335 * r8470354;
double r8470356 = sqrt(r8470355);
double r8470357 = r8470344 * r8470356;
double r8470358 = -1.0467551994962917e-267;
bool r8470359 = r8470330 <= r8470358;
double r8470360 = 9.007455771870733e+76;
bool r8470361 = r8470330 <= r8470360;
double r8470362 = r8470330 + r8470340;
double r8470363 = r8470362 * r8470335;
double r8470364 = sqrt(r8470363);
double r8470365 = sqrt(r8470364);
double r8470366 = r8470365 * r8470365;
double r8470367 = r8470344 * r8470366;
double r8470368 = r8470330 + r8470330;
double r8470369 = r8470368 * r8470335;
double r8470370 = sqrt(r8470369);
double r8470371 = r8470370 * r8470344;
double r8470372 = r8470361 ? r8470367 : r8470371;
double r8470373 = r8470359 ? r8470351 : r8470372;
double r8470374 = r8470353 ? r8470357 : r8470373;
double r8470375 = r8470347 ? r8470351 : r8470374;
double r8470376 = r8470332 ? r8470345 : r8470375;
return r8470376;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.5 |
|---|---|
| Target | 32.7 |
| Herbie | 26.9 |
if re < -2.6219396713989246e+28Initial program 56.5
rmApplied flip-+56.5
Applied associate-*r/56.5
Applied sqrt-div56.5
Simplified39.6
if -2.6219396713989246e+28 < re < -3.0560575984185278e-28 or -2.4751289839842727e-197 < re < -1.0467551994962917e-267Initial program 38.3
rmApplied add-cube-cbrt38.9
Taylor expanded around 0 40.8
if -3.0560575984185278e-28 < re < -2.4751289839842727e-197Initial program 33.3
rmApplied flip-+33.2
Simplified28.7
if -1.0467551994962917e-267 < re < 9.007455771870733e+76Initial program 21.4
rmApplied add-sqr-sqrt21.7
if 9.007455771870733e+76 < re Initial program 45.8
Taylor expanded around inf 12.0
Final simplification26.9
herbie shell --seed 2019162
(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)))))