\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:\\
\;\;\;\;\sqrt{0.5 \cdot e^{2 \cdot \left(\log \left(\frac{-1}{x}\right) - \log \left(\frac{-1}{p}\right)\right) + \log 2}}\\
\mathbf{else}:\\
\;\;\;\;\sqrt{0.5 \cdot e^{\log \left(\sqrt{1 + \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}}\right) + \log \left(\sqrt{1 + \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}}\right)}}\\
\end{array}double f(double p, double x) {
double r270803 = 0.5;
double r270804 = 1.0;
double r270805 = x;
double r270806 = 4.0;
double r270807 = p;
double r270808 = r270806 * r270807;
double r270809 = r270808 * r270807;
double r270810 = r270805 * r270805;
double r270811 = r270809 + r270810;
double r270812 = sqrt(r270811);
double r270813 = r270805 / r270812;
double r270814 = r270804 + r270813;
double r270815 = r270803 * r270814;
double r270816 = sqrt(r270815);
return r270816;
}
double f(double p, double x) {
double r270817 = x;
double r270818 = 4.0;
double r270819 = p;
double r270820 = r270818 * r270819;
double r270821 = r270820 * r270819;
double r270822 = r270817 * r270817;
double r270823 = r270821 + r270822;
double r270824 = sqrt(r270823);
double r270825 = r270817 / r270824;
double r270826 = -1.0;
bool r270827 = r270825 <= r270826;
double r270828 = 0.5;
double r270829 = 2.0;
double r270830 = -1.0;
double r270831 = r270830 / r270817;
double r270832 = log(r270831);
double r270833 = r270830 / r270819;
double r270834 = log(r270833);
double r270835 = r270832 - r270834;
double r270836 = r270829 * r270835;
double r270837 = 2.0;
double r270838 = log(r270837);
double r270839 = r270836 + r270838;
double r270840 = exp(r270839);
double r270841 = r270828 * r270840;
double r270842 = sqrt(r270841);
double r270843 = 1.0;
double r270844 = r270843 + r270825;
double r270845 = sqrt(r270844);
double r270846 = log(r270845);
double r270847 = r270846 + r270846;
double r270848 = exp(r270847);
double r270849 = r270828 * r270848;
double r270850 = sqrt(r270849);
double r270851 = r270827 ? r270842 : r270850;
return r270851;
}




Bits error versus p




Bits error versus x
Results
| Original | 13.2 |
|---|---|
| Target | 13.2 |
| Herbie | 11.2 |
if (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) < -1.0Initial program 53.6
rmApplied add-exp-log53.6
Taylor expanded around -inf 45.4
Simplified45.4
if -1.0 < (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) Initial program 0.2
rmApplied add-exp-log0.2
rmApplied add-sqr-sqrt0.2
Applied log-prod0.2
Final simplification11.2
herbie shell --seed 2020081
(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))))))))