\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\begin{array}{l}
\mathbf{if}\;y \le -1.66952962063310841 \cdot 10^{152}:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \le -4.28774228849345812 \cdot 10^{-158}:\\
\;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\
\mathbf{elif}\;y \le 2.9977670369096852 \cdot 10^{-162}:\\
\;\;\;\;1\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\\
\end{array}double f(double x, double y) {
double r77484 = x;
double r77485 = y;
double r77486 = r77484 - r77485;
double r77487 = r77484 + r77485;
double r77488 = r77486 * r77487;
double r77489 = r77484 * r77484;
double r77490 = r77485 * r77485;
double r77491 = r77489 + r77490;
double r77492 = r77488 / r77491;
return r77492;
}
double f(double x, double y) {
double r77493 = y;
double r77494 = -1.6695296206331084e+152;
bool r77495 = r77493 <= r77494;
double r77496 = -1.0;
double r77497 = -4.287742288493458e-158;
bool r77498 = r77493 <= r77497;
double r77499 = x;
double r77500 = r77499 - r77493;
double r77501 = r77499 + r77493;
double r77502 = r77500 * r77501;
double r77503 = r77499 * r77499;
double r77504 = r77493 * r77493;
double r77505 = r77503 + r77504;
double r77506 = r77502 / r77505;
double r77507 = 2.997767036909685e-162;
bool r77508 = r77493 <= r77507;
double r77509 = 1.0;
double r77510 = r77508 ? r77509 : r77506;
double r77511 = r77498 ? r77506 : r77510;
double r77512 = r77495 ? r77496 : r77511;
return r77512;
}




Bits error versus x




Bits error versus y
Results
| Original | 20.0 |
|---|---|
| Target | 0.1 |
| Herbie | 5.1 |
if y < -1.6695296206331084e+152Initial program 63.3
Taylor expanded around 0 0
if -1.6695296206331084e+152 < y < -4.287742288493458e-158 or 2.997767036909685e-162 < y Initial program 0.0
if -4.287742288493458e-158 < y < 2.997767036909685e-162Initial program 30.2
Taylor expanded around inf 16.1
Final simplification5.1
herbie shell --seed 2020018
(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))))