\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\begin{array}{l}
\mathbf{if}\;y \le -2.92690375472246175352160983946616260701 \cdot 10^{-134}:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \le 5.816163962969591972156246782697755183642 \cdot 10^{-162}:\\
\;\;\;\;1\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(y + x\right) \cdot \left(x - y\right)}{\mathsf{fma}\left(x, x, y \cdot y\right)}\\
\end{array}double f(double x, double y) {
double r4075125 = x;
double r4075126 = y;
double r4075127 = r4075125 - r4075126;
double r4075128 = r4075125 + r4075126;
double r4075129 = r4075127 * r4075128;
double r4075130 = r4075125 * r4075125;
double r4075131 = r4075126 * r4075126;
double r4075132 = r4075130 + r4075131;
double r4075133 = r4075129 / r4075132;
return r4075133;
}
double f(double x, double y) {
double r4075134 = y;
double r4075135 = -2.9269037547224618e-134;
bool r4075136 = r4075134 <= r4075135;
double r4075137 = -1.0;
double r4075138 = 5.816163962969592e-162;
bool r4075139 = r4075134 <= r4075138;
double r4075140 = 1.0;
double r4075141 = x;
double r4075142 = r4075134 + r4075141;
double r4075143 = r4075141 - r4075134;
double r4075144 = r4075142 * r4075143;
double r4075145 = r4075134 * r4075134;
double r4075146 = fma(r4075141, r4075141, r4075145);
double r4075147 = r4075144 / r4075146;
double r4075148 = r4075139 ? r4075140 : r4075147;
double r4075149 = r4075136 ? r4075137 : r4075148;
return r4075149;
}




Bits error versus x




Bits error versus y
| Original | 20.0 |
|---|---|
| Target | 0.1 |
| Herbie | 8.0 |
if y < -2.9269037547224618e-134Initial program 22.1
Simplified22.1
Taylor expanded around 0 4.2
if -2.9269037547224618e-134 < y < 5.816163962969592e-162Initial program 27.2
Simplified27.2
Taylor expanded around inf 17.2
if 5.816163962969592e-162 < y Initial program 0.0
Simplified0.0
Final simplification8.0
herbie shell --seed 2019192 +o rules:numerics
(FPCore (x y)
:name "Kahan p9 Example"
:pre (and (< 0.0 x 1.0) (< y 1.0))
:herbie-target
(if (< 0.5 (fabs (/ x y)) 2.0) (/ (* (- x y) (+ x y)) (+ (* x x) (* y y))) (- 1.0 (/ 2.0 (+ 1.0 (* (/ x y) (/ x y))))))
(/ (* (- x y) (+ x y)) (+ (* x x) (* y y))))