\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 r278581 = 0.5;
double r278582 = 1.0;
double r278583 = x;
double r278584 = 4.0;
double r278585 = p;
double r278586 = r278584 * r278585;
double r278587 = r278586 * r278585;
double r278588 = r278583 * r278583;
double r278589 = r278587 + r278588;
double r278590 = sqrt(r278589);
double r278591 = r278583 / r278590;
double r278592 = r278582 + r278591;
double r278593 = r278581 * r278592;
double r278594 = sqrt(r278593);
return r278594;
}
double f(double p, double x) {
double r278595 = x;
double r278596 = 4.0;
double r278597 = p;
double r278598 = r278596 * r278597;
double r278599 = r278598 * r278597;
double r278600 = r278595 * r278595;
double r278601 = r278599 + r278600;
double r278602 = sqrt(r278601);
double r278603 = r278595 / r278602;
double r278604 = -1.0;
bool r278605 = r278603 <= r278604;
double r278606 = 2.0;
double r278607 = sqrt(r278606);
double r278608 = 0.5;
double r278609 = sqrt(r278608);
double r278610 = r278607 * r278609;
double r278611 = log(r278610);
double r278612 = -1.0;
double r278613 = r278612 / r278595;
double r278614 = log(r278613);
double r278615 = r278611 + r278614;
double r278616 = r278612 / r278597;
double r278617 = log(r278616);
double r278618 = r278615 - r278617;
double r278619 = exp(r278618);
double r278620 = 1.0;
double r278621 = r278620 + r278603;
double r278622 = r278608 * r278621;
double r278623 = sqrt(r278622);
double r278624 = r278605 ? r278619 : r278623;
return r278624;
}




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))))))))