0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -1.133313274499030129257633800115220556404 \cdot 10^{228} \lor \neg \left(re \le -9.345587729548567513972046947617561809913 \cdot 10^{128} \lor \neg \left(re \le -1.14256559511830479002291702476221749434 \cdot 10^{-14}\right)\right):\\
\;\;\;\;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(1 \cdot \left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right)\right)}\\
\end{array}double f(double re, double im) {
double r284157 = 0.5;
double r284158 = 2.0;
double r284159 = re;
double r284160 = r284159 * r284159;
double r284161 = im;
double r284162 = r284161 * r284161;
double r284163 = r284160 + r284162;
double r284164 = sqrt(r284163);
double r284165 = r284164 + r284159;
double r284166 = r284158 * r284165;
double r284167 = sqrt(r284166);
double r284168 = r284157 * r284167;
return r284168;
}
double f(double re, double im) {
double r284169 = re;
double r284170 = -1.1333132744990301e+228;
bool r284171 = r284169 <= r284170;
double r284172 = -9.345587729548568e+128;
bool r284173 = r284169 <= r284172;
double r284174 = -1.1425655951183048e-14;
bool r284175 = r284169 <= r284174;
double r284176 = !r284175;
bool r284177 = r284173 || r284176;
double r284178 = !r284177;
bool r284179 = r284171 || r284178;
double r284180 = 0.5;
double r284181 = 2.0;
double r284182 = im;
double r284183 = r284182 * r284182;
double r284184 = -1.0;
double r284185 = hypot(r284169, r284182);
double r284186 = fma(r284184, r284169, r284185);
double r284187 = r284183 / r284186;
double r284188 = r284181 * r284187;
double r284189 = sqrt(r284188);
double r284190 = r284180 * r284189;
double r284191 = 1.0;
double r284192 = sqrt(r284185);
double r284193 = r284192 * r284192;
double r284194 = r284169 + r284193;
double r284195 = r284191 * r284194;
double r284196 = r284181 * r284195;
double r284197 = sqrt(r284196);
double r284198 = r284180 * r284197;
double r284199 = r284179 ? r284190 : r284198;
return r284199;
}




Bits error versus re




Bits error versus im
| Original | 38.3 |
|---|---|
| Target | 33.3 |
| Herbie | 12.5 |
if re < -1.1333132744990301e+228 or -9.345587729548568e+128 < re < -1.1425655951183048e-14Initial program 54.4
rmApplied flip-+54.4
Simplified37.3
Simplified30.5
if -1.1333132744990301e+228 < re < -9.345587729548568e+128 or -1.1425655951183048e-14 < re Initial program 34.8
rmApplied *-un-lft-identity34.8
Applied *-un-lft-identity34.8
Applied distribute-lft-out34.8
Simplified8.0
rmApplied add-sqr-sqrt8.7
Final simplification12.5
herbie shell --seed 2019352 +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)))))