\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 520673369551077.9375:\\
\;\;\;\;\sqrt{\mathsf{fma}\left(x - 0.5, \log x, 0.9189385332046700050057097541866824030876 - x\right)} \cdot \sqrt{\mathsf{fma}\left(x - 0.5, \log x, 0.9189385332046700050057097541866824030876 - x\right)} + \frac{\left(\left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right) \cdot z - 0.002777777777777800001512975569539776188321\right) \cdot z + 0.08333333333333299564049667651488562114537}{x}\\
\mathbf{elif}\;x \le 5.427653638664575180888761127661053009556 \cdot 10^{140}:\\
\;\;\;\;\left(\left(\left(x - 0.5\right) \cdot \log x - x\right) + 0.9189385332046700050057097541866824030876\right) + \mathsf{fma}\left(-\frac{z}{x}, 0.002777777777777800001512975569539776188321, \frac{{z}^{2}}{x} \cdot \left(y + 7.936500793651000149400709382518925849581 \cdot 10^{-4}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\log \left(\sqrt[3]{x} \cdot \sqrt[3]{x}\right) \cdot \left(x - 0.5\right) + \mathsf{fma}\left(x - 0.5, \log \left(\sqrt[3]{x}\right), 0.9189385332046700050057097541866824030876 - x\right)\right) + \frac{1}{x \cdot \left(z \cdot \left(0.4000000000000064059868520871532382443547 - 0.1009522780952416126654114236771420110017 \cdot z\right) + 12.00000000000004796163466380676254630089\right)}\\
\end{array}double f(double x, double y, double z) {
double r350040 = x;
double r350041 = 0.5;
double r350042 = r350040 - r350041;
double r350043 = log(r350040);
double r350044 = r350042 * r350043;
double r350045 = r350044 - r350040;
double r350046 = 0.91893853320467;
double r350047 = r350045 + r350046;
double r350048 = y;
double r350049 = 0.0007936500793651;
double r350050 = r350048 + r350049;
double r350051 = z;
double r350052 = r350050 * r350051;
double r350053 = 0.0027777777777778;
double r350054 = r350052 - r350053;
double r350055 = r350054 * r350051;
double r350056 = 0.083333333333333;
double r350057 = r350055 + r350056;
double r350058 = r350057 / r350040;
double r350059 = r350047 + r350058;
return r350059;
}
double f(double x, double y, double z) {
double r350060 = x;
double r350061 = 520673369551077.94;
bool r350062 = r350060 <= r350061;
double r350063 = 0.5;
double r350064 = r350060 - r350063;
double r350065 = log(r350060);
double r350066 = 0.91893853320467;
double r350067 = r350066 - r350060;
double r350068 = fma(r350064, r350065, r350067);
double r350069 = sqrt(r350068);
double r350070 = r350069 * r350069;
double r350071 = y;
double r350072 = 0.0007936500793651;
double r350073 = r350071 + r350072;
double r350074 = z;
double r350075 = r350073 * r350074;
double r350076 = 0.0027777777777778;
double r350077 = r350075 - r350076;
double r350078 = r350077 * r350074;
double r350079 = 0.083333333333333;
double r350080 = r350078 + r350079;
double r350081 = r350080 / r350060;
double r350082 = r350070 + r350081;
double r350083 = 5.427653638664575e+140;
bool r350084 = r350060 <= r350083;
double r350085 = r350064 * r350065;
double r350086 = r350085 - r350060;
double r350087 = r350086 + r350066;
double r350088 = r350074 / r350060;
double r350089 = -r350088;
double r350090 = 2.0;
double r350091 = pow(r350074, r350090);
double r350092 = r350091 / r350060;
double r350093 = r350092 * r350073;
double r350094 = fma(r350089, r350076, r350093);
double r350095 = r350087 + r350094;
double r350096 = cbrt(r350060);
double r350097 = r350096 * r350096;
double r350098 = log(r350097);
double r350099 = r350098 * r350064;
double r350100 = log(r350096);
double r350101 = fma(r350064, r350100, r350067);
double r350102 = r350099 + r350101;
double r350103 = 1.0;
double r350104 = 0.4000000000000064;
double r350105 = 0.10095227809524161;
double r350106 = r350105 * r350074;
double r350107 = r350104 - r350106;
double r350108 = r350074 * r350107;
double r350109 = 12.000000000000048;
double r350110 = r350108 + r350109;
double r350111 = r350060 * r350110;
double r350112 = r350103 / r350111;
double r350113 = r350102 + r350112;
double r350114 = r350084 ? r350095 : r350113;
double r350115 = r350062 ? r350082 : r350114;
return r350115;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 5.9 |
|---|---|
| Target | 1.2 |
| Herbie | 2.8 |
if x < 520673369551077.94Initial program 0.1
rmApplied add-sqr-sqrt0.2
Simplified0.2
Simplified0.2
if 520673369551077.94 < x < 5.427653638664575e+140Initial program 5.8
Taylor expanded around inf 5.8
Simplified3.7
if 5.427653638664575e+140 < x Initial program 13.5
rmApplied add-cube-cbrt13.5
Applied log-prod13.5
Applied distribute-rgt-in13.5
Applied associate--l+13.5
Applied associate-+l+13.5
Simplified13.5
rmApplied clear-num13.5
Simplified13.5
Taylor expanded around 0 11.2
Simplified5.5
Final simplification2.8
herbie shell --seed 2019350 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:$slogFactorial from math-functions-0.1.5.2, B"
:precision binary64
: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)))