double code(double x, double y, double z) {
return ((double) (((double) (x * ((double) (y + z)))) / z));
}
double code(double x, double y, double z) {
double VAR;
if ((((double) (((double) (x * ((double) (y + z)))) / z)) <= -7.369010738208401e+305)) {
VAR = ((double) (x + ((double) (y * ((double) (x / z))))));
} else {
double VAR_1;
if ((((double) (((double) (x * ((double) (y + z)))) / z)) <= -2.481280597542769e-166)) {
VAR_1 = ((double) (x + ((double) (((double) (x * y)) * ((double) (1.0 / z))))));
} else {
double VAR_2;
if (((((double) (((double) (x * ((double) (y + z)))) / z)) <= 3.786775087893776e-303) || !(((double) (((double) (x * ((double) (y + z)))) / z)) <= 6.184206758893877e+287))) {
VAR_2 = ((double) (x + ((double) (x * ((double) (y / z))))));
} else {
VAR_2 = ((double) (((double) (x * ((double) (y + z)))) / z));
}
VAR_1 = VAR_2;
}
VAR = VAR_1;
}
return VAR;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 12.2 |
|---|---|
| Target | 3.3 |
| Herbie | 0.5 |
if (/ (* x (+ y z)) z) < -7.36901073820840088e305Initial program 63.0
Simplified0.5
rmApplied add-cube-cbrt0.7
Applied *-un-lft-identity0.7
Applied times-frac0.7
Applied associate-*r*0.6
Simplified0.6
Taylor expanded around 0 21.9
Simplified0.3
if -7.36901073820840088e305 < (/ (* x (+ y z)) z) < -2.48128059754276912e-166Initial program 0.5
Simplified4.9
rmApplied div-inv4.9
Applied associate-*r*0.4
if -2.48128059754276912e-166 < (/ (* x (+ y z)) z) < 3.78677508789377591e-303 or 6.1842067588938772e287 < (/ (* x (+ y z)) z) Initial program 37.8
Simplified0.9
if 3.78677508789377591e-303 < (/ (* x (+ y z)) z) < 6.1842067588938772e287Initial program 0.4
Final simplification0.5
herbie shell --seed 2020191
(FPCore (x y z)
:name "Numeric.SpecFunctions:choose from math-functions-0.1.5.2"
:precision binary64
:herbie-target
(/ x (/ z (+ y z)))
(/ (* x (+ y z)) z))