x - \frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t}\begin{array}{l}
\mathbf{if}\;z \le -1996524655068977.75:\\
\;\;\;\;x - \frac{\log \left(\sqrt{\mathsf{fma}\left(e^{z}, y, 1 - y\right)}\right) + \log \left(\sqrt{\mathsf{fma}\left(e^{z}, y, 1 - y\right)}\right)}{t}\\
\mathbf{elif}\;z \le 8.257479803818375788788539194002137756388 \cdot 10^{-61}:\\
\;\;\;\;x - \mathsf{fma}\left(1, \frac{z}{\sqrt[3]{t} \cdot \sqrt[3]{t}} \cdot \frac{y}{\sqrt[3]{t}}, \frac{\log 1}{t}\right)\\
\mathbf{else}:\\
\;\;\;\;x - \frac{\log \left(\mathsf{fma}\left(y, \mathsf{fma}\left(\frac{1}{2} \cdot z, z, z\right), 1\right)\right)}{t}\\
\end{array}double f(double x, double y, double z, double t) {
double r158937 = x;
double r158938 = 1.0;
double r158939 = y;
double r158940 = r158938 - r158939;
double r158941 = z;
double r158942 = exp(r158941);
double r158943 = r158939 * r158942;
double r158944 = r158940 + r158943;
double r158945 = log(r158944);
double r158946 = t;
double r158947 = r158945 / r158946;
double r158948 = r158937 - r158947;
return r158948;
}
double f(double x, double y, double z, double t) {
double r158949 = z;
double r158950 = -1996524655068977.8;
bool r158951 = r158949 <= r158950;
double r158952 = x;
double r158953 = exp(r158949);
double r158954 = y;
double r158955 = 1.0;
double r158956 = r158955 - r158954;
double r158957 = fma(r158953, r158954, r158956);
double r158958 = sqrt(r158957);
double r158959 = log(r158958);
double r158960 = r158959 + r158959;
double r158961 = t;
double r158962 = r158960 / r158961;
double r158963 = r158952 - r158962;
double r158964 = 8.257479803818376e-61;
bool r158965 = r158949 <= r158964;
double r158966 = cbrt(r158961);
double r158967 = r158966 * r158966;
double r158968 = r158949 / r158967;
double r158969 = r158954 / r158966;
double r158970 = r158968 * r158969;
double r158971 = log(r158955);
double r158972 = r158971 / r158961;
double r158973 = fma(r158955, r158970, r158972);
double r158974 = r158952 - r158973;
double r158975 = 0.5;
double r158976 = r158975 * r158949;
double r158977 = fma(r158976, r158949, r158949);
double r158978 = fma(r158954, r158977, r158955);
double r158979 = log(r158978);
double r158980 = r158979 / r158961;
double r158981 = r158952 - r158980;
double r158982 = r158965 ? r158974 : r158981;
double r158983 = r158951 ? r158963 : r158982;
return r158983;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 25.3 |
|---|---|
| Target | 16.4 |
| Herbie | 8.5 |
if z < -1996524655068977.8Initial program 12.1
Simplified12.1
rmApplied add-sqr-sqrt12.1
Applied log-prod12.1
if -1996524655068977.8 < z < 8.257479803818376e-61Initial program 30.5
Simplified30.5
Taylor expanded around 0 6.7
Simplified6.7
rmApplied add-cube-cbrt6.8
Applied times-frac6.4
if 8.257479803818376e-61 < z Initial program 29.8
Simplified29.8
Taylor expanded around 0 14.1
Simplified14.1
Final simplification8.5
herbie shell --seed 2019208 +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.88746230882079466e119) (- (- 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)))