x - \frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t}\begin{array}{l}
\mathbf{if}\;e^{z} \le 0.9999999353825346215529634719132445752621:\\
\;\;\;\;x - \left(\frac{\sqrt[3]{\log \left(\mathsf{fma}\left(y, e^{z}, 1 - y\right)\right)}}{\sqrt[3]{t} \cdot \sqrt[3]{t}} \cdot \sqrt[3]{\log \left(\mathsf{fma}\left(y, e^{z}, 1 - y\right)\right)}\right) \cdot \frac{\sqrt[3]{\log \left(\mathsf{fma}\left(y, e^{z}, 1 - y\right)\right)}}{\sqrt[3]{t}}\\
\mathbf{else}:\\
\;\;\;\;x - \mathsf{fma}\left(1, y \cdot \frac{z}{t}, \mathsf{fma}\left(\frac{\left(y \cdot z\right) \cdot z}{t}, 0.5, \frac{\log 1}{t}\right)\right)\\
\end{array}double f(double x, double y, double z, double t) {
double r217634 = x;
double r217635 = 1.0;
double r217636 = y;
double r217637 = r217635 - r217636;
double r217638 = z;
double r217639 = exp(r217638);
double r217640 = r217636 * r217639;
double r217641 = r217637 + r217640;
double r217642 = log(r217641);
double r217643 = t;
double r217644 = r217642 / r217643;
double r217645 = r217634 - r217644;
return r217645;
}
double f(double x, double y, double z, double t) {
double r217646 = z;
double r217647 = exp(r217646);
double r217648 = 0.9999999353825346;
bool r217649 = r217647 <= r217648;
double r217650 = x;
double r217651 = y;
double r217652 = 1.0;
double r217653 = r217652 - r217651;
double r217654 = fma(r217651, r217647, r217653);
double r217655 = log(r217654);
double r217656 = cbrt(r217655);
double r217657 = t;
double r217658 = cbrt(r217657);
double r217659 = r217658 * r217658;
double r217660 = r217656 / r217659;
double r217661 = r217660 * r217656;
double r217662 = r217656 / r217658;
double r217663 = r217661 * r217662;
double r217664 = r217650 - r217663;
double r217665 = r217646 / r217657;
double r217666 = r217651 * r217665;
double r217667 = r217651 * r217646;
double r217668 = r217667 * r217646;
double r217669 = r217668 / r217657;
double r217670 = 0.5;
double r217671 = log(r217652);
double r217672 = r217671 / r217657;
double r217673 = fma(r217669, r217670, r217672);
double r217674 = fma(r217652, r217666, r217673);
double r217675 = r217650 - r217674;
double r217676 = r217649 ? r217664 : r217675;
return r217676;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 25.4 |
|---|---|
| Target | 16.4 |
| Herbie | 8.1 |
if (exp z) < 0.9999999353825346Initial program 11.2
Simplified11.2
rmApplied add-cube-cbrt11.4
Applied add-cube-cbrt11.4
Applied times-frac11.4
Simplified11.5
if 0.9999999353825346 < (exp z) Initial program 31.8
Simplified31.8
Taylor expanded around 0 7.2
Simplified6.5
Final simplification8.1
herbie shell --seed 2019174 +o rules:numerics
(FPCore (x y z t)
:name "System.Random.MWC.Distributions:truncatedExp from mwc-random-0.13.3.2"
:herbie-target
(if (< z -2.8874623088207947e+119) (- (- x (/ (/ (- 0.5) (* y t)) (* z z))) (* (/ (- 0.5) (* y t)) (/ (/ 2.0 z) (* z z)))) (- x (/ (log (+ 1.0 (* z y))) t)))
(- x (/ (log (+ (- 1.0 y) (* y (exp z)))) t)))