x - \frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t}\begin{array}{l}
\mathbf{if}\;z \le -3.61247754966531634 \cdot 10^{-6}:\\
\;\;\;\;x - \log \left(1 + y \cdot \mathsf{expm1}\left(z\right)\right) \cdot \frac{1}{t}\\
\mathbf{elif}\;z \le 3.44462763878247732 \cdot 10^{-225}:\\
\;\;\;\;x - \mathsf{fma}\left(0.5, {z}^{2} \cdot y, \mathsf{fma}\left(1, z \cdot y, \log 1\right)\right) \cdot \frac{1}{t}\\
\mathbf{else}:\\
\;\;\;\;x - \frac{1}{\frac{t}{\log \left(1 + y \cdot \mathsf{expm1}\left(z\right)\right)}}\\
\end{array}double f(double x, double y, double z, double t) {
double r338579 = x;
double r338580 = 1.0;
double r338581 = y;
double r338582 = r338580 - r338581;
double r338583 = z;
double r338584 = exp(r338583);
double r338585 = r338581 * r338584;
double r338586 = r338582 + r338585;
double r338587 = log(r338586);
double r338588 = t;
double r338589 = r338587 / r338588;
double r338590 = r338579 - r338589;
return r338590;
}
double f(double x, double y, double z, double t) {
double r338591 = z;
double r338592 = -3.6124775496653163e-06;
bool r338593 = r338591 <= r338592;
double r338594 = x;
double r338595 = 1.0;
double r338596 = y;
double r338597 = expm1(r338591);
double r338598 = r338596 * r338597;
double r338599 = r338595 + r338598;
double r338600 = log(r338599);
double r338601 = 1.0;
double r338602 = t;
double r338603 = r338601 / r338602;
double r338604 = r338600 * r338603;
double r338605 = r338594 - r338604;
double r338606 = 3.4446276387824773e-225;
bool r338607 = r338591 <= r338606;
double r338608 = 0.5;
double r338609 = 2.0;
double r338610 = pow(r338591, r338609);
double r338611 = r338610 * r338596;
double r338612 = r338591 * r338596;
double r338613 = log(r338595);
double r338614 = fma(r338595, r338612, r338613);
double r338615 = fma(r338608, r338611, r338614);
double r338616 = r338615 * r338603;
double r338617 = r338594 - r338616;
double r338618 = r338602 / r338600;
double r338619 = r338601 / r338618;
double r338620 = r338594 - r338619;
double r338621 = r338607 ? r338617 : r338620;
double r338622 = r338593 ? r338605 : r338621;
return r338622;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 25.5 |
|---|---|
| Target | 16.5 |
| Herbie | 9.3 |
if z < -3.6124775496653163e-06Initial program 11.9
rmApplied sub-neg11.9
Applied associate-+l+11.9
Simplified11.8
rmApplied div-inv11.9
if -3.6124775496653163e-06 < z < 3.4446276387824773e-225Initial program 31.7
rmApplied sub-neg31.7
Applied associate-+l+16.0
Simplified11.9
rmApplied div-inv11.9
Taylor expanded around 0 6.1
Simplified6.1
if 3.4446276387824773e-225 < z Initial program 31.1
rmApplied sub-neg31.1
Applied associate-+l+18.1
Simplified11.9
rmApplied clear-num11.9
Final simplification9.3
herbie shell --seed 2020060 +o rules:numerics
(FPCore (x y z t)
:name "System.Random.MWC.Distributions:truncatedExp from mwc-random-0.13.3.2"
:precision binary64
:herbie-target
(if (< z -2.8874623088207947e+119) (- (- x (/ (/ (- 0.5) (* y t)) (* z z))) (* (/ (- 0.5) (* y t)) (/ (/ 2 z) (* z z)))) (- x (/ (log (+ 1 (* z y))) t)))
(- x (/ (log (+ (- 1 y) (* y (exp z)))) t)))