x - \frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t}\begin{array}{l}
\mathbf{if}\;\frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t} \leq -9.733492754412066 \cdot 10^{+287}:\\
\;\;\;\;x - \frac{y \cdot z}{t}\\
\mathbf{elif}\;\frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t} \leq -1.1409493465097182 \cdot 10^{-226}:\\
\;\;\;\;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}\\
\mathbf{elif}\;\frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t} \leq 0:\\
\;\;\;\;x - \frac{y \cdot e^{z} - y}{t}\\
\mathbf{elif}\;\frac{\log \left(\left(1 - y\right) + y \cdot e^{z}\right)}{t} \leq 5.322347833521472 \cdot 10^{+306}:\\
\;\;\;\;x - \frac{\log \left(\sqrt[3]{\left(1 - y\right) + y \cdot e^{z}} \cdot \sqrt[3]{\left(1 - y\right) + y \cdot e^{z}}\right) + \log \left(\sqrt[3]{\left(1 - y\right) + y \cdot e^{z}}\right)}{t}\\
\mathbf{else}:\\
\;\;\;\;x - \log \left(1 + y \cdot \left(z + 0.5 \cdot \left(z \cdot z\right)\right)\right) \cdot \frac{1}{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 (<= (/ (log (+ (- 1.0 y) (* y (exp z)))) t) -9.733492754412066e+287)
(- x (/ (* y z) t))
(if (<= (/ (log (+ (- 1.0 y) (* y (exp z)))) t) -1.1409493465097182e-226)
(-
x
(/ (log (+ (- 1.0 y) (* (* (cbrt y) (cbrt y)) (* (exp z) (cbrt y))))) t))
(if (<= (/ (log (+ (- 1.0 y) (* y (exp z)))) t) 0.0)
(- x (/ (- (* y (exp z)) y) t))
(if (<= (/ (log (+ (- 1.0 y) (* y (exp z)))) t) 5.322347833521472e+306)
(-
x
(/
(+
(log
(*
(cbrt (+ (- 1.0 y) (* y (exp z))))
(cbrt (+ (- 1.0 y) (* y (exp z))))))
(log (cbrt (+ (- 1.0 y) (* y (exp z))))))
t))
(- x (* (log (+ 1.0 (* y (+ z (* 0.5 (* z z)))))) (/ 1.0 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 ((log((1.0 - y) + (y * exp(z))) / t) <= -9.733492754412066e+287) {
tmp = x - ((y * z) / t);
} else if ((log((1.0 - y) + (y * exp(z))) / t) <= -1.1409493465097182e-226) {
tmp = x - (log((1.0 - y) + ((cbrt(y) * cbrt(y)) * (exp(z) * cbrt(y)))) / t);
} else if ((log((1.0 - y) + (y * exp(z))) / t) <= 0.0) {
tmp = x - (((y * exp(z)) - y) / t);
} else if ((log((1.0 - y) + (y * exp(z))) / t) <= 5.322347833521472e+306) {
tmp = x - ((log(cbrt((1.0 - y) + (y * exp(z))) * cbrt((1.0 - y) + (y * exp(z)))) + log(cbrt((1.0 - y) + (y * exp(z))))) / t);
} else {
tmp = x - (log(1.0 + (y * (z + (0.5 * (z * z))))) * (1.0 / t));
}
return tmp;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
Results
| Original | 24.6 |
|---|---|
| Target | 16.0 |
| Herbie | 8.3 |
if (/.f64 (log.f64 (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z)))) t) < -9.73349275441206577e287Initial program 63.6
Taylor expanded around 0 15.8
if -9.73349275441206577e287 < (/.f64 (log.f64 (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z)))) t) < -1.14094934650971817e-226Initial program 3.6
rmApplied add-cube-cbrt_binary64_106843.7
Applied associate-*l*_binary64_105903.7
if -1.14094934650971817e-226 < (/.f64 (log.f64 (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z)))) t) < 0.0Initial program 11.4
Taylor expanded around 0 6.4
Simplified6.4
if 0.0 < (/.f64 (log.f64 (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z)))) t) < 5.3223478335214718e306Initial program 1.8
rmApplied add-cube-cbrt_binary64_106841.7
Applied log-prod_binary64_107351.7
if 5.3223478335214718e306 < (/.f64 (log.f64 (+.f64 (-.f64 1 y) (*.f64 y (exp.f64 z)))) t) Initial program 63.9
Taylor expanded around 0 14.4
Simplified14.4
rmApplied div-inv_binary64_1064614.4
Final simplification8.3
herbie shell --seed 2021043
(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)))