\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 -1.438031437492804797591470485801254576708 \cdot 10^{78}:\\
\;\;\;\;\mathsf{fma}\left(x - 0.5, \log x, \left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot \left(\frac{z}{x} \cdot z\right) - \frac{z}{x} \cdot 0.002777777777777800001512975569539776188321\right) - \left(\sqrt[3]{x} \cdot \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) - 0.9189385332046700050057097541866824030876\right)\right) - \mathsf{fma}\left(-0.9189385332046700050057097541866824030876, 1, 0.9189385332046700050057097541866824030876\right)\\
\mathbf{elif}\;z \le 17673340579.045108795166015625:\\
\;\;\;\;\mathsf{fma}\left(x - 0.5, \log x, \frac{\mathsf{fma}\left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot z - 0.002777777777777800001512975569539776188321, z, 0.08333333333333299564049667651488562114537\right)}{x} - \left(\mathsf{expm1}\left(\mathsf{log1p}\left(\sqrt[3]{x}\right)\right) \cdot \left(\sqrt[3]{x} \cdot {\left(e^{\frac{1}{3}}\right)}^{\left(\log x\right)}\right) - 0.9189385332046700050057097541866824030876\right)\right) - \mathsf{fma}\left(-0.9189385332046700050057097541866824030876, 1, 0.9189385332046700050057097541866824030876\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x - 0.5, \log x, \left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot \left(\frac{z}{x} \cdot z\right) - \frac{z}{x} \cdot 0.002777777777777800001512975569539776188321\right) - \left(\sqrt[3]{x} \cdot \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) - 0.9189385332046700050057097541866824030876\right)\right) - \mathsf{fma}\left(-0.9189385332046700050057097541866824030876, 1, 0.9189385332046700050057097541866824030876\right)\\
\end{array}double f(double x, double y, double z) {
double r19780937 = x;
double r19780938 = 0.5;
double r19780939 = r19780937 - r19780938;
double r19780940 = log(r19780937);
double r19780941 = r19780939 * r19780940;
double r19780942 = r19780941 - r19780937;
double r19780943 = 0.91893853320467;
double r19780944 = r19780942 + r19780943;
double r19780945 = y;
double r19780946 = 0.0007936500793651;
double r19780947 = r19780945 + r19780946;
double r19780948 = z;
double r19780949 = r19780947 * r19780948;
double r19780950 = 0.0027777777777778;
double r19780951 = r19780949 - r19780950;
double r19780952 = r19780951 * r19780948;
double r19780953 = 0.083333333333333;
double r19780954 = r19780952 + r19780953;
double r19780955 = r19780954 / r19780937;
double r19780956 = r19780944 + r19780955;
return r19780956;
}
double f(double x, double y, double z) {
double r19780957 = z;
double r19780958 = -1.4380314374928048e+78;
bool r19780959 = r19780957 <= r19780958;
double r19780960 = x;
double r19780961 = 0.5;
double r19780962 = r19780960 - r19780961;
double r19780963 = log(r19780960);
double r19780964 = y;
double r19780965 = 0.0007936500793651;
double r19780966 = r19780964 + r19780965;
double r19780967 = r19780957 / r19780960;
double r19780968 = r19780967 * r19780957;
double r19780969 = r19780966 * r19780968;
double r19780970 = 0.0027777777777778;
double r19780971 = r19780967 * r19780970;
double r19780972 = r19780969 - r19780971;
double r19780973 = cbrt(r19780960);
double r19780974 = r19780973 * r19780973;
double r19780975 = r19780973 * r19780974;
double r19780976 = 0.91893853320467;
double r19780977 = r19780975 - r19780976;
double r19780978 = r19780972 - r19780977;
double r19780979 = fma(r19780962, r19780963, r19780978);
double r19780980 = -r19780976;
double r19780981 = 1.0;
double r19780982 = fma(r19780980, r19780981, r19780976);
double r19780983 = r19780979 - r19780982;
double r19780984 = 17673340579.04511;
bool r19780985 = r19780957 <= r19780984;
double r19780986 = r19780966 * r19780957;
double r19780987 = r19780986 - r19780970;
double r19780988 = 0.083333333333333;
double r19780989 = fma(r19780987, r19780957, r19780988);
double r19780990 = r19780989 / r19780960;
double r19780991 = log1p(r19780973);
double r19780992 = expm1(r19780991);
double r19780993 = 0.3333333333333333;
double r19780994 = exp(r19780993);
double r19780995 = pow(r19780994, r19780963);
double r19780996 = r19780973 * r19780995;
double r19780997 = r19780992 * r19780996;
double r19780998 = r19780997 - r19780976;
double r19780999 = r19780990 - r19780998;
double r19781000 = fma(r19780962, r19780963, r19780999);
double r19781001 = r19781000 - r19780982;
double r19781002 = r19780985 ? r19781001 : r19780983;
double r19781003 = r19780959 ? r19780983 : r19781002;
return r19781003;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 6.0 |
|---|---|
| Target | 1.3 |
| Herbie | 0.6 |
if z < -1.4380314374928048e+78 or 17673340579.04511 < z Initial program 26.9
Simplified26.9
rmApplied *-un-lft-identity26.9
Applied add-cube-cbrt26.9
Applied prod-diff26.9
Applied associate--r+26.9
Simplified26.9
Taylor expanded around inf 27.4
Simplified0.7
if -1.4380314374928048e+78 < z < 17673340579.04511Initial program 0.6
Simplified0.6
rmApplied *-un-lft-identity0.6
Applied add-cube-cbrt0.6
Applied prod-diff0.6
Applied associate--r+0.6
Simplified0.6
rmApplied add-exp-log0.6
Simplified0.5
rmApplied expm1-log1p-u0.6
rmApplied add-log-exp0.6
Applied exp-to-pow0.5
Final simplification0.6
herbie shell --seed 2019200 +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)))