\sqrt{0.5 \cdot \left(1.0 + \frac{x}{\sqrt{\left(4.0 \cdot p\right) \cdot p + x \cdot x}}\right)}\begin{array}{l}
\mathbf{if}\;x \le -6278403065.98233:\\
\;\;\;\;\sqrt{0.5 \cdot \frac{1.0 \cdot 1.0 - \frac{x}{\sqrt{x \cdot x + p \cdot \left(p \cdot 4.0\right)}} \cdot \frac{x}{\sqrt{x \cdot x + p \cdot \left(p \cdot 4.0\right)}}}{1.0 - \frac{x}{\sqrt{x \cdot x + p \cdot \left(p \cdot 4.0\right)}}}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{0.5 \cdot \left(1.0 + \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \frac{\sqrt[3]{x}}{\sqrt{\mathsf{fma}\left(p, p \cdot 4.0, x \cdot x\right)}}\right)}\\
\end{array}double f(double p, double x) {
double r8932961 = 0.5;
double r8932962 = 1.0;
double r8932963 = x;
double r8932964 = 4.0;
double r8932965 = p;
double r8932966 = r8932964 * r8932965;
double r8932967 = r8932966 * r8932965;
double r8932968 = r8932963 * r8932963;
double r8932969 = r8932967 + r8932968;
double r8932970 = sqrt(r8932969);
double r8932971 = r8932963 / r8932970;
double r8932972 = r8932962 + r8932971;
double r8932973 = r8932961 * r8932972;
double r8932974 = sqrt(r8932973);
return r8932974;
}
double f(double p, double x) {
double r8932975 = x;
double r8932976 = -6278403065.98233;
bool r8932977 = r8932975 <= r8932976;
double r8932978 = 0.5;
double r8932979 = 1.0;
double r8932980 = r8932979 * r8932979;
double r8932981 = r8932975 * r8932975;
double r8932982 = p;
double r8932983 = 4.0;
double r8932984 = r8932982 * r8932983;
double r8932985 = r8932982 * r8932984;
double r8932986 = r8932981 + r8932985;
double r8932987 = sqrt(r8932986);
double r8932988 = r8932975 / r8932987;
double r8932989 = r8932988 * r8932988;
double r8932990 = r8932980 - r8932989;
double r8932991 = r8932979 - r8932988;
double r8932992 = r8932990 / r8932991;
double r8932993 = r8932978 * r8932992;
double r8932994 = sqrt(r8932993);
double r8932995 = cbrt(r8932975);
double r8932996 = r8932995 * r8932995;
double r8932997 = fma(r8932982, r8932984, r8932981);
double r8932998 = sqrt(r8932997);
double r8932999 = r8932995 / r8932998;
double r8933000 = r8932996 * r8932999;
double r8933001 = r8932979 + r8933000;
double r8933002 = r8932978 * r8933001;
double r8933003 = sqrt(r8933002);
double r8933004 = r8932977 ? r8932994 : r8933003;
return r8933004;
}




Bits error versus p




Bits error versus x
| Original | 13.3 |
|---|---|
| Target | 13.3 |
| Herbie | 13.5 |
if x < -6278403065.98233Initial program 30.3
rmApplied flip-+30.3
if -6278403065.98233 < x Initial program 8.2
rmApplied *-un-lft-identity8.2
Applied sqrt-prod8.2
Applied add-cube-cbrt8.4
Applied times-frac8.4
Simplified8.4
Simplified8.4
Final simplification13.5
herbie shell --seed 2019165 +o rules:numerics
(FPCore (p x)
:name "Given's Rotation SVD example"
:pre (< 1e-150 (fabs x) 1e+150)
:herbie-target
(sqrt (+ 0.5 (/ (copysign 0.5 x) (hypot 1.0 (/ (* 2.0 p) x)))))
(sqrt (* 0.5 (+ 1.0 (/ x (sqrt (+ (* (* 4.0 p) p) (* x x))))))))