0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -9.189817498010996149444340978229122472326 \cdot 10^{168}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\mathsf{fma}\left(-1, re, \mathsf{hypot}\left(re, im\right)\right)}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{1} \cdot \mathsf{hypot}\left(re, im\right) + re\right)}\\
\end{array}double f(double re, double im) {
double r213821 = 0.5;
double r213822 = 2.0;
double r213823 = re;
double r213824 = r213823 * r213823;
double r213825 = im;
double r213826 = r213825 * r213825;
double r213827 = r213824 + r213826;
double r213828 = sqrt(r213827);
double r213829 = r213828 + r213823;
double r213830 = r213822 * r213829;
double r213831 = sqrt(r213830);
double r213832 = r213821 * r213831;
return r213832;
}
double f(double re, double im) {
double r213833 = re;
double r213834 = -9.189817498010996e+168;
bool r213835 = r213833 <= r213834;
double r213836 = 0.5;
double r213837 = 2.0;
double r213838 = im;
double r213839 = r213838 * r213838;
double r213840 = -1.0;
double r213841 = hypot(r213833, r213838);
double r213842 = fma(r213840, r213833, r213841);
double r213843 = r213839 / r213842;
double r213844 = r213837 * r213843;
double r213845 = sqrt(r213844);
double r213846 = r213836 * r213845;
double r213847 = 1.0;
double r213848 = sqrt(r213847);
double r213849 = r213848 * r213841;
double r213850 = r213849 + r213833;
double r213851 = r213837 * r213850;
double r213852 = sqrt(r213851);
double r213853 = r213836 * r213852;
double r213854 = r213835 ? r213846 : r213853;
return r213854;
}




Bits error versus re




Bits error versus im
| Original | 38.8 |
|---|---|
| Target | 33.8 |
| Herbie | 12.1 |
if re < -9.189817498010996e+168Initial program 64.0
rmApplied flip-+64.0
Simplified50.6
Simplified31.9
if -9.189817498010996e+168 < re Initial program 35.6
rmApplied *-un-lft-identity35.6
Applied sqrt-prod35.6
Simplified9.6
Final simplification12.1
herbie shell --seed 2019353 +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)))))