\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\begin{array}{l}
\mathbf{if}\;y \le -1.42434775145189198 \cdot 10^{153}:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \le -2.34847619210042794 \cdot 10^{-141} \lor \neg \left(y \le 4.1321470702090296 \cdot 10^{-169}\right):\\
\;\;\;\;\frac{\mathsf{fma}\left(y, -y, x \cdot x\right)}{\mathsf{fma}\left(y, y, x \cdot x\right)}\\
\mathbf{else}:\\
\;\;\;\;1\\
\end{array}double f(double x, double y) {
double r44598 = x;
double r44599 = y;
double r44600 = r44598 - r44599;
double r44601 = r44598 + r44599;
double r44602 = r44600 * r44601;
double r44603 = r44598 * r44598;
double r44604 = r44599 * r44599;
double r44605 = r44603 + r44604;
double r44606 = r44602 / r44605;
return r44606;
}
double f(double x, double y) {
double r44607 = y;
double r44608 = -1.424347751451892e+153;
bool r44609 = r44607 <= r44608;
double r44610 = -1.0;
double r44611 = -2.348476192100428e-141;
bool r44612 = r44607 <= r44611;
double r44613 = 4.1321470702090296e-169;
bool r44614 = r44607 <= r44613;
double r44615 = !r44614;
bool r44616 = r44612 || r44615;
double r44617 = -r44607;
double r44618 = x;
double r44619 = r44618 * r44618;
double r44620 = fma(r44607, r44617, r44619);
double r44621 = fma(r44607, r44607, r44619);
double r44622 = r44620 / r44621;
double r44623 = 1.0;
double r44624 = r44616 ? r44622 : r44623;
double r44625 = r44609 ? r44610 : r44624;
return r44625;
}




Bits error versus x




Bits error versus y
| Original | 20.1 |
|---|---|
| Target | 0.1 |
| Herbie | 5.7 |
if y < -1.424347751451892e+153Initial program 63.8
Simplified63.8
Taylor expanded around inf 0
if -1.424347751451892e+153 < y < -2.348476192100428e-141 or 4.1321470702090296e-169 < y Initial program 0.5
Simplified0.5
Taylor expanded around 0 0.5
Simplified0.5
if -2.348476192100428e-141 < y < 4.1321470702090296e-169Initial program 27.8
Simplified27.8
Taylor expanded around 0 16.3
Final simplification5.7
herbie shell --seed 2019195 +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))))