0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -1.726682013999257258829855908722105649883 \cdot 10^{170}:\\
\;\;\;\;0.5 \cdot \sqrt{e^{\log \left(\mathsf{hypot}\left(re, im\right) + re\right)} \cdot 2}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot 2}\\
\end{array}double f(double re, double im) {
double r197460 = 0.5;
double r197461 = 2.0;
double r197462 = re;
double r197463 = r197462 * r197462;
double r197464 = im;
double r197465 = r197464 * r197464;
double r197466 = r197463 + r197465;
double r197467 = sqrt(r197466);
double r197468 = r197467 + r197462;
double r197469 = r197461 * r197468;
double r197470 = sqrt(r197469);
double r197471 = r197460 * r197470;
return r197471;
}
double f(double re, double im) {
double r197472 = re;
double r197473 = -1.7266820139992573e+170;
bool r197474 = r197472 <= r197473;
double r197475 = 0.5;
double r197476 = im;
double r197477 = hypot(r197472, r197476);
double r197478 = r197477 + r197472;
double r197479 = log(r197478);
double r197480 = exp(r197479);
double r197481 = 2.0;
double r197482 = r197480 * r197481;
double r197483 = sqrt(r197482);
double r197484 = r197475 * r197483;
double r197485 = sqrt(r197477);
double r197486 = r197485 * r197485;
double r197487 = r197472 + r197486;
double r197488 = r197487 * r197481;
double r197489 = sqrt(r197488);
double r197490 = r197475 * r197489;
double r197491 = r197474 ? r197484 : r197490;
return r197491;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.7 |
|---|---|
| Target | 34.0 |
| Herbie | 13.7 |
if re < -1.7266820139992573e+170Initial program 64.0
Simplified42.2
rmApplied add-sqr-sqrt48.4
rmApplied add-exp-log49.1
Simplified42.9
if -1.7266820139992573e+170 < re Initial program 35.5
Simplified9.4
rmApplied add-sqr-sqrt10.0
Final simplification13.7
herbie shell --seed 2019304 +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)))))