Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ NumberToFloatingPointBitsSlow()

static ulong System.Number.NumberToFloatingPointBitsSlow ( ref NumberBuffer number,
in FloatingPointInfo info,
uint positiveExponent,
uint integerDigitsPresent,
uint fractionalDigitsPresent )
inlinestaticprivate

Definition at line 3761 of file Number.cs.

3762 {
3763 uint num = (uint)(info.NormalMantissaBits + 1);
3764 uint digitsCount = (uint)number.DigitsCount;
3765 uint num2 = positiveExponent - integerDigitsPresent;
3766 uint lastIndex = digitsCount;
3767 AccumulateDecimalDigitsIntoBigInteger(ref number, 0u, integerDigitsPresent, out var result);
3768 if (num2 != 0)
3769 {
3770 if (num2 > info.OverflowDecimalExponent)
3771 {
3772 return info.InfinityBits;
3773 }
3774 result.MultiplyPow10(num2);
3775 }
3776 uint num3 = BigInteger.CountSignificantBits(ref result);
3777 if (num3 >= num || fractionalDigitsPresent == 0)
3778 {
3779 return ConvertBigIntegerToFloatingPointBits(ref result, in info, num3, fractionalDigitsPresent != 0);
3780 }
3781 uint num4 = fractionalDigitsPresent;
3782 if (number.Scale < 0)
3783 {
3784 num4 += (uint)(-number.Scale);
3785 }
3786 if (num3 == 0 && num4 - (int)digitsCount > info.OverflowDecimalExponent)
3787 {
3788 return info.ZeroBits;
3789 }
3790 AccumulateDecimalDigitsIntoBigInteger(ref number, integerDigitsPresent, lastIndex, out var result2);
3791 if (result2.IsZero())
3792 {
3793 return ConvertBigIntegerToFloatingPointBits(ref result, in info, num3, fractionalDigitsPresent != 0);
3794 }
3795 BigInteger.Pow10(num4, out var result3);
3796 uint num5 = BigInteger.CountSignificantBits(ref result2);
3797 uint num6 = BigInteger.CountSignificantBits(ref result3);
3798 uint num7 = 0u;
3799 if (num6 > num5)
3800 {
3801 num7 = num6 - num5;
3802 }
3803 if (num7 != 0)
3804 {
3805 result2.ShiftLeft(num7);
3806 }
3807 uint num8 = num - num3;
3808 uint num9 = num8;
3809 if (num3 != 0)
3810 {
3811 if (num7 > num9)
3812 {
3813 return ConvertBigIntegerToFloatingPointBits(ref result, in info, num3, fractionalDigitsPresent != 0);
3814 }
3815 num9 -= num7;
3816 }
3817 uint num10 = num7;
3818 if (BigInteger.Compare(ref result2, ref result3) < 0)
3819 {
3820 num10++;
3821 }
3822 result2.ShiftLeft(num9);
3823 BigInteger.DivRem(ref result2, ref result3, out var quo, out var rem);
3824 ulong num11 = quo.ToUInt64();
3825 bool flag = !number.HasNonZeroTail && rem.IsZero();
3826 uint num12 = BigInteger.CountSignificantBits(num11);
3827 if (num12 > num8)
3828 {
3829 int num13 = (int)(num12 - num8);
3830 flag = flag && (num11 & (ulong)((1L << num13) - 1)) == 0;
3831 num11 >>= num13;
3832 }
3833 ulong num14 = result.ToUInt64();
3834 ulong initialMantissa = (num14 << (int)num8) + num11;
3835 int initialExponent = (int)((num3 != 0) ? (num3 - 2) : (0 - num10 - 1));
3836 return AssembleFloatingPointBits(in info, initialMantissa, initialExponent, flag);
3837 }
static unsafe void AccumulateDecimalDigitsIntoBigInteger(ref NumberBuffer number, uint firstIndex, uint lastIndex, out BigInteger result)
Definition Number.cs:3561
static ulong AssembleFloatingPointBits(in FloatingPointInfo info, ulong initialMantissa, int initialExponent, bool hasZeroTail)
Definition Number.cs:3577
static ulong ConvertBigIntegerToFloatingPointBits(ref BigInteger value, in FloatingPointInfo info, uint integerBitsOfPrecision, bool hasNonZeroFractionalPart)
Definition Number.cs:3631
static BigInteger DivRem(BigInteger dividend, BigInteger divisor, out BigInteger remainder)
static int Compare(BigInteger left, BigInteger right)

References System.Number.AccumulateDecimalDigitsIntoBigInteger(), System.Number.AssembleFloatingPointBits(), System.Number.BigInteger.Compare(), System.Number.ConvertBigIntegerToFloatingPointBits(), System.Number.BigInteger.CountSignificantBits(), System.Number.BigInteger.DivRem(), System.info, System.L, and System.Number.BigInteger.Pow10().

Referenced by System.Number.NumberToDoubleFloatingPointBits(), System.Number.NumberToHalfFloatingPointBits(), and System.Number.NumberToSingleFloatingPointBits().