\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.1238977166951507 \cdot 10^{-10}:\\
\;\;\;\;\frac{\sqrt{0.5 \cdot \left(1 \cdot 1 - \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}} \cdot \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}\right)}}{\sqrt{1 - \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}}}\\
\mathbf{else}:\\
\;\;\;\;\log \left(e^{\sqrt{0.5 \cdot \left(1 + \frac{x}{\sqrt{\left(\sqrt[3]{\left(4 \cdot p\right) \cdot p + x \cdot x} \cdot \sqrt[3]{\left(4 \cdot p\right) \cdot p + x \cdot x}\right) \cdot \sqrt[3]{\left(4 \cdot p\right) \cdot p + x \cdot x}}}\right)}}\right)\\
\end{array}double f(double p, double x) {
double r374997 = 0.5;
double r374998 = 1.0;
double r374999 = x;
double r375000 = 4.0;
double r375001 = p;
double r375002 = r375000 * r375001;
double r375003 = r375002 * r375001;
double r375004 = r374999 * r374999;
double r375005 = r375003 + r375004;
double r375006 = sqrt(r375005);
double r375007 = r374999 / r375006;
double r375008 = r374998 + r375007;
double r375009 = r374997 * r375008;
double r375010 = sqrt(r375009);
return r375010;
}
double f(double p, double x) {
double r375011 = x;
double r375012 = 4.0;
double r375013 = p;
double r375014 = r375012 * r375013;
double r375015 = r375014 * r375013;
double r375016 = r375011 * r375011;
double r375017 = r375015 + r375016;
double r375018 = sqrt(r375017);
double r375019 = r375011 / r375018;
double r375020 = 1.1238977166951507e-10;
bool r375021 = r375019 <= r375020;
double r375022 = 0.5;
double r375023 = 1.0;
double r375024 = r375023 * r375023;
double r375025 = r375019 * r375019;
double r375026 = r375024 - r375025;
double r375027 = r375022 * r375026;
double r375028 = sqrt(r375027);
double r375029 = r375023 - r375019;
double r375030 = sqrt(r375029);
double r375031 = r375028 / r375030;
double r375032 = cbrt(r375017);
double r375033 = r375032 * r375032;
double r375034 = r375033 * r375032;
double r375035 = sqrt(r375034);
double r375036 = r375011 / r375035;
double r375037 = r375023 + r375036;
double r375038 = r375022 * r375037;
double r375039 = sqrt(r375038);
double r375040 = exp(r375039);
double r375041 = log(r375040);
double r375042 = r375021 ? r375031 : r375041;
return r375042;
}




Bits error versus p




Bits error versus x
Results
| Original | 13.2 |
|---|---|
| Target | 13.2 |
| Herbie | 13.2 |
if (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) < 1.1238977166951507e-10Initial program 18.0
rmApplied flip-+18.0
Applied associate-*r/18.0
Applied sqrt-div18.0
if 1.1238977166951507e-10 < (/ x (sqrt (+ (* (* 4.0 p) p) (* x x)))) Initial program 0.0
rmApplied add-log-exp0.0
rmApplied add-cube-cbrt0.0
Final simplification13.2
herbie shell --seed 2020056 +o rules:numerics
(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))))))))