x - \frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t}\begin{array}{l}
\mathbf{if}\;\left(1 - y\right) + y \cdot e^{z} \leq 0:\\
\;\;\;\;x - \frac{\log \left(1 + y \cdot z\right)}{t}\\
\mathbf{elif}\;\left(1 - y\right) + y \cdot e^{z} \leq 1:\\
\;\;\;\;x - \left(\left(\frac{e^{z} \cdot {y}^{2}}{t} + \frac{y \cdot e^{z}}{t}\right) - \left(\frac{y}{t} + \left(0.5 \cdot \frac{{y}^{2} \cdot {\left(e^{z}\right)}^{2}}{t} + 0.5 \cdot \frac{{y}^{2}}{t}\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;x - \frac{\log \left(\left(1 - y\right) + \left(\sqrt[3]{y} \cdot \sqrt[3]{y}\right) \cdot \left(e^{z} \cdot \sqrt[3]{y}\right)\right)}{t}\\
\end{array}(FPCore (x y z t) :precision binary64 (- x (/ (log (+ (- 1.0 y) (* y (exp z)))) t)))
(FPCore (x y z t)
:precision binary64
(if (<= (+ (- 1.0 y) (* y (exp z))) 0.0)
(- x (/ (log (+ 1.0 (* y z))) t))
(if (<= (+ (- 1.0 y) (* y (exp z))) 1.0)
(-
x
(-
(+ (/ (* (exp z) (pow y 2.0)) t) (/ (* y (exp z)) t))
(+
(/ y t)
(+
(* 0.5 (/ (* (pow y 2.0) (pow (exp z) 2.0)) t))
(* 0.5 (/ (pow y 2.0) t))))))
(-
x
(/
(log (+ (- 1.0 y) (* (* (cbrt y) (cbrt y)) (* (exp z) (cbrt y)))))
t)))))double code(double x, double y, double z, double t) {
return x - (log((1.0 - y) + (y * exp(z))) / t);
}
double code(double x, double y, double z, double t) {
double tmp;
if (((1.0 - y) + (y * exp(z))) <= 0.0) {
tmp = x - (log(1.0 + (y * z)) / t);
} else if (((1.0 - y) + (y * exp(z))) <= 1.0) {
tmp = x - ((((exp(z) * pow(y, 2.0)) / t) + ((y * exp(z)) / t)) - ((y / t) + ((0.5 * ((pow(y, 2.0) * pow(exp(z), 2.0)) / t)) + (0.5 * (pow(y, 2.0) / t)))));
} else {
tmp = x - (log((1.0 - y) + ((cbrt(y) * cbrt(y)) * (exp(z) * cbrt(y)))) / t);
}
return tmp;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
Results
| Original | 24.4 |
|---|---|
| Target | 16.1 |
| Herbie | 7.8 |
if (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z))) < 0.0Initial program 64.0
Taylor expanded around 0 14.5
Simplified14.5
if 0.0 < (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z))) < 1Initial program 12.0
Taylor expanded around 0 6.0
if 1 < (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z))) Initial program 2.6
rmApplied add-cube-cbrt_binary642.7
Applied associate-*l*_binary642.7
Simplified2.7
Final simplification7.8
herbie shell --seed 2021174
(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.0 z) (* z z)))) (- x (/ (log (+ 1.0 (* z y))) t)))
(- x (/ (log (+ (- 1.0 y) (* y (exp z)))) t)))