\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 3.0969566184972678123326658556504927068 \cdot 10^{49}:\\
\;\;\;\;\left(0.9189385332046700050057097541866824030876 + \mathsf{fma}\left(\log x, x - 0.5, \mathsf{fma}\left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot z - 0.002777777777777800001512975569539776188321, z, 0.08333333333333299564049667651488562114537\right) \cdot \frac{1}{x}\right)\right) - x\\
\mathbf{else}:\\
\;\;\;\;\left(0.9189385332046700050057097541866824030876 + \mathsf{fma}\left(\log x, x - 0.5, \mathsf{fma}\left(\frac{z}{x}, -0.002777777777777800001512975569539776188321, \frac{{z}^{2}}{x} \cdot \left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right)\right)\right)\right) - x\\
\end{array}double f(double x, double y, double z) {
double r342521 = x;
double r342522 = 0.5;
double r342523 = r342521 - r342522;
double r342524 = log(r342521);
double r342525 = r342523 * r342524;
double r342526 = r342525 - r342521;
double r342527 = 0.91893853320467;
double r342528 = r342526 + r342527;
double r342529 = y;
double r342530 = 0.0007936500793651;
double r342531 = r342529 + r342530;
double r342532 = z;
double r342533 = r342531 * r342532;
double r342534 = 0.0027777777777778;
double r342535 = r342533 - r342534;
double r342536 = r342535 * r342532;
double r342537 = 0.083333333333333;
double r342538 = r342536 + r342537;
double r342539 = r342538 / r342521;
double r342540 = r342528 + r342539;
return r342540;
}
double f(double x, double y, double z) {
double r342541 = x;
double r342542 = 3.096956618497268e+49;
bool r342543 = r342541 <= r342542;
double r342544 = 0.91893853320467;
double r342545 = log(r342541);
double r342546 = 0.5;
double r342547 = r342541 - r342546;
double r342548 = y;
double r342549 = 0.0007936500793651;
double r342550 = r342548 + r342549;
double r342551 = z;
double r342552 = r342550 * r342551;
double r342553 = 0.0027777777777778;
double r342554 = r342552 - r342553;
double r342555 = 0.083333333333333;
double r342556 = fma(r342554, r342551, r342555);
double r342557 = 1.0;
double r342558 = r342557 / r342541;
double r342559 = r342556 * r342558;
double r342560 = fma(r342545, r342547, r342559);
double r342561 = r342544 + r342560;
double r342562 = r342561 - r342541;
double r342563 = r342551 / r342541;
double r342564 = -r342553;
double r342565 = 2.0;
double r342566 = pow(r342551, r342565);
double r342567 = r342566 / r342541;
double r342568 = r342567 * r342550;
double r342569 = fma(r342563, r342564, r342568);
double r342570 = fma(r342545, r342547, r342569);
double r342571 = r342544 + r342570;
double r342572 = r342571 - r342541;
double r342573 = r342543 ? r342562 : r342572;
return r342573;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 6.0 |
|---|---|
| Target | 1.4 |
| Herbie | 4.4 |
if x < 3.096956618497268e+49Initial program 0.4
Simplified0.4
rmApplied div-inv0.6
if 3.096956618497268e+49 < x Initial program 11.5
Simplified11.5
rmApplied div-inv11.5
Taylor expanded around inf 11.6
Simplified8.1
Final simplification4.4
herbie shell --seed 2019325 +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)))