0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -0.4962378853117394:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{0 + {im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\sqrt{1} \cdot \mathsf{hypot}\left(re, im\right) + re}\right)\\
\end{array}double f(double re, double im) {
double r231561 = 0.5;
double r231562 = 2.0;
double r231563 = re;
double r231564 = r231563 * r231563;
double r231565 = im;
double r231566 = r231565 * r231565;
double r231567 = r231564 + r231566;
double r231568 = sqrt(r231567);
double r231569 = r231568 + r231563;
double r231570 = r231562 * r231569;
double r231571 = sqrt(r231570);
double r231572 = r231561 * r231571;
return r231572;
}
double f(double re, double im) {
double r231573 = re;
double r231574 = -0.4962378853117394;
bool r231575 = r231573 <= r231574;
double r231576 = 0.5;
double r231577 = 2.0;
double r231578 = 0.0;
double r231579 = im;
double r231580 = 2.0;
double r231581 = pow(r231579, r231580);
double r231582 = r231578 + r231581;
double r231583 = hypot(r231573, r231579);
double r231584 = r231583 - r231573;
double r231585 = r231582 / r231584;
double r231586 = r231577 * r231585;
double r231587 = sqrt(r231586);
double r231588 = r231576 * r231587;
double r231589 = sqrt(r231577);
double r231590 = 1.0;
double r231591 = sqrt(r231590);
double r231592 = r231591 * r231583;
double r231593 = r231592 + r231573;
double r231594 = sqrt(r231593);
double r231595 = r231589 * r231594;
double r231596 = r231576 * r231595;
double r231597 = r231575 ? r231588 : r231596;
return r231597;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.1 |
| Herbie | 11.6 |
if re < -0.4962378853117394Initial program 57.4
rmApplied flip-+57.4
Simplified39.6
Simplified30.3
if -0.4962378853117394 < re Initial program 32.2
rmApplied *-un-lft-identity32.2
Applied sqrt-prod32.2
Simplified5.0
rmApplied sqrt-prod5.3
Final simplification11.6
herbie shell --seed 2020065 +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)))))