0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -4.34046224677095251 \cdot 10^{149}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im + 0}{-2 \cdot re}}\\
\mathbf{elif}\;re \le -2.02785725229385748 \cdot 10^{-184}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \left|\frac{\left|im\right|}{\sqrt{\sqrt{re \cdot re + im \cdot im} + -1 \cdot re}}\right|\right)\\
\mathbf{elif}\;re \le -1.0150073241706023 \cdot 10^{-273}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\
\mathbf{elif}\;re \le 1.54087667976783686 \cdot 10^{126}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\end{array}double f(double re, double im) {
double r205128 = 0.5;
double r205129 = 2.0;
double r205130 = re;
double r205131 = r205130 * r205130;
double r205132 = im;
double r205133 = r205132 * r205132;
double r205134 = r205131 + r205133;
double r205135 = sqrt(r205134);
double r205136 = r205135 + r205130;
double r205137 = r205129 * r205136;
double r205138 = sqrt(r205137);
double r205139 = r205128 * r205138;
return r205139;
}
double f(double re, double im) {
double r205140 = re;
double r205141 = -4.3404622467709525e+149;
bool r205142 = r205140 <= r205141;
double r205143 = 0.5;
double r205144 = 2.0;
double r205145 = im;
double r205146 = r205145 * r205145;
double r205147 = 0.0;
double r205148 = r205146 + r205147;
double r205149 = -2.0;
double r205150 = r205149 * r205140;
double r205151 = r205148 / r205150;
double r205152 = r205144 * r205151;
double r205153 = sqrt(r205152);
double r205154 = r205143 * r205153;
double r205155 = -2.0278572522938575e-184;
bool r205156 = r205140 <= r205155;
double r205157 = sqrt(r205144);
double r205158 = fabs(r205145);
double r205159 = r205140 * r205140;
double r205160 = r205159 + r205146;
double r205161 = sqrt(r205160);
double r205162 = -1.0;
double r205163 = r205162 * r205140;
double r205164 = r205161 + r205163;
double r205165 = sqrt(r205164);
double r205166 = r205158 / r205165;
double r205167 = fabs(r205166);
double r205168 = r205157 * r205167;
double r205169 = r205143 * r205168;
double r205170 = -1.0150073241706023e-273;
bool r205171 = r205140 <= r205170;
double r205172 = r205145 + r205140;
double r205173 = r205144 * r205172;
double r205174 = sqrt(r205173);
double r205175 = r205143 * r205174;
double r205176 = 1.540876679767837e+126;
bool r205177 = r205140 <= r205176;
double r205178 = r205161 + r205140;
double r205179 = r205144 * r205178;
double r205180 = sqrt(r205179);
double r205181 = r205143 * r205180;
double r205182 = 2.0;
double r205183 = r205182 * r205140;
double r205184 = r205144 * r205183;
double r205185 = sqrt(r205184);
double r205186 = r205143 * r205185;
double r205187 = r205177 ? r205181 : r205186;
double r205188 = r205171 ? r205175 : r205187;
double r205189 = r205156 ? r205169 : r205188;
double r205190 = r205142 ? r205154 : r205189;
return r205190;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.7 |
|---|---|
| Target | 33.5 |
| Herbie | 21.0 |
if re < -4.3404622467709525e+149Initial program 63.8
rmApplied add-sqr-sqrt63.8
Applied sqrt-prod63.8
rmApplied flip-+63.8
Simplified51.1
Simplified51.1
Taylor expanded around -inf 31.5
if -4.3404622467709525e+149 < re < -2.0278572522938575e-184Initial program 41.4
rmApplied add-sqr-sqrt41.4
Applied sqrt-prod42.2
rmApplied flip-+42.2
Simplified28.2
Simplified28.1
rmApplied add-sqr-sqrt28.2
Applied add-sqr-sqrt28.2
Applied times-frac28.2
Simplified28.2
Simplified25.9
rmApplied sqrt-prod25.9
Simplified15.2
if -2.0278572522938575e-184 < re < -1.0150073241706023e-273Initial program 31.2
rmApplied add-sqr-sqrt31.2
Applied sqrt-prod31.4
Taylor expanded around 0 37.8
if -1.0150073241706023e-273 < re < 1.540876679767837e+126Initial program 22.3
if 1.540876679767837e+126 < re Initial program 56.8
Taylor expanded around inf 10.0
Final simplification21.0
herbie shell --seed 2020056
(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)))))