\frac{x + \frac{y \cdot z - x}{t \cdot z - x}}{x + 1}\frac{\mathsf{fma}\left(\frac{y}{t \cdot z - x}, z, x\right)}{1 + x} - \frac{x \cdot \frac{1}{t \cdot z - x}}{x + 1}double f(double x, double y, double z, double t) {
double r360964 = x;
double r360965 = y;
double r360966 = z;
double r360967 = r360965 * r360966;
double r360968 = r360967 - r360964;
double r360969 = t;
double r360970 = r360969 * r360966;
double r360971 = r360970 - r360964;
double r360972 = r360968 / r360971;
double r360973 = r360964 + r360972;
double r360974 = 1.0;
double r360975 = r360964 + r360974;
double r360976 = r360973 / r360975;
return r360976;
}
double f(double x, double y, double z, double t) {
double r360977 = y;
double r360978 = t;
double r360979 = z;
double r360980 = r360978 * r360979;
double r360981 = x;
double r360982 = r360980 - r360981;
double r360983 = r360977 / r360982;
double r360984 = fma(r360983, r360979, r360981);
double r360985 = 1.0;
double r360986 = r360985 + r360981;
double r360987 = r360984 / r360986;
double r360988 = 1.0;
double r360989 = r360988 / r360982;
double r360990 = r360981 * r360989;
double r360991 = r360981 + r360985;
double r360992 = r360990 / r360991;
double r360993 = r360987 - r360992;
return r360993;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 7.3 |
|---|---|
| Target | 0.3 |
| Herbie | 4.6 |
Initial program 7.3
rmApplied div-sub7.3
Applied associate-+r-7.3
Applied div-sub7.3
Simplified4.6
rmApplied div-inv4.6
Final simplification4.6
herbie shell --seed 2019325 +o rules:numerics
(FPCore (x y z t)
:name "Diagrams.Trail:splitAtParam from diagrams-lib-1.3.0.3, A"
:precision binary64
:herbie-target
(/ (+ x (- (/ y (- t (/ x z))) (/ x (- (* t z) x)))) (+ x 1))
(/ (+ x (/ (- (* y z) x) (- (* t z) x))) (+ x 1)))