public static EInteger ReduceTrailingZeros( EInteger bigmant, FastInteger exponentMutable, int radix, FastInteger digits, FastInteger precision, FastInteger idealExp) { #if DEBUG if (precision != null && digits == null) { throw new ArgumentException("doesn't satisfy precision==null ||" + "\u0020digits!=null"); } if (!(bigmant.Sign >= 0)) { throw new ArgumentException("doesn't satisfy bigmant.Sign >= 0"); } #endif if (bigmant.IsZero) { exponentMutable.SetInt(0); return(bigmant); } if (radix == 2) { if (!bigmant.IsEven) { return(bigmant); } long lowbit = bigmant.GetLowBitAsInt64(); if (lowbit != Int64.MaxValue) { if (precision != null && digits.CompareTo(precision) >= 0) { // Limit by digits minus precision EInteger tmp = digits.ToEInteger().Subtract(precision.ToEInteger()); if (tmp.CompareTo(EInteger.FromInt64(lowbit)) < 0) { lowbit = tmp.ToInt64Checked(); } } if (idealExp != null && exponentMutable.CompareTo(idealExp) <= 0) { // Limit by idealExp minus exponentMutable EInteger tmp = idealExp.ToEInteger().Subtract(exponentMutable.ToEInteger()); if (tmp.CompareTo(EInteger.FromInt64(lowbit)) < 0) { lowbit = tmp.ToInt64Checked(); } } bigmant = (lowbit <= Int32.MaxValue) ? bigmant.ShiftRight((int)lowbit) : bigmant.ShiftRight(EInteger.FromInt64(lowbit)); if (digits != null) { digits.SubtractInt64(lowbit); } if (exponentMutable != null) { exponentMutable.AddInt64(lowbit); } return(bigmant); } } var bigradix = (EInteger)radix; var bitsToShift = new FastInteger(0); while (!bigmant.IsZero) { if (precision != null && digits.CompareTo(precision) == 0) { break; } if (idealExp != null && exponentMutable.CompareTo(idealExp) == 0) { break; } EInteger bigrem; EInteger bigquo; EInteger[] divrem = bigmant.DivRem(bigradix); bigquo = divrem[0]; bigrem = divrem[1]; if (!bigrem.IsZero) { break; } bigmant = bigquo; exponentMutable.Increment(); if (digits != null) { digits.Decrement(); } } return(bigmant); }