\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\begin{array}{l}
\mathbf{if}\;y \le -2.279730354411318047085995485446303040422 \cdot 10^{153}:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \le -1.503517045334009834542053854668863535885 \cdot 10^{-159} \lor \neg \left(y \le 4.121579147791191678316023927451779242359 \cdot 10^{-161}\right):\\
\;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\
\mathbf{else}:\\
\;\;\;\;1\\
\end{array}double f(double x, double y) {
double r87485 = x;
double r87486 = y;
double r87487 = r87485 - r87486;
double r87488 = r87485 + r87486;
double r87489 = r87487 * r87488;
double r87490 = r87485 * r87485;
double r87491 = r87486 * r87486;
double r87492 = r87490 + r87491;
double r87493 = r87489 / r87492;
return r87493;
}
double f(double x, double y) {
double r87494 = y;
double r87495 = -2.279730354411318e+153;
bool r87496 = r87494 <= r87495;
double r87497 = -1.0;
double r87498 = -1.5035170453340098e-159;
bool r87499 = r87494 <= r87498;
double r87500 = 4.121579147791192e-161;
bool r87501 = r87494 <= r87500;
double r87502 = !r87501;
bool r87503 = r87499 || r87502;
double r87504 = x;
double r87505 = r87504 - r87494;
double r87506 = r87504 + r87494;
double r87507 = r87505 * r87506;
double r87508 = r87504 * r87504;
double r87509 = r87494 * r87494;
double r87510 = r87508 + r87509;
double r87511 = r87507 / r87510;
double r87512 = 1.0;
double r87513 = r87503 ? r87511 : r87512;
double r87514 = r87496 ? r87497 : r87513;
return r87514;
}




Bits error versus x




Bits error versus y
Results
| Original | 20.0 |
|---|---|
| Target | 0.1 |
| Herbie | 5.5 |
if y < -2.279730354411318e+153Initial program 63.8
Taylor expanded around 0 0
if -2.279730354411318e+153 < y < -1.5035170453340098e-159 or 4.121579147791192e-161 < y Initial program 0.0
if -1.5035170453340098e-159 < y < 4.121579147791192e-161Initial program 30.5
Taylor expanded around inf 16.9
Final simplification5.5
herbie shell --seed 2019235
(FPCore (x y)
:name "Kahan p9 Example"
:precision binary64
:pre (and (< 0.0 x 1) (< y 1))
:herbie-target
(if (< 0.5 (fabs (/ x y)) 2) (/ (* (- x y) (+ x y)) (+ (* x x) (* y y))) (- 1 (/ 2 (+ 1 (* (/ x y) (/ x y))))))
(/ (* (- x y) (+ x y)) (+ (* x x) (* y y))))