x + \frac{e^{y \cdot \log \left(\frac{y}{z + y}\right)}}{y}\begin{array}{l}
\mathbf{if}\;\frac{e^{y \cdot \log \left(\frac{y}{z + y}\right)}}{y} = -\infty \lor \neg \left(\frac{e^{y \cdot \log \left(\frac{y}{z + y}\right)}}{y} \le -6.1512673171776875 \cdot 10^{-275} \lor \neg \left(\frac{e^{y \cdot \log \left(\frac{y}{z + y}\right)}}{y} \le -0.0\right)\right):\\
\;\;\;\;x + \frac{e^{y \cdot \left(2 \cdot \log \left(\frac{\sqrt[3]{\sqrt[3]{y} \cdot \sqrt[3]{y}} \cdot \sqrt[3]{\sqrt[3]{y}}}{\sqrt[3]{z + y}}\right)\right) + y \cdot \log \left(\frac{\sqrt[3]{y}}{\sqrt[3]{z + y}}\right)}}{y}\\
\mathbf{else}:\\
\;\;\;\;x + \frac{e^{y \cdot \log \left(\frac{y}{z + y}\right)}}{y}\\
\end{array}double f(double x, double y, double z) {
double r612298 = x;
double r612299 = y;
double r612300 = z;
double r612301 = r612300 + r612299;
double r612302 = r612299 / r612301;
double r612303 = log(r612302);
double r612304 = r612299 * r612303;
double r612305 = exp(r612304);
double r612306 = r612305 / r612299;
double r612307 = r612298 + r612306;
return r612307;
}
double f(double x, double y, double z) {
double r612308 = y;
double r612309 = z;
double r612310 = r612309 + r612308;
double r612311 = r612308 / r612310;
double r612312 = log(r612311);
double r612313 = r612308 * r612312;
double r612314 = exp(r612313);
double r612315 = r612314 / r612308;
double r612316 = -inf.0;
bool r612317 = r612315 <= r612316;
double r612318 = -6.151267317177687e-275;
bool r612319 = r612315 <= r612318;
double r612320 = -0.0;
bool r612321 = r612315 <= r612320;
double r612322 = !r612321;
bool r612323 = r612319 || r612322;
double r612324 = !r612323;
bool r612325 = r612317 || r612324;
double r612326 = x;
double r612327 = 2.0;
double r612328 = cbrt(r612308);
double r612329 = r612328 * r612328;
double r612330 = cbrt(r612329);
double r612331 = cbrt(r612328);
double r612332 = r612330 * r612331;
double r612333 = cbrt(r612310);
double r612334 = r612332 / r612333;
double r612335 = log(r612334);
double r612336 = r612327 * r612335;
double r612337 = r612308 * r612336;
double r612338 = r612328 / r612333;
double r612339 = log(r612338);
double r612340 = r612308 * r612339;
double r612341 = r612337 + r612340;
double r612342 = exp(r612341);
double r612343 = r612342 / r612308;
double r612344 = r612326 + r612343;
double r612345 = r612326 + r612315;
double r612346 = r612325 ? r612344 : r612345;
return r612346;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 5.8 |
|---|---|
| Target | 1.0 |
| Herbie | 1.4 |
if (/ (exp (* y (log (/ y (+ z y))))) y) < -inf.0 or -6.151267317177687e-275 < (/ (exp (* y (log (/ y (+ z y))))) y) < -0.0Initial program 28.1
rmApplied add-cube-cbrt34.7
Applied add-cube-cbrt28.2
Applied times-frac28.2
Applied log-prod6.1
Applied distribute-lft-in6.1
Simplified0.2
rmApplied add-cube-cbrt0.9
Applied cbrt-prod2.5
if -inf.0 < (/ (exp (* y (log (/ y (+ z y))))) y) < -6.151267317177687e-275 or -0.0 < (/ (exp (* y (log (/ y (+ z y))))) y) Initial program 1.1
Final simplification1.4
herbie shell --seed 2020034 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:invIncompleteBetaWorker from math-functions-0.1.5.2, G"
:precision binary64
:herbie-target
(if (< (/ y (+ z y)) 7.1154157597908e-315) (+ x (/ (exp (/ -1 z)) y)) (+ x (/ (exp (log (pow (/ y (+ y z)) y))) y)))
(+ x (/ (exp (* y (log (/ y (+ z y))))) y)))