\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.9189385332046700050057097541866824030876\right) + \frac{\left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot z - 0.002777777777777800001512975569539776188321\right) \cdot z + 0.08333333333333299564049667651488562114537}{x}\begin{array}{l}
\mathbf{if}\;x \le 3072260342564814460026880:\\
\;\;\;\;\left(\left(\log \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \left(x - 0.5\right) + \left(\log \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sqrt[3]{x}\right)\right)\right) \cdot \left(x - 0.5\right) - x\right)\right) + 0.9189385332046700050057097541866824030876\right) + 1 \cdot \frac{\mathsf{fma}\left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot z - 0.002777777777777800001512975569539776188321, z, 0.08333333333333299564049667651488562114537\right)}{x}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{{z}^{2}}{x}, y, 7.936500793651000149400709382518925849581 \cdot 10^{-4} \cdot \frac{{z}^{2}}{x} - \mathsf{fma}\left(\log \left(\frac{1}{x}\right), x, x\right)\right)\\
\end{array}double f(double x, double y, double z) {
double r569472 = x;
double r569473 = 0.5;
double r569474 = r569472 - r569473;
double r569475 = log(r569472);
double r569476 = r569474 * r569475;
double r569477 = r569476 - r569472;
double r569478 = 0.91893853320467;
double r569479 = r569477 + r569478;
double r569480 = y;
double r569481 = 0.0007936500793651;
double r569482 = r569480 + r569481;
double r569483 = z;
double r569484 = r569482 * r569483;
double r569485 = 0.0027777777777778;
double r569486 = r569484 - r569485;
double r569487 = r569486 * r569483;
double r569488 = 0.083333333333333;
double r569489 = r569487 + r569488;
double r569490 = r569489 / r569472;
double r569491 = r569479 + r569490;
return r569491;
}
double f(double x, double y, double z) {
double r569492 = x;
double r569493 = 3.0722603425648145e+24;
bool r569494 = r569492 <= r569493;
double r569495 = cbrt(r569492);
double r569496 = r569495 * r569495;
double r569497 = log(r569496);
double r569498 = 0.5;
double r569499 = r569492 - r569498;
double r569500 = r569497 * r569499;
double r569501 = log1p(r569495);
double r569502 = expm1(r569501);
double r569503 = log(r569502);
double r569504 = r569503 * r569499;
double r569505 = r569504 - r569492;
double r569506 = r569500 + r569505;
double r569507 = 0.91893853320467;
double r569508 = r569506 + r569507;
double r569509 = 1.0;
double r569510 = y;
double r569511 = 0.0007936500793651;
double r569512 = r569510 + r569511;
double r569513 = z;
double r569514 = r569512 * r569513;
double r569515 = 0.0027777777777778;
double r569516 = r569514 - r569515;
double r569517 = 0.083333333333333;
double r569518 = fma(r569516, r569513, r569517);
double r569519 = r569518 / r569492;
double r569520 = r569509 * r569519;
double r569521 = r569508 + r569520;
double r569522 = 2.0;
double r569523 = pow(r569513, r569522);
double r569524 = r569523 / r569492;
double r569525 = r569511 * r569524;
double r569526 = r569509 / r569492;
double r569527 = log(r569526);
double r569528 = fma(r569527, r569492, r569492);
double r569529 = r569525 - r569528;
double r569530 = fma(r569524, r569510, r569529);
double r569531 = r569494 ? r569521 : r569530;
return r569531;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 5.7 |
|---|---|
| Target | 1.1 |
| Herbie | 4.1 |
if x < 3.0722603425648145e+24Initial program 0.2
rmApplied add-cube-cbrt0.2
Applied log-prod0.2
Applied distribute-rgt-in0.2
Applied associate--l+0.2
rmApplied *-un-lft-identity0.2
Applied *-un-lft-identity0.2
Applied times-frac0.2
Simplified0.2
Simplified0.2
rmApplied expm1-log1p-u0.2
if 3.0722603425648145e+24 < x Initial program 10.4
Simplified10.4
Taylor expanded around inf 10.6
Simplified7.4
Final simplification4.1
herbie shell --seed 2019362 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:$slogFactorial from math-functions-0.1.5.2, B"
:precision binary64
:herbie-target
(+ (+ (+ (* (- x 0.5) (log x)) (- 0.91893853320467 x)) (/ 0.083333333333333 x)) (* (/ z x) (- (* z (+ y 0.0007936500793651)) 0.0027777777777778)))
(+ (+ (- (* (- x 0.5) (log x)) x) 0.91893853320467) (/ (+ (* (- (* (+ y 0.0007936500793651) z) 0.0027777777777778) z) 0.083333333333333) x)))