\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}\;\frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}} \le -1:\\
\;\;\;\;e^{\left(\log \left(\sqrt{2} \cdot \sqrt{0.5}\right) + \log \left(\frac{-1}{x}\right)\right) - \log \left(\frac{-1}{p}\right)}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{0.5 \cdot \left(1 + \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}\right)}\\
\end{array}double f(double p, double x) {
double r272678 = 0.5;
double r272679 = 1.0;
double r272680 = x;
double r272681 = 4.0;
double r272682 = p;
double r272683 = r272681 * r272682;
double r272684 = r272683 * r272682;
double r272685 = r272680 * r272680;
double r272686 = r272684 + r272685;
double r272687 = sqrt(r272686);
double r272688 = r272680 / r272687;
double r272689 = r272679 + r272688;
double r272690 = r272678 * r272689;
double r272691 = sqrt(r272690);
return r272691;
}
double f(double p, double x) {
double r272692 = x;
double r272693 = 4.0;
double r272694 = p;
double r272695 = r272693 * r272694;
double r272696 = r272695 * r272694;
double r272697 = r272692 * r272692;
double r272698 = r272696 + r272697;
double r272699 = sqrt(r272698);
double r272700 = r272692 / r272699;
double r272701 = -1.0;
bool r272702 = r272700 <= r272701;
double r272703 = 2.0;
double r272704 = sqrt(r272703);
double r272705 = 0.5;
double r272706 = sqrt(r272705);
double r272707 = r272704 * r272706;
double r272708 = log(r272707);
double r272709 = -1.0;
double r272710 = r272709 / r272692;
double r272711 = log(r272710);
double r272712 = r272708 + r272711;
double r272713 = r272709 / r272694;
double r272714 = log(r272713);
double r272715 = r272712 - r272714;
double r272716 = exp(r272715);
double r272717 = 1.0;
double r272718 = r272717 + r272700;
double r272719 = r272705 * r272718;
double r272720 = sqrt(r272719);
double r272721 = r272702 ? r272716 : r272720;
return r272721;
}




Bits error versus p




Bits error versus x
Results
| Original | 13.6 |
|---|---|
| Target | 13.6 |
| Herbie | 8.9 |
if (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) < -1.0Initial program 54.5
rmApplied div-inv55.4
rmApplied add-log-exp55.4
rmApplied add-exp-log55.4
Taylor expanded around -inf 35.5
if -1.0 < (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) Initial program 0.2
Final simplification8.9
herbie shell --seed 2020062
(FPCore (p x)
:name "Given's Rotation SVD example"
:precision binary64
:pre (< 1e-150 (fabs x) 1e+150)
:herbie-target
(sqrt (+ 0.5 (/ (copysign 0.5 x) (hypot 1 (/ (* 2 p) x)))))
(sqrt (* 0.5 (+ 1 (/ x (sqrt (+ (* (* 4 p) p) (* x x))))))))