x - \frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t}\begin{array}{l}
\mathbf{if}\;z \le -1.788149422936711126217649570543650854038 \cdot 10^{-10}:\\
\;\;\;\;x - \log \left(e^{z} \cdot y + \left(1 - y\right)\right) \cdot \frac{1}{t}\\
\mathbf{elif}\;z \le 1.548199489295338911120653686915655113605 \cdot 10^{-142}:\\
\;\;\;\;x - \frac{1}{\frac{1}{\frac{\mathsf{fma}\left(y \cdot z, \mathsf{fma}\left(z, 0.5, 1\right), \log 1\right)}{t}}}\\
\mathbf{elif}\;z \le 4.70552617509855223204263570258364278042 \cdot 10^{-18}:\\
\;\;\;\;x - \frac{\log \left(\mathsf{fma}\left(z, y, \mathsf{fma}\left(\frac{1}{2}, z \cdot \left(y \cdot z\right), 1\right)\right)\right)}{t}\\
\mathbf{else}:\\
\;\;\;\;x - \mathsf{fma}\left(\frac{z}{\frac{t}{y}}, 1, \mathsf{fma}\left(\frac{{z}^{2}}{\frac{t}{y}}, 0.5, \frac{\log 1}{t}\right)\right)\\
\end{array}double f(double x, double y, double z, double t) {
double r230141 = x;
double r230142 = 1.0;
double r230143 = y;
double r230144 = r230142 - r230143;
double r230145 = z;
double r230146 = exp(r230145);
double r230147 = r230143 * r230146;
double r230148 = r230144 + r230147;
double r230149 = log(r230148);
double r230150 = t;
double r230151 = r230149 / r230150;
double r230152 = r230141 - r230151;
return r230152;
}
double f(double x, double y, double z, double t) {
double r230153 = z;
double r230154 = -1.788149422936711e-10;
bool r230155 = r230153 <= r230154;
double r230156 = x;
double r230157 = exp(r230153);
double r230158 = y;
double r230159 = r230157 * r230158;
double r230160 = 1.0;
double r230161 = r230160 - r230158;
double r230162 = r230159 + r230161;
double r230163 = log(r230162);
double r230164 = 1.0;
double r230165 = t;
double r230166 = r230164 / r230165;
double r230167 = r230163 * r230166;
double r230168 = r230156 - r230167;
double r230169 = 1.548199489295339e-142;
bool r230170 = r230153 <= r230169;
double r230171 = r230158 * r230153;
double r230172 = 0.5;
double r230173 = fma(r230153, r230172, r230160);
double r230174 = log(r230160);
double r230175 = fma(r230171, r230173, r230174);
double r230176 = r230175 / r230165;
double r230177 = r230164 / r230176;
double r230178 = r230164 / r230177;
double r230179 = r230156 - r230178;
double r230180 = 4.705526175098552e-18;
bool r230181 = r230153 <= r230180;
double r230182 = 0.5;
double r230183 = r230153 * r230171;
double r230184 = fma(r230182, r230183, r230160);
double r230185 = fma(r230153, r230158, r230184);
double r230186 = log(r230185);
double r230187 = r230186 / r230165;
double r230188 = r230156 - r230187;
double r230189 = r230165 / r230158;
double r230190 = r230153 / r230189;
double r230191 = 2.0;
double r230192 = pow(r230153, r230191);
double r230193 = r230192 / r230189;
double r230194 = r230174 / r230165;
double r230195 = fma(r230193, r230172, r230194);
double r230196 = fma(r230190, r230160, r230195);
double r230197 = r230156 - r230196;
double r230198 = r230181 ? r230188 : r230197;
double r230199 = r230170 ? r230179 : r230198;
double r230200 = r230155 ? r230168 : r230199;
return r230200;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 25.3 |
|---|---|
| Target | 16.1 |
| Herbie | 8.5 |
if z < -1.788149422936711e-10Initial program 11.1
rmApplied div-inv11.1
if -1.788149422936711e-10 < z < 1.548199489295339e-142Initial program 31.9
Taylor expanded around 0 5.8
Simplified5.8
rmApplied clear-num5.8
Simplified5.8
rmApplied add-cube-cbrt6.0
rmApplied clear-num6.0
Simplified5.8
if 1.548199489295339e-142 < z < 4.705526175098552e-18Initial program 31.5
Taylor expanded around 0 11.5
Simplified11.5
if 4.705526175098552e-18 < z Initial program 24.3
Taylor expanded around 0 20.0
Simplified20.0
rmApplied clear-num20.0
Simplified20.0
Taylor expanded around inf 20.0
Simplified19.7
Final simplification8.5
herbie shell --seed 2019194 +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)))