x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\begin{array}{l}
\mathbf{if}\;\frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004} = -\infty \lor \neg \left(\frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004} \le 1.4004327321142957 \cdot 10^{306}\right):\\
\;\;\;\;\mathsf{fma}\left(y, 3.13060547622999996 + \frac{t}{{z}^{2}}, x\right)\\
\mathbf{else}:\\
\;\;\;\;x + \frac{y \cdot \left(\left(\left(\left(z \cdot 3.13060547622999996 + 11.166754126200001\right) \cdot z + t\right) \cdot z + a\right) \cdot z + b\right)}{\left(\left(\left(z + 15.234687406999999\right) \cdot z + 31.469011574900001\right) \cdot z + 11.940090572100001\right) \cdot z + 0.60777138777100004}\\
\end{array}double f(double x, double y, double z, double t, double a, double b) {
double r324640 = x;
double r324641 = y;
double r324642 = z;
double r324643 = 3.13060547623;
double r324644 = r324642 * r324643;
double r324645 = 11.1667541262;
double r324646 = r324644 + r324645;
double r324647 = r324646 * r324642;
double r324648 = t;
double r324649 = r324647 + r324648;
double r324650 = r324649 * r324642;
double r324651 = a;
double r324652 = r324650 + r324651;
double r324653 = r324652 * r324642;
double r324654 = b;
double r324655 = r324653 + r324654;
double r324656 = r324641 * r324655;
double r324657 = 15.234687407;
double r324658 = r324642 + r324657;
double r324659 = r324658 * r324642;
double r324660 = 31.4690115749;
double r324661 = r324659 + r324660;
double r324662 = r324661 * r324642;
double r324663 = 11.9400905721;
double r324664 = r324662 + r324663;
double r324665 = r324664 * r324642;
double r324666 = 0.607771387771;
double r324667 = r324665 + r324666;
double r324668 = r324656 / r324667;
double r324669 = r324640 + r324668;
return r324669;
}
double f(double x, double y, double z, double t, double a, double b) {
double r324670 = y;
double r324671 = z;
double r324672 = 3.13060547623;
double r324673 = r324671 * r324672;
double r324674 = 11.1667541262;
double r324675 = r324673 + r324674;
double r324676 = r324675 * r324671;
double r324677 = t;
double r324678 = r324676 + r324677;
double r324679 = r324678 * r324671;
double r324680 = a;
double r324681 = r324679 + r324680;
double r324682 = r324681 * r324671;
double r324683 = b;
double r324684 = r324682 + r324683;
double r324685 = r324670 * r324684;
double r324686 = 15.234687407;
double r324687 = r324671 + r324686;
double r324688 = r324687 * r324671;
double r324689 = 31.4690115749;
double r324690 = r324688 + r324689;
double r324691 = r324690 * r324671;
double r324692 = 11.9400905721;
double r324693 = r324691 + r324692;
double r324694 = r324693 * r324671;
double r324695 = 0.607771387771;
double r324696 = r324694 + r324695;
double r324697 = r324685 / r324696;
double r324698 = -inf.0;
bool r324699 = r324697 <= r324698;
double r324700 = 1.4004327321142957e+306;
bool r324701 = r324697 <= r324700;
double r324702 = !r324701;
bool r324703 = r324699 || r324702;
double r324704 = 2.0;
double r324705 = pow(r324671, r324704);
double r324706 = r324677 / r324705;
double r324707 = r324672 + r324706;
double r324708 = x;
double r324709 = fma(r324670, r324707, r324708);
double r324710 = r324708 + r324697;
double r324711 = r324703 ? r324709 : r324710;
return r324711;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t




Bits error versus a




Bits error versus b
| Original | 29.5 |
|---|---|
| Target | 1.1 |
| Herbie | 0.9 |
if (/ (* y (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)) (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771)) < -inf.0 or 1.4004327321142957e+306 < (/ (* y (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)) (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771)) Initial program 63.9
Simplified60.1
Taylor expanded around inf 9.8
Simplified1.8
if -inf.0 < (/ (* y (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)) (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771)) < 1.4004327321142957e+306Initial program 0.2
Final simplification0.9
herbie shell --seed 2020021 +o rules:numerics
(FPCore (x y z t a b)
:name "Numeric.SpecFunctions:logGamma from math-functions-0.1.5.2, D"
:precision binary64
:herbie-target
(if (< z -6.499344996252632e+53) (+ x (* (+ (- 3.13060547623 (/ 36.527041698806414 z)) (/ t (* z z))) (/ y 1))) (if (< z 7.066965436914287e+59) (+ x (/ y (/ (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771) (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)))) (+ x (* (+ (- 3.13060547623 (/ 36.527041698806414 z)) (/ t (* z z))) (/ y 1)))))
(+ x (/ (* y (+ (* (+ (* (+ (* (+ (* z 3.13060547623) 11.1667541262) z) t) z) a) z) b)) (+ (* (+ (* (+ (* (+ z 15.234687407) z) 31.4690115749) z) 11.9400905721) z) 0.607771387771))))