\frac{\left(x - y\right) \cdot \left(x + y\right)}{x \cdot x + y \cdot y}\begin{array}{l}
\mathbf{if}\;y \le -1.8197648299093187 \cdot 10^{151}:\\
\;\;\;\;-1\\
\mathbf{elif}\;y \le -5.47427907991377714 \cdot 10^{-158} \lor \neg \left(y \le 6.0631474065678139 \cdot 10^{-172}\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 r82190 = x;
double r82191 = y;
double r82192 = r82190 - r82191;
double r82193 = r82190 + r82191;
double r82194 = r82192 * r82193;
double r82195 = r82190 * r82190;
double r82196 = r82191 * r82191;
double r82197 = r82195 + r82196;
double r82198 = r82194 / r82197;
return r82198;
}
double f(double x, double y) {
double r82199 = y;
double r82200 = -1.8197648299093187e+151;
bool r82201 = r82199 <= r82200;
double r82202 = -1.0;
double r82203 = -5.474279079913777e-158;
bool r82204 = r82199 <= r82203;
double r82205 = 6.063147406567814e-172;
bool r82206 = r82199 <= r82205;
double r82207 = !r82206;
bool r82208 = r82204 || r82207;
double r82209 = x;
double r82210 = r82209 - r82199;
double r82211 = r82209 + r82199;
double r82212 = r82210 * r82211;
double r82213 = r82209 * r82209;
double r82214 = r82199 * r82199;
double r82215 = r82213 + r82214;
double r82216 = r82212 / r82215;
double r82217 = 1.0;
double r82218 = r82208 ? r82216 : r82217;
double r82219 = r82201 ? r82202 : r82218;
return r82219;
}




Bits error versus x




Bits error versus y
Results
| Original | 20.6 |
|---|---|
| Target | 0.1 |
| Herbie | 5.2 |
if y < -1.8197648299093187e+151Initial program 62.9
Taylor expanded around 0 0
if -1.8197648299093187e+151 < y < -5.474279079913777e-158 or 6.063147406567814e-172 < y Initial program 0.6
if -5.474279079913777e-158 < y < 6.063147406567814e-172Initial program 30.8
Taylor expanded around inf 15.6
Final simplification5.2
herbie shell --seed 2019198
(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))))