\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{1.0 \cdot \left(\frac{\frac{-1}{x}}{\frac{-1}{p}} \cdot \frac{\frac{-1}{x}}{\frac{-1}{p}}\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{\mathsf{fma}\left(x \cdot \frac{1}{\sqrt{\mathsf{fma}\left(p, 4 \cdot p, x \cdot x\right)}}, 0.5, 0.5\right)}\\
\end{array}double f(double p, double x) {
double r7731911 = 0.5;
double r7731912 = 1.0;
double r7731913 = x;
double r7731914 = 4.0;
double r7731915 = p;
double r7731916 = r7731914 * r7731915;
double r7731917 = r7731916 * r7731915;
double r7731918 = r7731913 * r7731913;
double r7731919 = r7731917 + r7731918;
double r7731920 = sqrt(r7731919);
double r7731921 = r7731913 / r7731920;
double r7731922 = r7731912 + r7731921;
double r7731923 = r7731911 * r7731922;
double r7731924 = sqrt(r7731923);
return r7731924;
}
double f(double p, double x) {
double r7731925 = x;
double r7731926 = -1.0089186447096822e+19;
bool r7731927 = r7731925 <= r7731926;
double r7731928 = 1.0;
double r7731929 = -1.0;
double r7731930 = r7731929 / r7731925;
double r7731931 = p;
double r7731932 = r7731929 / r7731931;
double r7731933 = r7731930 / r7731932;
double r7731934 = r7731933 * r7731933;
double r7731935 = r7731928 * r7731934;
double r7731936 = sqrt(r7731935);
double r7731937 = 1.0;
double r7731938 = 4.0;
double r7731939 = r7731938 * r7731931;
double r7731940 = r7731925 * r7731925;
double r7731941 = fma(r7731931, r7731939, r7731940);
double r7731942 = sqrt(r7731941);
double r7731943 = r7731937 / r7731942;
double r7731944 = r7731925 * r7731943;
double r7731945 = 0.5;
double r7731946 = fma(r7731944, r7731945, r7731945);
double r7731947 = sqrt(r7731946);
double r7731948 = r7731927 ? r7731936 : r7731947;
return r7731948;
}




Bits error versus p




Bits error versus x
| Original | 13.0 |
|---|---|
| Target | 13.0 |
| Herbie | 14.7 |
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
Simplified36.9
if -1.0089186447096822e+19 < x Initial program 8.6
Simplified8.6
rmApplied div-inv8.6
Final simplification14.7
herbie shell --seed 2019151 +o rules:numerics
(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))))))))