\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.91893853320467\right) + \frac{\left(\left(y + 0.0007936500793651\right) \cdot z - 0.0027777777777778\right) \cdot z + 0.083333333333333}{x}\begin{array}{l}
\mathbf{if}\;z \cdot \left(\left(0.0007936500793651 + y\right) \cdot z - 0.0027777777777778\right) + 0.083333333333333 \le -1.61040270274943 \cdot 10^{+287}:\\
\;\;\;\;\left(\left(0.91893853320467 + \mathsf{fma}\left(x, -1, x\right)\right) + \mathsf{fma}\left(x - 0.5, \log x, \left(-\sqrt[3]{x}\right) \cdot \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right)\right)\right) + \left(\left(0.0007936500793651 + y\right) \cdot \left(z \cdot \frac{z}{x}\right) - \frac{z}{x} \cdot 0.0027777777777778\right)\\
\mathbf{elif}\;z \cdot \left(\left(0.0007936500793651 + y\right) \cdot z - 0.0027777777777778\right) + 0.083333333333333 \le 1.7606998282830466 \cdot 10^{+171}:\\
\;\;\;\;\frac{z \cdot \left(\left(0.0007936500793651 + y\right) \cdot z - 0.0027777777777778\right) + 0.083333333333333}{x} + \left(\mathsf{fma}\left(\log \left(\sqrt[3]{\sqrt{x}}\right), x - 0.5, \mathsf{fma}\left(x - 0.5, \log \left(\sqrt{x}\right), \mathsf{fma}\left(x, -1, 0.91893853320467\right)\right)\right) + \left(x - 0.5\right) \cdot \log \left(\sqrt[3]{\sqrt{x}} \cdot \sqrt[3]{\sqrt{x}}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\left(0.91893853320467 + \mathsf{fma}\left(x, -1, x\right)\right) + \mathsf{fma}\left(x - 0.5, \log x, \left(-\sqrt[3]{x}\right) \cdot \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right)\right)\right) + \left(\left(0.0007936500793651 + y\right) \cdot \left(z \cdot \frac{z}{x}\right) - \frac{z}{x} \cdot 0.0027777777777778\right)\\
\end{array}double f(double x, double y, double z) {
double r21077644 = x;
double r21077645 = 0.5;
double r21077646 = r21077644 - r21077645;
double r21077647 = log(r21077644);
double r21077648 = r21077646 * r21077647;
double r21077649 = r21077648 - r21077644;
double r21077650 = 0.91893853320467;
double r21077651 = r21077649 + r21077650;
double r21077652 = y;
double r21077653 = 0.0007936500793651;
double r21077654 = r21077652 + r21077653;
double r21077655 = z;
double r21077656 = r21077654 * r21077655;
double r21077657 = 0.0027777777777778;
double r21077658 = r21077656 - r21077657;
double r21077659 = r21077658 * r21077655;
double r21077660 = 0.083333333333333;
double r21077661 = r21077659 + r21077660;
double r21077662 = r21077661 / r21077644;
double r21077663 = r21077651 + r21077662;
return r21077663;
}
double f(double x, double y, double z) {
double r21077664 = z;
double r21077665 = 0.0007936500793651;
double r21077666 = y;
double r21077667 = r21077665 + r21077666;
double r21077668 = r21077667 * r21077664;
double r21077669 = 0.0027777777777778;
double r21077670 = r21077668 - r21077669;
double r21077671 = r21077664 * r21077670;
double r21077672 = 0.083333333333333;
double r21077673 = r21077671 + r21077672;
double r21077674 = -1.61040270274943e+287;
bool r21077675 = r21077673 <= r21077674;
double r21077676 = 0.91893853320467;
double r21077677 = x;
double r21077678 = -1.0;
double r21077679 = fma(r21077677, r21077678, r21077677);
double r21077680 = r21077676 + r21077679;
double r21077681 = 0.5;
double r21077682 = r21077677 - r21077681;
double r21077683 = log(r21077677);
double r21077684 = cbrt(r21077677);
double r21077685 = -r21077684;
double r21077686 = r21077684 * r21077684;
double r21077687 = r21077685 * r21077686;
double r21077688 = fma(r21077682, r21077683, r21077687);
double r21077689 = r21077680 + r21077688;
double r21077690 = r21077664 / r21077677;
double r21077691 = r21077664 * r21077690;
double r21077692 = r21077667 * r21077691;
double r21077693 = r21077690 * r21077669;
double r21077694 = r21077692 - r21077693;
double r21077695 = r21077689 + r21077694;
double r21077696 = 1.7606998282830466e+171;
bool r21077697 = r21077673 <= r21077696;
double r21077698 = r21077673 / r21077677;
double r21077699 = sqrt(r21077677);
double r21077700 = cbrt(r21077699);
double r21077701 = log(r21077700);
double r21077702 = log(r21077699);
double r21077703 = fma(r21077677, r21077678, r21077676);
double r21077704 = fma(r21077682, r21077702, r21077703);
double r21077705 = fma(r21077701, r21077682, r21077704);
double r21077706 = r21077700 * r21077700;
double r21077707 = log(r21077706);
double r21077708 = r21077682 * r21077707;
double r21077709 = r21077705 + r21077708;
double r21077710 = r21077698 + r21077709;
double r21077711 = r21077697 ? r21077710 : r21077695;
double r21077712 = r21077675 ? r21077695 : r21077711;
return r21077712;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 5.7 |
|---|---|
| Target | 1.2 |
| Herbie | 0.3 |
if (+ (* (- (* (+ y 0.0007936500793651) z) 0.0027777777777778) z) 0.083333333333333) < -1.61040270274943e+287 or 1.7606998282830466e+171 < (+ (* (- (* (+ y 0.0007936500793651) z) 0.0027777777777778) z) 0.083333333333333) Initial program 32.3
rmApplied add-cube-cbrt32.3
Applied prod-diff32.3
Applied associate-+l+32.3
Simplified32.3
Taylor expanded around inf 32.9
Simplified0.6
if -1.61040270274943e+287 < (+ (* (- (* (+ y 0.0007936500793651) z) 0.0027777777777778) z) 0.083333333333333) < 1.7606998282830466e+171Initial program 0.2
rmApplied add-sqr-sqrt0.2
Applied log-prod0.2
Applied distribute-lft-in0.2
Applied associate--l+0.3
Applied associate-+l+0.3
rmApplied add-cube-cbrt0.3
Applied log-prod0.3
Applied distribute-lft-in0.2
Applied associate-+l+0.2
Simplified0.2
Final simplification0.3
herbie shell --seed 2019163 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:$slogFactorial from math-functions-0.1.5.2, B"
:herbie-target
(+ (+ (+ (* (- x 0.5) (log x)) (- 0.91893853320467 x)) (/ 0.083333333333333 x)) (* (/ z x) (- (* z (+ y 0.0007936500793651)) 0.0027777777777778)))
(+ (+ (- (* (- x 0.5) (log x)) x) 0.91893853320467) (/ (+ (* (- (* (+ y 0.0007936500793651) z) 0.0027777777777778) z) 0.083333333333333) x)))