\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.91893853320467001\right) + \frac{\left(\left(y + 7.93650079365100015 \cdot 10^{-4}\right) \cdot z - 0.0027777777777778\right) \cdot z + 0.0833333333333329956}{x}\begin{array}{l}
\mathbf{if}\;x \le 5383194378760586:\\
\;\;\;\;\left(\sqrt{\mathsf{fma}\left(x - 0.5, \log x, 0.91893853320467001\right)} \cdot \sqrt{\mathsf{fma}\left(x - 0.5, \log x, 0.91893853320467001\right)} + \frac{\mathsf{fma}\left(\left(y + 7.93650079365100015 \cdot 10^{-4}\right) \cdot z - 0.0027777777777778, z, 0.0833333333333329956\right)}{x}\right) - x\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{{z}^{2}}{x}, y, \mathsf{fma}\left(\frac{{z}^{2}}{x}, 7.93650079365100015 \cdot 10^{-4}, \mathsf{fma}\left(\log x, x, -x\right)\right)\right)\\
\end{array}double f(double x, double y, double z) {
double r359077 = x;
double r359078 = 0.5;
double r359079 = r359077 - r359078;
double r359080 = log(r359077);
double r359081 = r359079 * r359080;
double r359082 = r359081 - r359077;
double r359083 = 0.91893853320467;
double r359084 = r359082 + r359083;
double r359085 = y;
double r359086 = 0.0007936500793651;
double r359087 = r359085 + r359086;
double r359088 = z;
double r359089 = r359087 * r359088;
double r359090 = 0.0027777777777778;
double r359091 = r359089 - r359090;
double r359092 = r359091 * r359088;
double r359093 = 0.083333333333333;
double r359094 = r359092 + r359093;
double r359095 = r359094 / r359077;
double r359096 = r359084 + r359095;
return r359096;
}
double f(double x, double y, double z) {
double r359097 = x;
double r359098 = 5383194378760586.0;
bool r359099 = r359097 <= r359098;
double r359100 = 0.5;
double r359101 = r359097 - r359100;
double r359102 = log(r359097);
double r359103 = 0.91893853320467;
double r359104 = fma(r359101, r359102, r359103);
double r359105 = sqrt(r359104);
double r359106 = r359105 * r359105;
double r359107 = y;
double r359108 = 0.0007936500793651;
double r359109 = r359107 + r359108;
double r359110 = z;
double r359111 = r359109 * r359110;
double r359112 = 0.0027777777777778;
double r359113 = r359111 - r359112;
double r359114 = 0.083333333333333;
double r359115 = fma(r359113, r359110, r359114);
double r359116 = r359115 / r359097;
double r359117 = r359106 + r359116;
double r359118 = r359117 - r359097;
double r359119 = 2.0;
double r359120 = pow(r359110, r359119);
double r359121 = r359120 / r359097;
double r359122 = -r359097;
double r359123 = fma(r359102, r359097, r359122);
double r359124 = fma(r359121, r359108, r359123);
double r359125 = fma(r359121, r359107, r359124);
double r359126 = r359099 ? r359118 : r359125;
return r359126;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 5.7 |
|---|---|
| Target | 1.2 |
| Herbie | 4.0 |
if x < 5383194378760586.0Initial program 0.2
Simplified0.2
rmApplied add-sqr-sqrt0.2
if 5383194378760586.0 < x Initial program 9.9
Simplified9.9
Taylor expanded around inf 10.0
Simplified6.9
Final simplification4.0
herbie shell --seed 2019199 +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)))