\frac{x \cdot \left(y + z\right)}{z}\begin{array}{l}
\mathbf{if}\;z \le -1.244096151631290896943813259882212972022 \cdot 10^{-205}:\\
\;\;\;\;x \cdot \left(\frac{y}{z} + 1\right)\\
\mathbf{elif}\;z \le 1.123685082691174413471401852132580668372 \cdot 10^{-120}:\\
\;\;\;\;\frac{1}{z} \cdot \left(x \cdot \left(z + y\right)\right)\\
\mathbf{else}:\\
\;\;\;\;x \cdot \left(\frac{y}{z} + 1\right)\\
\end{array}double f(double x, double y, double z) {
double r20566996 = x;
double r20566997 = y;
double r20566998 = z;
double r20566999 = r20566997 + r20566998;
double r20567000 = r20566996 * r20566999;
double r20567001 = r20567000 / r20566998;
return r20567001;
}
double f(double x, double y, double z) {
double r20567002 = z;
double r20567003 = -1.244096151631291e-205;
bool r20567004 = r20567002 <= r20567003;
double r20567005 = x;
double r20567006 = y;
double r20567007 = r20567006 / r20567002;
double r20567008 = 1.0;
double r20567009 = r20567007 + r20567008;
double r20567010 = r20567005 * r20567009;
double r20567011 = 1.1236850826911744e-120;
bool r20567012 = r20567002 <= r20567011;
double r20567013 = r20567008 / r20567002;
double r20567014 = r20567002 + r20567006;
double r20567015 = r20567005 * r20567014;
double r20567016 = r20567013 * r20567015;
double r20567017 = r20567012 ? r20567016 : r20567010;
double r20567018 = r20567004 ? r20567010 : r20567017;
return r20567018;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 12.6 |
|---|---|
| Target | 3.1 |
| Herbie | 3.0 |
if z < -1.244096151631291e-205 or 1.1236850826911744e-120 < z Initial program 13.1
rmApplied *-un-lft-identity13.1
Applied times-frac1.5
Simplified1.5
Taylor expanded around 0 1.5
if -1.244096151631291e-205 < z < 1.1236850826911744e-120Initial program 10.2
rmApplied div-inv10.4
Final simplification3.0
herbie shell --seed 2019170
(FPCore (x y z)
:name "Numeric.SpecFunctions:choose from math-functions-0.1.5.2"
:herbie-target
(/ x (/ z (+ y z)))
(/ (* x (+ y z)) z))