0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -3.106642014201959 \cdot 10^{+51}:\\
\;\;\;\;\frac{\left|im\right| \cdot \sqrt{2.0}}{\sqrt{-2 \cdot re}} \cdot 0.5\\
\mathbf{elif}\;re \le -9.529220942855773 \cdot 10^{-250}:\\
\;\;\;\;\left(\left(\left|im\right| \cdot \sqrt{2.0}\right) \cdot \frac{1}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\right) \cdot 0.5\\
\mathbf{elif}\;re \le 1.3130508878524708 \cdot 10^{-291}:\\
\;\;\;\;\sqrt{\left(re + im\right) \cdot 2.0} \cdot 0.5\\
\mathbf{elif}\;re \le 3.4696741244957 \cdot 10^{+92}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(re + e^{\log \left(\sqrt{re \cdot re + im \cdot im}\right)}\right)} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r4202124 = 0.5;
double r4202125 = 2.0;
double r4202126 = re;
double r4202127 = r4202126 * r4202126;
double r4202128 = im;
double r4202129 = r4202128 * r4202128;
double r4202130 = r4202127 + r4202129;
double r4202131 = sqrt(r4202130);
double r4202132 = r4202131 + r4202126;
double r4202133 = r4202125 * r4202132;
double r4202134 = sqrt(r4202133);
double r4202135 = r4202124 * r4202134;
return r4202135;
}
double f(double re, double im) {
double r4202136 = re;
double r4202137 = -3.106642014201959e+51;
bool r4202138 = r4202136 <= r4202137;
double r4202139 = im;
double r4202140 = fabs(r4202139);
double r4202141 = 2.0;
double r4202142 = sqrt(r4202141);
double r4202143 = r4202140 * r4202142;
double r4202144 = -2.0;
double r4202145 = r4202144 * r4202136;
double r4202146 = sqrt(r4202145);
double r4202147 = r4202143 / r4202146;
double r4202148 = 0.5;
double r4202149 = r4202147 * r4202148;
double r4202150 = -9.529220942855773e-250;
bool r4202151 = r4202136 <= r4202150;
double r4202152 = 1.0;
double r4202153 = r4202136 * r4202136;
double r4202154 = r4202139 * r4202139;
double r4202155 = r4202153 + r4202154;
double r4202156 = sqrt(r4202155);
double r4202157 = r4202156 - r4202136;
double r4202158 = sqrt(r4202157);
double r4202159 = r4202152 / r4202158;
double r4202160 = r4202143 * r4202159;
double r4202161 = r4202160 * r4202148;
double r4202162 = 1.3130508878524708e-291;
bool r4202163 = r4202136 <= r4202162;
double r4202164 = r4202136 + r4202139;
double r4202165 = r4202164 * r4202141;
double r4202166 = sqrt(r4202165);
double r4202167 = r4202166 * r4202148;
double r4202168 = 3.4696741244957e+92;
bool r4202169 = r4202136 <= r4202168;
double r4202170 = log(r4202156);
double r4202171 = exp(r4202170);
double r4202172 = r4202136 + r4202171;
double r4202173 = r4202141 * r4202172;
double r4202174 = sqrt(r4202173);
double r4202175 = r4202174 * r4202148;
double r4202176 = r4202136 + r4202136;
double r4202177 = r4202141 * r4202176;
double r4202178 = sqrt(r4202177);
double r4202179 = r4202148 * r4202178;
double r4202180 = r4202169 ? r4202175 : r4202179;
double r4202181 = r4202163 ? r4202167 : r4202180;
double r4202182 = r4202151 ? r4202161 : r4202181;
double r4202183 = r4202138 ? r4202149 : r4202182;
return r4202183;
}




Bits error versus re




Bits error versus im
Results
| Original | 37.6 |
|---|---|
| Target | 32.5 |
| Herbie | 18.4 |
if re < -3.106642014201959e+51Initial program 57.3
rmApplied flip-+57.3
Applied associate-*r/57.3
Applied sqrt-div57.3
Simplified39.3
rmApplied sqrt-prod39.3
Simplified35.9
Taylor expanded around -inf 12.0
if -3.106642014201959e+51 < re < -9.529220942855773e-250Initial program 37.6
rmApplied flip-+37.5
Applied associate-*r/37.5
Applied sqrt-div37.7
Simplified30.3
rmApplied sqrt-prod30.4
Simplified20.0
rmApplied div-inv20.0
if -9.529220942855773e-250 < re < 1.3130508878524708e-291Initial program 31.6
Taylor expanded around 0 34.1
if 1.3130508878524708e-291 < re < 3.4696741244957e+92Initial program 19.9
rmApplied add-exp-log22.1
if 3.4696741244957e+92 < re Initial program 48.5
Taylor expanded around inf 11.8
Final simplification18.4
herbie shell --seed 2019154
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0) (* 0.5 (* (sqrt 2) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))