0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -5.3868507513807465 \cdot 10^{-10}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{0 + {im}^{2}}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{\sqrt{2}} \cdot \sqrt{\sqrt{2} \cdot \mathsf{fma}\left(\sqrt{1}, \mathsf{hypot}\left(re, im\right), re\right)}\right)\\
\end{array}double f(double re, double im) {
double r195803 = 0.5;
double r195804 = 2.0;
double r195805 = re;
double r195806 = r195805 * r195805;
double r195807 = im;
double r195808 = r195807 * r195807;
double r195809 = r195806 + r195808;
double r195810 = sqrt(r195809);
double r195811 = r195810 + r195805;
double r195812 = r195804 * r195811;
double r195813 = sqrt(r195812);
double r195814 = r195803 * r195813;
return r195814;
}
double f(double re, double im) {
double r195815 = re;
double r195816 = -5.386850751380747e-10;
bool r195817 = r195815 <= r195816;
double r195818 = 0.5;
double r195819 = 2.0;
double r195820 = 0.0;
double r195821 = im;
double r195822 = 2.0;
double r195823 = pow(r195821, r195822);
double r195824 = r195820 + r195823;
double r195825 = hypot(r195815, r195821);
double r195826 = r195825 - r195815;
double r195827 = r195824 / r195826;
double r195828 = r195819 * r195827;
double r195829 = sqrt(r195828);
double r195830 = r195818 * r195829;
double r195831 = sqrt(r195819);
double r195832 = sqrt(r195831);
double r195833 = 1.0;
double r195834 = sqrt(r195833);
double r195835 = fma(r195834, r195825, r195815);
double r195836 = r195831 * r195835;
double r195837 = sqrt(r195836);
double r195838 = r195832 * r195837;
double r195839 = r195818 * r195838;
double r195840 = r195817 ? r195830 : r195839;
return r195840;
}




Bits error versus re




Bits error versus im
| Original | 38.4 |
|---|---|
| Target | 33.2 |
| Herbie | 11.7 |
if re < -5.386850751380747e-10Initial program 56.4
rmApplied flip-+56.4
Simplified39.4
Simplified30.7
if -5.386850751380747e-10 < re Initial program 32.1
rmApplied *-un-lft-identity32.1
Applied sqrt-prod32.1
Simplified4.9
rmApplied sqrt-prod5.2
rmApplied add-sqr-sqrt5.2
Applied sqrt-prod5.4
Applied associate-*l*5.3
rmApplied sqrt-unprod5.1
Simplified5.1
Final simplification11.7
herbie shell --seed 2020100 +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)))))