public BigNumber(FloatingDecimal dec) {
Debug.Assert(dec.MantissaSize > 0);
int ib, exponent, mantissaSize, wT;
uint uExtra;
BigNumber[] TenPowers;
ib = 0;
exponent = dec.Exponent;
mantissaSize = dec.MantissaSize;
// Record the first digit
Debug.Assert(dec[ib] > 0 && dec[ib] <= 9);
this.u2 = (uint)(dec[ib]) << 28;
this.u1 = 0;
this.u0 = 0;
this.exp = 4;
this.error = 0;
exponent--;
Normalize();
while (++ib < mantissaSize) {
Debug.Assert(dec[ib] >= 0 && dec[ib] <= 9);
uExtra = MulTenAdd(dec[ib]);
exponent--;
if (0 != uExtra) {
// We've filled up our precision.
Round(uExtra);
if (ib < mantissaSize - 1) {
// There are more digits, so add another error bit just for
// safety's sake.
this.error++;
}
break;
}
}
// Now multiply by 10^exp
if (0 == exponent) {
return;
}
if (exponent < 0) {
TenPowers = TenPowersNeg;
exponent = -exponent;
} else {
TenPowers = TenPowersPos;
}
Debug.Assert(exponent > 0 && exponent < 512);
wT = exponent & 0x1F;
if (wT > 0) {
Mul(ref TenPowers[wT - 1]);
}
wT = (exponent >> 5) & 0x0F;
if (wT > 0) {
Mul(ref TenPowers[wT + 30]);
}
}