\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}\;x \le 81021117484521324806144:\\
\;\;\;\;\mathsf{fma}\left(-x, 1, x\right) + \mathsf{fma}\left(x - 0.5, \log x, \left(0.9189385332046700050057097541866824030876 - x\right) + \frac{\mathsf{fma}\left(z \cdot \left(7.936500793651000149400709382518925849581 \cdot 10^{-4} + y\right) - 0.002777777777777800001512975569539776188321, z, 0.08333333333333299564049667651488562114537\right)}{x}\right)\\
\mathbf{elif}\;x \le 3.193230357620251955680275402365909698287 \cdot 10^{177}:\\
\;\;\;\;\mathsf{fma}\left(\frac{z \cdot z}{x}, 7.936500793651000149400709382518925849581 \cdot 10^{-4}, \mathsf{fma}\left(\frac{z \cdot z}{x}, y, \log x \cdot x\right) - x\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x - 0.5, \log x, \left(0.9189385332046700050057097541866824030876 - x\right) + \left(\mathsf{fma}\left(\frac{\frac{z}{\sqrt{x}}}{\frac{\sqrt{x}}{z}}, 7.936500793651000149400709382518925849581 \cdot 10^{-4}, \frac{0.08333333333333299564049667651488562114537}{x}\right) - 0.002777777777777800001512975569539776188321 \cdot \frac{z}{x}\right)\right) + \mathsf{fma}\left(-x, 1, x\right)\\
\end{array}double f(double x, double y, double z) {
double r16529876 = x;
double r16529877 = 0.5;
double r16529878 = r16529876 - r16529877;
double r16529879 = log(r16529876);
double r16529880 = r16529878 * r16529879;
double r16529881 = r16529880 - r16529876;
double r16529882 = 0.91893853320467;
double r16529883 = r16529881 + r16529882;
double r16529884 = y;
double r16529885 = 0.0007936500793651;
double r16529886 = r16529884 + r16529885;
double r16529887 = z;
double r16529888 = r16529886 * r16529887;
double r16529889 = 0.0027777777777778;
double r16529890 = r16529888 - r16529889;
double r16529891 = r16529890 * r16529887;
double r16529892 = 0.083333333333333;
double r16529893 = r16529891 + r16529892;
double r16529894 = r16529893 / r16529876;
double r16529895 = r16529883 + r16529894;
return r16529895;
}
double f(double x, double y, double z) {
double r16529896 = x;
double r16529897 = 8.102111748452132e+22;
bool r16529898 = r16529896 <= r16529897;
double r16529899 = -r16529896;
double r16529900 = 1.0;
double r16529901 = fma(r16529899, r16529900, r16529896);
double r16529902 = 0.5;
double r16529903 = r16529896 - r16529902;
double r16529904 = log(r16529896);
double r16529905 = 0.91893853320467;
double r16529906 = r16529905 - r16529896;
double r16529907 = z;
double r16529908 = 0.0007936500793651;
double r16529909 = y;
double r16529910 = r16529908 + r16529909;
double r16529911 = r16529907 * r16529910;
double r16529912 = 0.0027777777777778;
double r16529913 = r16529911 - r16529912;
double r16529914 = 0.083333333333333;
double r16529915 = fma(r16529913, r16529907, r16529914);
double r16529916 = r16529915 / r16529896;
double r16529917 = r16529906 + r16529916;
double r16529918 = fma(r16529903, r16529904, r16529917);
double r16529919 = r16529901 + r16529918;
double r16529920 = 3.193230357620252e+177;
bool r16529921 = r16529896 <= r16529920;
double r16529922 = r16529907 * r16529907;
double r16529923 = r16529922 / r16529896;
double r16529924 = r16529904 * r16529896;
double r16529925 = fma(r16529923, r16529909, r16529924);
double r16529926 = r16529925 - r16529896;
double r16529927 = fma(r16529923, r16529908, r16529926);
double r16529928 = sqrt(r16529896);
double r16529929 = r16529907 / r16529928;
double r16529930 = r16529928 / r16529907;
double r16529931 = r16529929 / r16529930;
double r16529932 = r16529914 / r16529896;
double r16529933 = fma(r16529931, r16529908, r16529932);
double r16529934 = r16529907 / r16529896;
double r16529935 = r16529912 * r16529934;
double r16529936 = r16529933 - r16529935;
double r16529937 = r16529906 + r16529936;
double r16529938 = fma(r16529903, r16529904, r16529937);
double r16529939 = r16529938 + r16529901;
double r16529940 = r16529921 ? r16529927 : r16529939;
double r16529941 = r16529898 ? r16529919 : r16529940;
return r16529941;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 6.0 |
|---|---|
| Target | 1.2 |
| Herbie | 2.0 |
if x < 8.102111748452132e+22Initial program 0.2
Simplified0.2
rmApplied *-un-lft-identity0.2
Applied add-sqr-sqrt0.2
Applied prod-diff0.2
Applied associate-+r+0.2
Simplified0.2
if 8.102111748452132e+22 < x < 3.193230357620252e+177Initial program 7.2
Simplified7.2
Taylor expanded around inf 7.2
Simplified4.4
if 3.193230357620252e+177 < x Initial program 14.0
Simplified14.0
rmApplied *-un-lft-identity14.0
Applied add-sqr-sqrt14.0
Applied prod-diff14.0
Applied associate-+r+14.0
Simplified13.9
rmApplied add-sqr-sqrt13.9
Applied associate-/r*13.9
Taylor expanded around 0 10.6
Simplified2.4
rmApplied *-un-lft-identity2.4
Applied add-sqr-sqrt2.4
Applied times-frac2.4
Applied associate-/r*2.4
Simplified2.4
Final simplification2.0
herbie shell --seed 2019171 +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)))