\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.9189385332046700050057097541866824030876\right) + \frac{\left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot z - 0.002777777777777800001512975569539776188321\right) \cdot z + 0.08333333333333299564049667651488562114537}{x}\begin{array}{l}
\mathbf{if}\;z \le -3231657961535374147432615086391296:\\
\;\;\;\;\mathsf{fma}\left(\log x, x - 0.5, \mathsf{fma}\left(\frac{z \cdot z}{x}, y, \frac{z \cdot z}{\frac{x}{7.936500793651000149400709382518925849581 \cdot 10^{-4}}} - 0.002777777777777800001512975569539776188321 \cdot \frac{z}{x}\right)\right) + \left(0.9189385332046700050057097541866824030876 - x\right)\\
\mathbf{elif}\;z \le 1340928350.1376693248748779296875:\\
\;\;\;\;\mathsf{fma}\left(x - 0.5, \log x, \frac{1}{\frac{x}{\mathsf{fma}\left(z \cdot \left(7.936500793651000149400709382518925849581 \cdot 10^{-4} + y\right) - 0.002777777777777800001512975569539776188321, z, 0.08333333333333299564049667651488562114537\right)}} + \left(0.9189385332046700050057097541866824030876 - x\right)\right) + \mathsf{fma}\left(-x, 1, x\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\log x, x - 0.5, \mathsf{fma}\left(\frac{z \cdot z}{x}, y, \frac{z \cdot z}{\frac{x}{7.936500793651000149400709382518925849581 \cdot 10^{-4}}} - 0.002777777777777800001512975569539776188321 \cdot \frac{z}{x}\right)\right) + \left(0.9189385332046700050057097541866824030876 - x\right)\\
\end{array}double f(double x, double y, double z) {
double r18964767 = x;
double r18964768 = 0.5;
double r18964769 = r18964767 - r18964768;
double r18964770 = log(r18964767);
double r18964771 = r18964769 * r18964770;
double r18964772 = r18964771 - r18964767;
double r18964773 = 0.91893853320467;
double r18964774 = r18964772 + r18964773;
double r18964775 = y;
double r18964776 = 0.0007936500793651;
double r18964777 = r18964775 + r18964776;
double r18964778 = z;
double r18964779 = r18964777 * r18964778;
double r18964780 = 0.0027777777777778;
double r18964781 = r18964779 - r18964780;
double r18964782 = r18964781 * r18964778;
double r18964783 = 0.083333333333333;
double r18964784 = r18964782 + r18964783;
double r18964785 = r18964784 / r18964767;
double r18964786 = r18964774 + r18964785;
return r18964786;
}
double f(double x, double y, double z) {
double r18964787 = z;
double r18964788 = -3.231657961535374e+33;
bool r18964789 = r18964787 <= r18964788;
double r18964790 = x;
double r18964791 = log(r18964790);
double r18964792 = 0.5;
double r18964793 = r18964790 - r18964792;
double r18964794 = r18964787 * r18964787;
double r18964795 = r18964794 / r18964790;
double r18964796 = y;
double r18964797 = 0.0007936500793651;
double r18964798 = r18964790 / r18964797;
double r18964799 = r18964794 / r18964798;
double r18964800 = 0.0027777777777778;
double r18964801 = r18964787 / r18964790;
double r18964802 = r18964800 * r18964801;
double r18964803 = r18964799 - r18964802;
double r18964804 = fma(r18964795, r18964796, r18964803);
double r18964805 = fma(r18964791, r18964793, r18964804);
double r18964806 = 0.91893853320467;
double r18964807 = r18964806 - r18964790;
double r18964808 = r18964805 + r18964807;
double r18964809 = 1340928350.1376693;
bool r18964810 = r18964787 <= r18964809;
double r18964811 = 1.0;
double r18964812 = r18964797 + r18964796;
double r18964813 = r18964787 * r18964812;
double r18964814 = r18964813 - r18964800;
double r18964815 = 0.083333333333333;
double r18964816 = fma(r18964814, r18964787, r18964815);
double r18964817 = r18964790 / r18964816;
double r18964818 = r18964811 / r18964817;
double r18964819 = r18964818 + r18964807;
double r18964820 = fma(r18964793, r18964791, r18964819);
double r18964821 = -r18964790;
double r18964822 = fma(r18964821, r18964811, r18964790);
double r18964823 = r18964820 + r18964822;
double r18964824 = r18964810 ? r18964823 : r18964808;
double r18964825 = r18964789 ? r18964808 : r18964824;
return r18964825;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 6.2 |
|---|---|
| Target | 1.2 |
| Herbie | 4.4 |
if z < -3.231657961535374e+33 or 1340928350.1376693 < z Initial program 24.4
Simplified24.4
Taylor expanded around inf 24.8
Simplified16.8
if -3.231657961535374e+33 < z < 1340928350.1376693Initial program 0.3
Simplified0.3
rmApplied *-un-lft-identity0.3
Applied add-sqr-sqrt0.3
Applied prod-diff0.3
Applied associate-+r+0.3
Simplified0.3
rmApplied clear-num0.4
Final simplification4.4
herbie shell --seed 2019174 +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)))