\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.151482794130214200243033951842862632333 \cdot 10^{64}:\\
\;\;\;\;\left(\mathsf{fma}\left(\frac{z}{\frac{x}{z}}, 7.936500793651000149400709382518925849581 \cdot 10^{-4}, \frac{0.08333333333333299564049667651488562114537}{x}\right) - \frac{z}{x} \cdot 0.002777777777777800001512975569539776188321\right) + \left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.9189385332046700050057097541866824030876\right)\\
\mathbf{elif}\;z \le 2.724809310324407650238250982535209616576 \cdot 10^{127}:\\
\;\;\;\;\left(\left(0.9189385332046700050057097541866824030876 + \mathsf{fma}\left(x, -1, x\right)\right) + \mathsf{fma}\left(x - 0.5, \log x, -e^{\log x}\right)\right) + \frac{1}{x} \cdot \left(0.08333333333333299564049667651488562114537 + z \cdot \left(\left(7.936500793651000149400709382518925849581 \cdot 10^{-4} + y\right) \cdot z - 0.002777777777777800001512975569539776188321\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\mathsf{fma}\left(\frac{z}{\frac{x}{z}}, 7.936500793651000149400709382518925849581 \cdot 10^{-4}, \frac{0.08333333333333299564049667651488562114537}{x}\right) - \frac{z}{x} \cdot 0.002777777777777800001512975569539776188321\right) + \left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.9189385332046700050057097541866824030876\right)\\
\end{array}double f(double x, double y, double z) {
double r19209169 = x;
double r19209170 = 0.5;
double r19209171 = r19209169 - r19209170;
double r19209172 = log(r19209169);
double r19209173 = r19209171 * r19209172;
double r19209174 = r19209173 - r19209169;
double r19209175 = 0.91893853320467;
double r19209176 = r19209174 + r19209175;
double r19209177 = y;
double r19209178 = 0.0007936500793651;
double r19209179 = r19209177 + r19209178;
double r19209180 = z;
double r19209181 = r19209179 * r19209180;
double r19209182 = 0.0027777777777778;
double r19209183 = r19209181 - r19209182;
double r19209184 = r19209183 * r19209180;
double r19209185 = 0.083333333333333;
double r19209186 = r19209184 + r19209185;
double r19209187 = r19209186 / r19209169;
double r19209188 = r19209176 + r19209187;
return r19209188;
}
double f(double x, double y, double z) {
double r19209189 = z;
double r19209190 = -1.1514827941302142e+64;
bool r19209191 = r19209189 <= r19209190;
double r19209192 = x;
double r19209193 = r19209192 / r19209189;
double r19209194 = r19209189 / r19209193;
double r19209195 = 0.0007936500793651;
double r19209196 = 0.083333333333333;
double r19209197 = r19209196 / r19209192;
double r19209198 = fma(r19209194, r19209195, r19209197);
double r19209199 = r19209189 / r19209192;
double r19209200 = 0.0027777777777778;
double r19209201 = r19209199 * r19209200;
double r19209202 = r19209198 - r19209201;
double r19209203 = 0.5;
double r19209204 = r19209192 - r19209203;
double r19209205 = log(r19209192);
double r19209206 = r19209204 * r19209205;
double r19209207 = r19209206 - r19209192;
double r19209208 = 0.91893853320467;
double r19209209 = r19209207 + r19209208;
double r19209210 = r19209202 + r19209209;
double r19209211 = 2.7248093103244077e+127;
bool r19209212 = r19209189 <= r19209211;
double r19209213 = -1.0;
double r19209214 = fma(r19209192, r19209213, r19209192);
double r19209215 = r19209208 + r19209214;
double r19209216 = exp(r19209205);
double r19209217 = -r19209216;
double r19209218 = fma(r19209204, r19209205, r19209217);
double r19209219 = r19209215 + r19209218;
double r19209220 = 1.0;
double r19209221 = r19209220 / r19209192;
double r19209222 = y;
double r19209223 = r19209195 + r19209222;
double r19209224 = r19209223 * r19209189;
double r19209225 = r19209224 - r19209200;
double r19209226 = r19209189 * r19209225;
double r19209227 = r19209196 + r19209226;
double r19209228 = r19209221 * r19209227;
double r19209229 = r19209219 + r19209228;
double r19209230 = r19209212 ? r19209229 : r19209210;
double r19209231 = r19209191 ? r19209210 : r19209230;
return r19209231;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 6.0 |
|---|---|
| Target | 1.2 |
| Herbie | 2.4 |
if z < -1.1514827941302142e+64 or 2.7248093103244077e+127 < z Initial program 39.2
Taylor expanded around 0 36.8
Simplified11.0
if -1.1514827941302142e+64 < z < 2.7248093103244077e+127Initial program 1.2
rmApplied add-sqr-sqrt1.2
Applied prod-diff1.1
Applied associate-+l+1.1
Simplified1.1
rmApplied add-exp-log1.1
Applied add-exp-log1.0
Applied prod-exp1.0
Simplified1.0
rmApplied div-inv1.1
Final simplification2.4
herbie shell --seed 2019179 +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)))