\left(x \cdot \log y + z \cdot \log \left(1 - y\right)\right) - t
\mathsf{fma}\left(\log y, x, \mathsf{fma}\left(z, \log 1, -\mathsf{fma}\left(1, z \cdot y, \frac{1}{2} \cdot \frac{z \cdot {y}^{2}}{{1}^{2}}\right)\right) - t\right)double f(double x, double y, double z, double t) {
double r501754 = x;
double r501755 = y;
double r501756 = log(r501755);
double r501757 = r501754 * r501756;
double r501758 = z;
double r501759 = 1.0;
double r501760 = r501759 - r501755;
double r501761 = log(r501760);
double r501762 = r501758 * r501761;
double r501763 = r501757 + r501762;
double r501764 = t;
double r501765 = r501763 - r501764;
return r501765;
}
double f(double x, double y, double z, double t) {
double r501766 = y;
double r501767 = log(r501766);
double r501768 = x;
double r501769 = z;
double r501770 = 1.0;
double r501771 = log(r501770);
double r501772 = r501769 * r501766;
double r501773 = 0.5;
double r501774 = 2.0;
double r501775 = pow(r501766, r501774);
double r501776 = r501769 * r501775;
double r501777 = pow(r501770, r501774);
double r501778 = r501776 / r501777;
double r501779 = r501773 * r501778;
double r501780 = fma(r501770, r501772, r501779);
double r501781 = -r501780;
double r501782 = fma(r501769, r501771, r501781);
double r501783 = t;
double r501784 = r501782 - r501783;
double r501785 = fma(r501767, r501768, r501784);
return r501785;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 9.6 |
|---|---|
| Target | 0.3 |
| Herbie | 0.3 |
Initial program 9.6
Simplified9.6
Taylor expanded around 0 0.3
Simplified0.3
Final simplification0.3
herbie shell --seed 2020024 +o rules:numerics
(FPCore (x y z t)
:name "Numeric.SpecFunctions:invIncompleteBetaWorker from math-functions-0.1.5.2, B"
:precision binary64
:herbie-target
(- (* (- z) (+ (+ (* 0.5 (* y y)) y) (* (/ 0.3333333333333333 (* 1 (* 1 1))) (* y (* y y))))) (- t (* x (log y))))
(- (+ (* x (log y)) (* z (log (- 1 y)))) t))