\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, \left(\frac{1}{2} \cdot \left(z \cdot {y}^{2}\right)\right) \cdot \frac{1}{{1}^{2}}\right)\right) - t\right)double f(double x, double y, double z, double t) {
double r2280 = x;
double r2281 = y;
double r2282 = log(r2281);
double r2283 = r2280 * r2282;
double r2284 = z;
double r2285 = 1.0;
double r2286 = r2285 - r2281;
double r2287 = log(r2286);
double r2288 = r2284 * r2287;
double r2289 = r2283 + r2288;
double r2290 = t;
double r2291 = r2289 - r2290;
return r2291;
}
double f(double x, double y, double z, double t) {
double r2292 = y;
double r2293 = log(r2292);
double r2294 = x;
double r2295 = z;
double r2296 = 1.0;
double r2297 = log(r2296);
double r2298 = r2295 * r2292;
double r2299 = 0.5;
double r2300 = 2.0;
double r2301 = pow(r2292, r2300);
double r2302 = r2295 * r2301;
double r2303 = r2299 * r2302;
double r2304 = 1.0;
double r2305 = pow(r2296, r2300);
double r2306 = r2304 / r2305;
double r2307 = r2303 * r2306;
double r2308 = fma(r2296, r2298, r2307);
double r2309 = -r2308;
double r2310 = fma(r2295, r2297, r2309);
double r2311 = t;
double r2312 = r2310 - r2311;
double r2313 = fma(r2293, r2294, r2312);
return r2313;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 9.6 |
|---|---|
| Target | 0.3 |
| Herbie | 0.4 |
Initial program 9.6
Simplified9.6
Taylor expanded around 0 0.4
Simplified0.4
rmApplied div-inv0.4
Applied associate-*r*0.4
Final simplification0.4
herbie shell --seed 2020025 +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))