\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 + \log \left(e^{\frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}}\right)\right)}\\
\end{array}double f(double p, double x) {
double r267833 = 0.5;
double r267834 = 1.0;
double r267835 = x;
double r267836 = 4.0;
double r267837 = p;
double r267838 = r267836 * r267837;
double r267839 = r267838 * r267837;
double r267840 = r267835 * r267835;
double r267841 = r267839 + r267840;
double r267842 = sqrt(r267841);
double r267843 = r267835 / r267842;
double r267844 = r267834 + r267843;
double r267845 = r267833 * r267844;
double r267846 = sqrt(r267845);
return r267846;
}
double f(double p, double x) {
double r267847 = x;
double r267848 = 4.0;
double r267849 = p;
double r267850 = r267848 * r267849;
double r267851 = r267850 * r267849;
double r267852 = r267847 * r267847;
double r267853 = r267851 + r267852;
double r267854 = sqrt(r267853);
double r267855 = r267847 / r267854;
double r267856 = -1.0;
bool r267857 = r267855 <= r267856;
double r267858 = 2.0;
double r267859 = sqrt(r267858);
double r267860 = 0.5;
double r267861 = sqrt(r267860);
double r267862 = r267859 * r267861;
double r267863 = log(r267862);
double r267864 = -1.0;
double r267865 = r267864 / r267847;
double r267866 = log(r267865);
double r267867 = r267863 + r267866;
double r267868 = r267864 / r267849;
double r267869 = log(r267868);
double r267870 = r267867 - r267869;
double r267871 = exp(r267870);
double r267872 = 1.0;
double r267873 = exp(r267855);
double r267874 = log(r267873);
double r267875 = r267872 + r267874;
double r267876 = r267860 * r267875;
double r267877 = sqrt(r267876);
double r267878 = r267857 ? r267871 : r267877;
return r267878;
}




Bits error versus p




Bits error versus x
Results
| Original | 13.6 |
|---|---|
| Target | 13.6 |
| Herbie | 8.4 |
if (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) < -1.0Initial program 54.4
rmApplied div-inv55.2
rmApplied add-log-exp55.2
rmApplied add-exp-log55.2
Taylor expanded around -inf 33.5
if -1.0 < (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) Initial program 0.2
rmApplied add-log-exp0.2
Final simplification8.4
herbie shell --seed 2020057
(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))))))))