x - \frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t}\begin{array}{l}
\mathbf{if}\;z \le -3.731260742038221807671652239454073553396 \cdot 10^{-171}:\\
\;\;\;\;x - \frac{\left(\log \left(\sqrt{\sqrt{\mathsf{fma}\left(\mathsf{expm1}\left(z\right), y, 1\right)}}\right) + \log \left(\sqrt{\sqrt{\mathsf{fma}\left(\mathsf{expm1}\left(z\right), y, 1\right)}}\right)\right) + \left(\log \left(\sqrt{\sqrt{\mathsf{fma}\left(\mathsf{expm1}\left(z\right), y, 1\right)}}\right) + \log \left(\sqrt{\sqrt{\mathsf{fma}\left(\mathsf{expm1}\left(z\right), y, 1\right)}}\right)\right)}{t}\\
\mathbf{else}:\\
\;\;\;\;x - \mathsf{fma}\left(1, \frac{z \cdot y}{t}, \mathsf{fma}\left(\frac{{z}^{2} \cdot y}{t}, 0.5, \frac{\log 1}{t}\right)\right)\\
\end{array}double f(double x, double y, double z, double t) {
double r172278 = x;
double r172279 = 1.0;
double r172280 = y;
double r172281 = r172279 - r172280;
double r172282 = z;
double r172283 = exp(r172282);
double r172284 = r172280 * r172283;
double r172285 = r172281 + r172284;
double r172286 = log(r172285);
double r172287 = t;
double r172288 = r172286 / r172287;
double r172289 = r172278 - r172288;
return r172289;
}
double f(double x, double y, double z, double t) {
double r172290 = z;
double r172291 = -3.731260742038222e-171;
bool r172292 = r172290 <= r172291;
double r172293 = x;
double r172294 = expm1(r172290);
double r172295 = y;
double r172296 = 1.0;
double r172297 = fma(r172294, r172295, r172296);
double r172298 = sqrt(r172297);
double r172299 = sqrt(r172298);
double r172300 = log(r172299);
double r172301 = r172300 + r172300;
double r172302 = r172301 + r172301;
double r172303 = t;
double r172304 = r172302 / r172303;
double r172305 = r172293 - r172304;
double r172306 = r172290 * r172295;
double r172307 = r172306 / r172303;
double r172308 = 2.0;
double r172309 = pow(r172290, r172308);
double r172310 = r172309 * r172295;
double r172311 = r172310 / r172303;
double r172312 = 0.5;
double r172313 = log(r172296);
double r172314 = r172313 / r172303;
double r172315 = fma(r172311, r172312, r172314);
double r172316 = fma(r172296, r172307, r172315);
double r172317 = r172293 - r172316;
double r172318 = r172292 ? r172305 : r172317;
return r172318;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 25.6 |
|---|---|
| Target | 16.5 |
| Herbie | 9.3 |
if z < -3.731260742038222e-171Initial program 19.3
Simplified12.2
rmApplied add-sqr-sqrt12.2
Applied log-prod12.2
rmApplied add-sqr-sqrt12.2
Applied sqrt-prod12.2
Applied log-prod12.2
rmApplied add-sqr-sqrt12.2
Applied sqrt-prod12.2
Applied log-prod12.2
if -3.731260742038222e-171 < z Initial program 31.4
Simplified11.6
Taylor expanded around 0 6.7
Simplified6.7
Final simplification9.3
herbie shell --seed 2019347 +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)))