Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
NumericsHelpers.cs
Go to the documentation of this file.
2
3namespace System.Numerics;
4
5internal static class NumericsHelpers
6{
7 public static void GetDoubleParts(double dbl, out int sign, out int exp, out ulong man, out bool fFinite)
8 {
9 Unsafe.SkipInit(out DoubleUlong doubleUlong);
10 doubleUlong.uu = 0uL;
11 doubleUlong.dbl = dbl;
12 sign = 1 - ((int)(doubleUlong.uu >> 62) & 2);
13 man = doubleUlong.uu & 0xFFFFFFFFFFFFFuL;
14 exp = (int)(doubleUlong.uu >> 52) & 0x7FF;
15 if (exp == 0)
16 {
17 fFinite = true;
18 if (man != 0L)
19 {
20 exp = -1074;
21 }
22 }
23 else if (exp == 2047)
24 {
25 fFinite = false;
26 exp = int.MaxValue;
27 }
28 else
29 {
30 fFinite = true;
31 man |= 4503599627370496uL;
32 exp -= 1075;
33 }
34 }
35
36 public static double GetDoubleFromParts(int sign, int exp, ulong man)
37 {
38 Unsafe.SkipInit(out DoubleUlong doubleUlong);
39 doubleUlong.dbl = 0.0;
40 if (man == 0L)
41 {
42 doubleUlong.uu = 0uL;
43 }
44 else
45 {
46 int num = CbitHighZero(man) - 11;
47 man = ((num >= 0) ? (man << num) : (man >> -num));
48 exp -= num;
49 exp += 1075;
50 if (exp >= 2047)
51 {
52 doubleUlong.uu = 9218868437227405312uL;
53 }
54 else if (exp <= 0)
55 {
56 exp--;
57 if (exp < -52)
58 {
59 doubleUlong.uu = 0uL;
60 }
61 else
62 {
63 doubleUlong.uu = man >> -exp;
64 }
65 }
66 else
67 {
68 doubleUlong.uu = (man & 0xFFFFFFFFFFFFFuL) | (ulong)((long)exp << 52);
69 }
70 }
71 if (sign < 0)
72 {
73 doubleUlong.uu |= 9223372036854775808uL;
74 }
75 return doubleUlong.dbl;
76 }
77
79 {
80 if (d != null && d.Length > 0)
81 {
82 d[0] = ~d[0] + 1;
83 int i;
84 for (i = 1; d[i - 1] == 0 && i < d.Length; i++)
85 {
86 d[i] = ~d[i] + 1;
87 }
88 for (; i < d.Length; i++)
89 {
90 d[i] = ~d[i];
91 }
92 }
93 }
94
95 public static ulong MakeUlong(uint uHi, uint uLo)
96 {
97 return ((ulong)uHi << 32) | uLo;
98 }
99
100 public static uint Abs(int a)
101 {
102 uint num = (uint)(a >> 31);
103 return ((uint)a ^ num) - num;
104 }
105
106 public static uint CombineHash(uint u1, uint u2)
107 {
108 return ((u1 << 7) | (u1 >> 25)) ^ u2;
109 }
110
111 public static int CombineHash(int n1, int n2)
112 {
113 return (int)CombineHash((uint)n1, (uint)n2);
114 }
115
116 public static int CbitHighZero(uint u)
117 {
118 if (u == 0)
119 {
120 return 32;
121 }
122 int num = 0;
123 if ((u & 0xFFFF0000u) == 0)
124 {
125 num += 16;
126 u <<= 16;
127 }
128 if ((u & 0xFF000000u) == 0)
129 {
130 num += 8;
131 u <<= 8;
132 }
133 if ((u & 0xF0000000u) == 0)
134 {
135 num += 4;
136 u <<= 4;
137 }
138 if ((u & 0xC0000000u) == 0)
139 {
140 num += 2;
141 u <<= 2;
142 }
143 if ((u & 0x80000000u) == 0)
144 {
145 num++;
146 }
147 return num;
148 }
149
150 public static int CbitHighZero(ulong uu)
151 {
152 if ((uu & 0xFFFFFFFF00000000uL) == 0L)
153 {
154 return 32 + CbitHighZero((uint)uu);
155 }
156 return CbitHighZero((uint)(uu >> 32));
157 }
158}
static uint CombineHash(uint u1, uint u2)
static double GetDoubleFromParts(int sign, int exp, ulong man)
static void GetDoubleParts(double dbl, out int sign, out int exp, out ulong man, out bool fFinite)
static int CbitHighZero(ulong uu)
static ulong MakeUlong(uint uHi, uint uLo)
static void DangerousMakeTwosComplement(Span< uint > d)
static int CombineHash(int n1, int n2)
int Length
Definition Span.cs:70