\sqrt{0.5 \cdot \left(1 + \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}\right)}\begin{array}{l}
\mathbf{if}\;x \le -1.0089186447096822 \cdot 10^{+19}:\\
\;\;\;\;\sqrt{\frac{e^{\log \left(\frac{-1}{x}\right)} \cdot e^{\log \left(\frac{-1}{x}\right)}}{\frac{\frac{-1}{p} \cdot \frac{-1}{p}}{1.0}}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{{e}^{\left(\log \left(0.5 \cdot \frac{x}{\sqrt{x \cdot x + \left(p \cdot p\right) \cdot 4}} + 0.5\right)\right)}}\\
\end{array}double f(double p, double x) {
double r10732955 = 0.5;
double r10732956 = 1.0;
double r10732957 = x;
double r10732958 = 4.0;
double r10732959 = p;
double r10732960 = r10732958 * r10732959;
double r10732961 = r10732960 * r10732959;
double r10732962 = r10732957 * r10732957;
double r10732963 = r10732961 + r10732962;
double r10732964 = sqrt(r10732963);
double r10732965 = r10732957 / r10732964;
double r10732966 = r10732956 + r10732965;
double r10732967 = r10732955 * r10732966;
double r10732968 = sqrt(r10732967);
return r10732968;
}
double f(double p, double x) {
double r10732969 = x;
double r10732970 = -1.0089186447096822e+19;
bool r10732971 = r10732969 <= r10732970;
double r10732972 = -1.0;
double r10732973 = r10732972 / r10732969;
double r10732974 = log(r10732973);
double r10732975 = exp(r10732974);
double r10732976 = r10732975 * r10732975;
double r10732977 = p;
double r10732978 = r10732972 / r10732977;
double r10732979 = r10732978 * r10732978;
double r10732980 = 1.0;
double r10732981 = r10732979 / r10732980;
double r10732982 = r10732976 / r10732981;
double r10732983 = sqrt(r10732982);
double r10732984 = exp(1.0);
double r10732985 = 0.5;
double r10732986 = r10732969 * r10732969;
double r10732987 = r10732977 * r10732977;
double r10732988 = 4.0;
double r10732989 = r10732987 * r10732988;
double r10732990 = r10732986 + r10732989;
double r10732991 = sqrt(r10732990);
double r10732992 = r10732969 / r10732991;
double r10732993 = r10732985 * r10732992;
double r10732994 = r10732993 + r10732985;
double r10732995 = log(r10732994);
double r10732996 = pow(r10732984, r10732995);
double r10732997 = sqrt(r10732996);
double r10732998 = r10732971 ? r10732983 : r10732997;
return r10732998;
}




Bits error versus p




Bits error versus x
Results
| Original | 13.0 |
|---|---|
| Target | 13.0 |
| Herbie | 15.0 |
if x < -1.0089186447096822e+19Initial program 28.8
Simplified28.8
rmApplied add-exp-log28.8
rmApplied pow128.8
Applied log-pow28.8
Applied exp-prod28.8
Simplified28.8
Taylor expanded around -inf 50.1
Simplified38.2
if -1.0089186447096822e+19 < x Initial program 8.6
Simplified8.6
rmApplied add-exp-log8.6
rmApplied pow18.6
Applied log-pow8.6
Applied exp-prod8.6
Simplified8.6
Final simplification15.0
herbie shell --seed 2019151
(FPCore (p x)
:name "Given's Rotation SVD example"
:pre (< 1e-150 (fabs x) 1e+150)
:herbie-target
(sqrt (+ 1/2 (/ (copysign 1/2 x) (hypot 1 (/ (* 2 p) x)))))
(sqrt (* 0.5 (+ 1 (/ x (sqrt (+ (* (* 4 p) p) (* x x))))))))