2007-09-27 H.J. Lu <hongjiu.lu@intel.com>
[official-gcc.git] / libgcc / config / libbid / bid128.c
blob8f413068de3a2756d332057fdd3ace1a0f51e63f
1 /* Copyright (C) 2007 Free Software Foundation, Inc.
3 This file is part of GCC.
5 GCC is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 2, or (at your option) any later
8 version.
10 In addition to the permissions in the GNU General Public License, the
11 Free Software Foundation gives you unlimited permission to link the
12 compiled version of this file into combinations with other programs,
13 and to distribute those combinations without any restriction coming
14 from the use of this file. (The General Public License restrictions
15 do apply in other respects; for example, they cover modification of
16 the file, and distribution when not linked into a combine
17 executable.)
19 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
20 WARRANTY; without even the implied warranty of MERCHANTABILITY or
21 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
22 for more details.
24 You should have received a copy of the GNU General Public License
25 along with GCC; see the file COPYING. If not, write to the Free
26 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
27 02110-1301, USA. */
29 #include "bid_internal.h"
31 // the first entry of nr_digits[i - 1] (where 1 <= i <= 113), indicates
32 // the number of decimal digits needed to represent a binary number with i bits;
33 // however, if a binary number of i bits may require either k or k + 1 decimal
34 // digits, then the first entry of nr_digits[i - 1] is 0; in this case if the
35 // number is less than the value represented by the second and third entries
36 // concatenated, then the number of decimal digits k is the fourth entry, else
37 // the number of decimal digits is the fourth entry plus 1
38 DEC_DIGITS nr_digits[] = { // only the first entry is used if it is not 0
39 {1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
40 , // 1-bit n < 10^1
41 {1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
42 , // 2-bit n < 10^1
43 {1, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
44 , // 3-bit n < 10^1
45 {0, 0x0000000000000000ULL, 0x000000000000000aULL, 1}
46 , // 4-bit n ? 10^1
47 {2, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
48 , // 5-bit n < 10^2
49 {2, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
50 , // 6-bit n < 10^2
51 {0, 0x0000000000000000ULL, 0x0000000000000064ULL, 2}
52 , // 7-bit n ? 10^2
53 {3, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
54 , // 8-bit n < 10^3
55 {3, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
56 , // 9-bit n < 10^3
57 {0, 0x0000000000000000ULL, 0x00000000000003e8ULL, 3}
58 , // 10-bit n ? 10^3
59 {4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
60 , // 11-bit n < 10^4
61 {4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
62 , // 12-bit n < 10^4
63 {4, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
64 , // 13-bit n < 10^4
65 {0, 0x0000000000000000ULL, 0x0000000000002710ULL, 4}
66 , // 14-bit n ? 10^4
67 {5, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
68 , // 15-bit n < 10^5
69 {5, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
70 , // 16-bit n < 10^5
71 {0, 0x0000000000000000ULL, 0x00000000000186a0ULL, 5}
72 , // 17-bit n ? 10^5
73 {6, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
74 , // 18-bit n < 10^6
75 {6, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
76 , // 19-bit n < 10^6
77 {0, 0x0000000000000000ULL, 0x00000000000f4240ULL, 6}
78 , // 20-bit n ? 10^6
79 {7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
80 , // 21-bit n < 10^7
81 {7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
82 , // 22-bit n < 10^7
83 {7, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
84 , // 23-bit n < 10^7
85 {0, 0x0000000000000000ULL, 0x0000000000989680ULL, 7}
86 , // 24-bit n ? 10^7
87 {8, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
88 , // 25-bit n < 10^8
89 {8, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
90 , // 26-bit n < 10^8
91 {0, 0x0000000000000000ULL, 0x0000000005f5e100ULL, 8}
92 , // 27-bit n ? 10^8
93 {9, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
94 , // 28-bit n < 10^9
95 {9, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
96 , // 29-bit n < 10^9
97 {0, 0x0000000000000000ULL, 0x000000003b9aca00ULL, 9}
98 , // 30-bit n ? 10^9
99 {10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
100 , // 31-bit n < 10^10
101 {10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
102 , // 32-bit n < 10^10
103 {10, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
104 , // 33-bit n < 10^10
105 {0, 0x0000000000000000ULL, 0x00000002540be400ULL, 10}
106 , // 34-bit n ? 10^10
107 {11, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
108 , // 35-bit n < 10^11
109 {11, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
110 , // 36-bit n < 10^11
111 {0, 0x0000000000000000ULL, 0x000000174876e800ULL, 11}
112 , // 37-bit n ? 10^11
113 {12, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
114 , // 38-bit n < 10^12
115 {12, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
116 , // 39-bit n < 10^12
117 {0, 0x0000000000000000ULL, 0x000000e8d4a51000ULL, 12}
118 , // 40-bit n ? 10^12
119 {13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
120 , // 41-bit n < 10^13
121 {13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
122 , // 42-bit n < 10^13
123 {13, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
124 , // 43-bit n < 10^13
125 {0, 0x0000000000000000ULL, 0x000009184e72a000ULL, 13}
126 , // 44-bit n ? 10^13
127 {14, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
128 , // 45-bit n < 10^14
129 {14, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
130 , // 46-bit n < 10^14
131 {0, 0x0000000000000000ULL, 0x00005af3107a4000ULL, 14}
132 , // 47-bit n ? 10^14
133 {15, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
134 , // 48-bit n < 10^15
135 {15, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
136 , // 49-bit n < 10^15
137 {0, 0x0000000000000000ULL, 0x00038d7ea4c68000ULL, 15}
138 , // 50-bit n ? 10^15
139 {16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
140 , // 51-bit n < 10^16
141 {16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
142 , // 52-bit n < 10^16
143 {16, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
144 , // 53-bit n < 10^16
145 {0, 0x0000000000000000ULL, 0x002386f26fc10000ULL, 16}
146 , // 54-bit n ? 10^16
147 {17, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
148 , // 55-bit n < 10^17
149 {17, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
150 , // 56-bit n < 10^17
151 {0, 0x0000000000000000ULL, 0x016345785d8a0000ULL, 17}
152 , // 57-bit n ? 10^17
153 {18, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
154 , // 58-bit n < 10^18
155 {18, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
156 , // 59-bit n < 10^18
157 {0, 0x0000000000000000ULL, 0x0de0b6b3a7640000ULL, 18}
158 , // 60-bit n ? 10^18
159 {19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
160 , // 61-bit n < 10^19
161 {19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
162 , // 62-bit n < 10^19
163 {19, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
164 , // 63-bit n < 10^19
165 {0, 0x0000000000000000ULL, 0x8ac7230489e80000ULL, 19}
166 , // 64-bit n ? 10^19
167 {20, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
168 , // 65-bit n < 10^20
169 {20, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
170 , // 66-bit n < 10^20
171 {0, 0x0000000000000005ULL, 0x6bc75e2d63100000ULL, 20}
172 , // 67-bit n ? 10^20
173 {21, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
174 , // 68-bit n < 10^21
175 {21, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
176 , // 69-bit n < 10^21
177 {0, 0x0000000000000036ULL, 0x35c9adc5dea00000ULL, 21}
178 , // 70-bit n ? 10^21
179 {22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
180 , // 71-bit n < 10^22
181 {22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
182 , // 72-bit n < 10^22
183 {22, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
184 , // 73-bit n < 10^22
185 {0, 0x000000000000021eULL, 0x19e0c9bab2400000ULL, 22}
186 , // 74-bit n ? 10^22
187 {23, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
188 , // 75-bit n < 10^23
189 {23, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
190 , // 76-bit n < 10^23
191 {0, 0x000000000000152dULL, 0x02c7e14af6800000ULL, 23}
192 , // 77-bit n ? 10^23
193 {24, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
194 , // 78-bit n < 10^24
195 {24, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
196 , // 79-bit n < 10^24
197 {0, 0x000000000000d3c2ULL, 0x1bcecceda1000000ULL, 24}
198 , // 80-bit n ? 10^24
199 {25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
200 , // 81-bit n < 10^25
201 {25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
202 , // 82-bit n < 10^25
203 {25, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
204 , // 83-bit n < 10^25
205 {0, 0x0000000000084595ULL, 0x161401484a000000ULL, 25}
206 , // 84-bit n ? 10^25
207 {26, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
208 , // 85-bit n < 10^26
209 {26, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
210 , // 86-bit n < 10^26
211 {0, 0x000000000052b7d2ULL, 0xdcc80cd2e4000000ULL, 26}
212 , // 87-bit n ? 10^26
213 {27, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
214 , // 88-bit n < 10^27
215 {27, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
216 , // 89-bit n < 10^27
217 {0, 0x00000000033b2e3cULL, 0x9fd0803ce8000000ULL, 27}
218 , // 90-bit n ? 10^27
219 {28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
220 , // 91-bit n < 10^28
221 {28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
222 , // 92-bit n < 10^28
223 {28, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
224 , // 93-bit n < 10^28
225 {0, 0x00000000204fce5eULL, 0x3e25026110000000ULL, 28}
226 , // 94-bit n ? 10^28
227 {29, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
228 , // 95-bit n < 10^29
229 {29, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
230 , // 96-bit n < 10^29
231 {0, 0x00000001431e0faeULL, 0x6d7217caa0000000ULL, 29}
232 , // 97-bit n ? 10^29
233 {30, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
234 , // 98-bit n < 10^30
235 {30, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
236 , // 99-bit n < 10^30
237 {0, 0x0000000c9f2c9cd0ULL, 0x4674edea40000000ULL, 30}
238 , // 100-bit n ? 10^30
239 {31, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
240 , // 101-bit n < 10^31
241 {31, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
242 , // 102-bit n < 10^31
243 {0, 0x0000007e37be2022ULL, 0xc0914b2680000000ULL, 31}
244 , // 103-bit n ? 10^31
245 {32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
246 , // 104-bit n < 10^32
247 {32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
248 , // 105-bit n < 10^32
249 {32, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
250 , // 106-bit n < 10^32
251 {0, 0x000004ee2d6d415bULL, 0x85acef8100000000ULL, 32}
252 , // 107-bit n ? 10^32
253 {33, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
254 , // 108-bit n < 10^33
255 {33, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
256 , // 109-bit n < 10^33
257 {0, 0x0000314dc6448d93ULL, 0x38c15b0a00000000ULL, 33}
258 , // 100-bit n ? 10^33
259 {34, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34}
260 , // 111-bit n < 10^34
261 {34, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34}
262 , // 112-bit n < 10^34
263 {0, 0x0001ed09bead87c0ULL, 0x378d8e6400000000ULL, 34} // 113-bit n ? 10^34
264 //{ 35, 0x0013426172c74d82ULL, 0x2b878fe800000000ULL, 35 } // 114-bit n < 10^35
267 // midpoint64[i - 1] = 1/2 * 10^i = 5 * 10^(i-1), 1 <= i <= 19
268 UINT64 midpoint64[] = {
269 0x0000000000000005ULL, // 1/2 * 10^1 = 5 * 10^0
270 0x0000000000000032ULL, // 1/2 * 10^2 = 5 * 10^1
271 0x00000000000001f4ULL, // 1/2 * 10^3 = 5 * 10^2
272 0x0000000000001388ULL, // 1/2 * 10^4 = 5 * 10^3
273 0x000000000000c350ULL, // 1/2 * 10^5 = 5 * 10^4
274 0x000000000007a120ULL, // 1/2 * 10^6 = 5 * 10^5
275 0x00000000004c4b40ULL, // 1/2 * 10^7 = 5 * 10^6
276 0x0000000002faf080ULL, // 1/2 * 10^8 = 5 * 10^7
277 0x000000001dcd6500ULL, // 1/2 * 10^9 = 5 * 10^8
278 0x000000012a05f200ULL, // 1/2 * 10^10 = 5 * 10^9
279 0x0000000ba43b7400ULL, // 1/2 * 10^11 = 5 * 10^10
280 0x000000746a528800ULL, // 1/2 * 10^12 = 5 * 10^11
281 0x0000048c27395000ULL, // 1/2 * 10^13 = 5 * 10^12
282 0x00002d79883d2000ULL, // 1/2 * 10^14 = 5 * 10^13
283 0x0001c6bf52634000ULL, // 1/2 * 10^15 = 5 * 10^14
284 0x0011c37937e08000ULL, // 1/2 * 10^16 = 5 * 10^15
285 0x00b1a2bc2ec50000ULL, // 1/2 * 10^17 = 5 * 10^16
286 0x06f05b59d3b20000ULL, // 1/2 * 10^18 = 5 * 10^17
287 0x4563918244f40000ULL // 1/2 * 10^19 = 5 * 10^18
290 // midpoint128[i - 20] = 1/2 * 10^i = 5 * 10^(i-1), 20 <= i <= 38
291 UINT128 midpoint128[] = { // the 64-bit word order is L, H
292 {{0xb5e3af16b1880000ULL, 0x0000000000000002ULL}
294 , // 1/2 * 10^20 = 5 * 10^19
295 {{0x1ae4d6e2ef500000ULL, 0x000000000000001bULL}
297 , // 1/2 * 10^21 = 5 * 10^20
298 {{0x0cf064dd59200000ULL, 0x000000000000010fULL}
300 , // 1/2 * 10^22 = 5 * 10^21
301 {{0x8163f0a57b400000ULL, 0x0000000000000a96ULL}
303 , // 1/2 * 10^23 = 5 * 10^22
304 {{0x0de76676d0800000ULL, 0x00000000000069e1ULL}
306 , // 1/2 * 10^24 = 5 * 10^23
307 {{0x8b0a00a425000000ULL, 0x00000000000422caULL}
309 , // 1/2 * 10^25 = 5 * 10^24
310 {{0x6e64066972000000ULL, 0x0000000000295be9ULL}
312 , // 1/2 * 10^26 = 5 * 10^25
313 {{0x4fe8401e74000000ULL, 0x00000000019d971eULL}
315 , // 1/2 * 10^27 = 5 * 10^26
316 {{0x1f12813088000000ULL, 0x000000001027e72fULL}
318 , // 1/2 * 10^28 = 5 * 10^27
319 {{0x36b90be550000000ULL, 0x00000000a18f07d7ULL}
321 , // 1/2 * 10^29 = 5 * 10^28
322 {{0x233a76f520000000ULL, 0x000000064f964e68ULL}
324 , // 1/2 * 10^30 = 5 * 10^29
325 {{0x6048a59340000000ULL, 0x0000003f1bdf1011ULL}
327 , // 1/2 * 10^31 = 5 * 10^30
328 {{0xc2d677c080000000ULL, 0x0000027716b6a0adULL}
330 , // 1/2 * 10^32 = 5 * 10^31
331 {{0x9c60ad8500000000ULL, 0x000018a6e32246c9ULL}
333 , // 1/2 * 10^33 = 5 * 10^32
334 {{0x1bc6c73200000000ULL, 0x0000f684df56c3e0ULL}
336 , // 1/2 * 10^34 = 5 * 10^33
337 {{0x15c3c7f400000000ULL, 0x0009a130b963a6c1ULL}
339 , // 1/2 * 10^35 = 5 * 10^34
340 {{0xd9a5cf8800000000ULL, 0x00604be73de4838aULL}
342 , // 1/2 * 10^36 = 5 * 10^35
343 {{0x807a1b5000000000ULL, 0x03c2f7086aed236cULL}
345 , // 1/2 * 10^37 = 5 * 10^36
346 {{0x04c5112000000000ULL, 0x259da6542d43623dULL}
347 } // 1/2 * 10^38 = 5 * 10^37
350 // midpoint192[i - 39] = 1/2 * 10^i = 5 * 10^(i-1), 39 <= i <= 58
351 UINT192 midpoint192[] = { // the 64-bit word order is L, M, H
352 {{0x2fb2ab4000000000ULL, 0x78287f49c4a1d662ULL, 0x0000000000000001ULL}
355 // 1/2 * 10^39 = 5 * 10^38
356 {{0xdcfab08000000000ULL, 0xb194f8e1ae525fd5ULL, 0x000000000000000eULL}
359 // 1/2 * 10^40 = 5 * 10^39
360 {{0xa1cae50000000000ULL, 0xefd1b8d0cf37be5aULL, 0x0000000000000092ULL}
363 // 1/2 * 10^41 = 5 * 10^40
364 {{0x51ecf20000000000ULL, 0x5e313828182d6f8aULL, 0x00000000000005bdULL}
367 // 1/2 * 10^42 = 5 * 10^41
368 {{0x3341740000000000ULL, 0xadec3190f1c65b67ULL, 0x0000000000003965ULL}
371 // 1/2 * 10^43 = 5 * 10^42
372 {{0x008e880000000000ULL, 0xcb39efa971bf9208ULL, 0x0000000000023df8ULL}
375 // 1/2 * 10^44 = 5 * 10^43
376 {{0x0591500000000000ULL, 0xf0435c9e717bb450ULL, 0x0000000000166bb7ULL}
379 // 1/2 * 10^45 = 5 * 10^44
380 {{0x37ad200000000000ULL, 0x62a19e306ed50b20ULL, 0x0000000000e0352fULL}
383 // 1/2 * 10^46 = 5 * 10^45
384 {{0x2cc3400000000000ULL, 0xda502de454526f42ULL, 0x0000000008c213d9ULL}
387 // 1/2 * 10^47 = 5 * 10^46
388 {{0xbfa0800000000000ULL, 0x8721caeb4b385895ULL, 0x000000005794c682ULL}
391 // 1/2 * 10^48 = 5 * 10^47
392 {{0x7c45000000000000ULL, 0x4751ed30f03375d9ULL, 0x000000036bcfc119ULL}
395 // 1/2 * 10^49 = 5 * 10^48
396 {{0xdab2000000000000ULL, 0xc93343e962029a7eULL, 0x00000022361d8afcULL}
399 // 1/2 * 10^50 = 5 * 10^49
400 {{0x8af4000000000000ULL, 0xdc00a71dd41a08f4ULL, 0x000001561d276ddfULL}
403 // 1/2 * 10^51 = 5 * 10^50
404 {{0x6d88000000000000ULL, 0x9806872a4904598dULL, 0x00000d5d238a4abeULL}
407 // 1/2 * 10^52 = 5 * 10^51
408 {{0x4750000000000000ULL, 0xf04147a6da2b7f86ULL, 0x000085a36366eb71ULL}
411 // 1/2 * 10^53 = 5 * 10^52
412 {{0xc920000000000000ULL, 0x628ccc8485b2fb3eULL, 0x00053861e2053273ULL}
415 // 1/2 * 10^54 = 5 * 10^53
416 {{0xdb40000000000000ULL, 0xd97ffd2d38fdd073ULL, 0x003433d2d433f881ULL}
419 // 1/2 * 10^55 = 5 * 10^54
420 {{0x9080000000000000ULL, 0x7effe3c439ea2486ULL, 0x020a063c4a07b512ULL}
423 // 1/2 * 10^56 = 5 * 10^55
424 {{0xa500000000000000ULL, 0xf5fee5aa43256d41ULL, 0x14643e5ae44d12b8ULL}
427 // 1/2 * 10^57 = 5 * 10^56
428 {{0x7200000000000000ULL, 0x9bf4f8a69f764490ULL, 0xcbea6f8ceb02bb39ULL}
430 // 1/2 * 10^58 = 5 * 10^57
433 // midpoint256[i - 59] = 1/2 * 10^i = 5 * 10^(i-1), 59 <= i <= 68
434 UINT256 midpoint256[] = { // the 64-bit word order is LL, LH, HL, HH
435 {{0x7400000000000000ULL, 0x1791b6823a9eada4ULL,
436 0xf7285b812e1b5040ULL, 0x0000000000000007ULL}
438 , // 1/2 * 10^59 = 5 * 10^58
439 {{0x8800000000000000ULL, 0xebb121164a32c86cULL,
440 0xa793930bcd112280ULL, 0x000000000000004fULL}
442 , // 1/2 * 10^60 = 5 * 10^59
443 {{0x5000000000000000ULL, 0x34eb4adee5fbd43dULL,
444 0x8bc3be7602ab5909ULL, 0x000000000000031cULL}
446 , // 1/2 * 10^61 = 5 * 10^60
447 {{0x2000000000000000ULL, 0x1130ecb4fbd64a65ULL,
448 0x75a5709c1ab17a5cULL, 0x0000000000001f1dULL}
450 , // 1/2 * 10^62 = 5 * 10^61
451 {{0x4000000000000000ULL, 0xabe93f11d65ee7f3ULL,
452 0x987666190aeec798ULL, 0x0000000000013726ULL}
454 , // 1/2 * 10^63 = 5 * 10^62
455 {{0x8000000000000000ULL, 0xb71c76b25fb50f80ULL,
456 0xf49ffcfa6d53cbf6ULL, 0x00000000000c2781ULL}
458 , // 1/2 * 10^64 = 5 * 10^63
459 {{0x0000000000000000ULL, 0x271ca2f7bd129b05ULL,
460 0x8e3fe1c84545f7a3ULL, 0x0000000000798b13ULL}
462 , // 1/2 * 10^65 = 5 * 10^64
463 {{0x0000000000000000ULL, 0x871e5dad62ba0e32ULL,
464 0x8e7ed1d2b4bbac5fULL, 0x0000000004bf6ec3ULL}
466 , // 1/2 * 10^66 = 5 * 10^65
467 {{0x0000000000000000ULL, 0x472fa8c5db448df4ULL,
468 0x90f4323b0f54bbbbULL, 0x000000002f7a53a3ULL}
470 , // 1/2 * 10^67 = 5 * 10^66
471 {{0x0000000000000000ULL, 0xc7dc97ba90ad8b88ULL,
472 0xa989f64e994f5550ULL, 0x00000001dac74463ULL}
474 , // 1/2 * 10^68 = 5 * 10^67
475 {{0x0000000000000000ULL, 0xce9ded49a6c77350ULL,
476 0x9f639f11fd195527ULL, 0x000000128bc8abe4ULL}
478 , // 1/2 * 10^69 = 5 * 10^68
479 {{0x0000000000000000ULL, 0x122b44e083ca8120ULL,
480 0x39e436b3e2fd538eULL, 0x000000b975d6b6eeULL}
482 , // 1/2 * 10^70 = 5 * 10^69
483 {{0x0000000000000000ULL, 0xb5b0b0c525e90b40ULL,
484 0x42ea2306dde5438cULL, 0x0000073e9a63254eULL}
486 , // 1/2 * 10^71 = 5 * 10^70
487 {{0x0000000000000000ULL, 0x18e6e7b37b1a7080ULL,
488 0x9d255e44aaf4a37fULL, 0x0000487207df750eULL}
490 , // 1/2 * 10^72 = 5 * 10^71
491 {{0x0000000000000000ULL, 0xf9050d02cf086500ULL,
492 0x2375aeaead8e62f6ULL, 0x0002d4744eba9292ULL}
494 , // 1/2 * 10^73 = 5 * 10^72
495 {{0x0000000000000000ULL, 0xba32821c1653f200ULL,
496 0x6298d2d2c78fdda5ULL, 0x001c4c8b1349b9b5ULL}
498 , // 1/2 * 10^74 = 5 * 10^73
499 {{0x0000000000000000ULL, 0x45f91518df477400ULL,
500 0xd9f83c3bcb9ea879ULL, 0x011afd6ec0e14115ULL}
502 , // 1/2 * 10^75 = 5 * 10^74
503 {{0x0000000000000000ULL, 0xbbbad2f8b8ca8800ULL,
504 0x83b25a55f43294bcULL, 0x0b0de65388cc8adaULL}
506 , // 1/2 * 10^76 = 5 * 10^75
507 {{0x0000000000000000ULL, 0x554c3db737e95000ULL,
508 0x24f7875b89f9cf5fULL, 0x6e8aff4357fd6c89ULL}
509 } // 1/2 * 10^77 = 5 * 10^76
512 // ten2k64[i] = 10^i, 0 <= i <= 19
513 UINT64 ten2k64[] = {
514 0x0000000000000001ULL, // 10^0
515 0x000000000000000aULL, // 10^1
516 0x0000000000000064ULL, // 10^2
517 0x00000000000003e8ULL, // 10^3
518 0x0000000000002710ULL, // 10^4
519 0x00000000000186a0ULL, // 10^5
520 0x00000000000f4240ULL, // 10^6
521 0x0000000000989680ULL, // 10^7
522 0x0000000005f5e100ULL, // 10^8
523 0x000000003b9aca00ULL, // 10^9
524 0x00000002540be400ULL, // 10^10
525 0x000000174876e800ULL, // 10^11
526 0x000000e8d4a51000ULL, // 10^12
527 0x000009184e72a000ULL, // 10^13
528 0x00005af3107a4000ULL, // 10^14
529 0x00038d7ea4c68000ULL, // 10^15
530 0x002386f26fc10000ULL, // 10^16
531 0x016345785d8a0000ULL, // 10^17
532 0x0de0b6b3a7640000ULL, // 10^18
533 0x8ac7230489e80000ULL // 10^19 (20 digits)
537 // ten2k128[i - 20] = 10^i, 20 <= i <= 38
538 UINT128 ten2k128[] = { // the 64-bit word order is L, H
539 {{0x6bc75e2d63100000ULL, 0x0000000000000005ULL}
541 , // 10^20
542 {{0x35c9adc5dea00000ULL, 0x0000000000000036ULL}
544 , // 10^21
545 {{0x19e0c9bab2400000ULL, 0x000000000000021eULL}
547 , // 10^22
548 {{0x02c7e14af6800000ULL, 0x000000000000152dULL}
550 , // 10^23
551 {{0x1bcecceda1000000ULL, 0x000000000000d3c2ULL}
553 , // 10^24
554 {{0x161401484a000000ULL, 0x0000000000084595ULL}
556 , // 10^25
557 {{0xdcc80cd2e4000000ULL, 0x000000000052b7d2ULL}
559 , // 10^26
560 {{0x9fd0803ce8000000ULL, 0x00000000033b2e3cULL}
562 , // 10^27
563 {{0x3e25026110000000ULL, 0x00000000204fce5eULL}
565 , // 10^28
566 {{0x6d7217caa0000000ULL, 0x00000001431e0faeULL}
568 , // 10^29
569 {{0x4674edea40000000ULL, 0x0000000c9f2c9cd0ULL}
571 , // 10^30
572 {{0xc0914b2680000000ULL, 0x0000007e37be2022ULL}
574 , // 10^31
575 {{0x85acef8100000000ULL, 0x000004ee2d6d415bULL}
577 , // 10^32
578 {{0x38c15b0a00000000ULL, 0x0000314dc6448d93ULL}
580 , // 10^33
581 {{0x378d8e6400000000ULL, 0x0001ed09bead87c0ULL}
583 , // 10^34
584 {{0x2b878fe800000000ULL, 0x0013426172c74d82ULL}
586 , // 10^35
587 {{0xb34b9f1000000000ULL, 0x00c097ce7bc90715ULL}
589 , // 10^36
590 {{0x00f436a000000000ULL, 0x0785ee10d5da46d9ULL}
592 , // 10^37
593 {{0x098a224000000000ULL, 0x4b3b4ca85a86c47aULL}
594 } // 10^38 (39 digits)
597 // might split into ten2k192[] and ten2k256[]
599 // ten2k256[i - 39] = 10^i, 39 <= i <= 68
600 UINT256 ten2k256[] = { // the 64-bit word order is LL, LH, HL, HH
601 {{0x5f65568000000000ULL, 0xf050fe938943acc4ULL,
602 0x0000000000000002ULL, 0x0000000000000000ULL}
604 , // 10^39
605 {{0xb9f5610000000000ULL, 0x6329f1c35ca4bfabULL,
606 0x000000000000001dULL, 0x0000000000000000ULL}
608 , // 10^40
609 {{0x4395ca0000000000ULL, 0xdfa371a19e6f7cb5ULL,
610 0x0000000000000125ULL, 0x0000000000000000ULL}
612 , // 10^41
613 {{0xa3d9e40000000000ULL, 0xbc627050305adf14ULL,
614 0x0000000000000b7aULL, 0x0000000000000000ULL}
616 , // 10^42
617 {{0x6682e80000000000ULL, 0x5bd86321e38cb6ceULL,
618 0x00000000000072cbULL, 0x0000000000000000ULL}
620 , // 10^43
621 {{0x011d100000000000ULL, 0x9673df52e37f2410ULL,
622 0x0000000000047bf1ULL, 0x0000000000000000ULL}
624 , // 10^44
625 {{0x0b22a00000000000ULL, 0xe086b93ce2f768a0ULL,
626 0x00000000002cd76fULL, 0x0000000000000000ULL}
628 , // 10^45
629 {{0x6f5a400000000000ULL, 0xc5433c60ddaa1640ULL,
630 0x0000000001c06a5eULL, 0x0000000000000000ULL}
632 , // 10^46
633 {{0x5986800000000000ULL, 0xb4a05bc8a8a4de84ULL,
634 0x00000000118427b3ULL, 0x0000000000000000ULL}
636 , // 10^47
637 {{0x7f41000000000000ULL, 0x0e4395d69670b12bULL,
638 0x00000000af298d05ULL, 0x0000000000000000ULL}
640 , // 10^48
641 {{0xf88a000000000000ULL, 0x8ea3da61e066ebb2ULL,
642 0x00000006d79f8232ULL, 0x0000000000000000ULL}
644 , // 10^49
645 {{0xb564000000000000ULL, 0x926687d2c40534fdULL,
646 0x000000446c3b15f9ULL, 0x0000000000000000ULL}
648 , // 10^50
649 {{0x15e8000000000000ULL, 0xb8014e3ba83411e9ULL,
650 0x000002ac3a4edbbfULL, 0x0000000000000000ULL}
652 , // 10^51
653 {{0xdb10000000000000ULL, 0x300d0e549208b31aULL,
654 0x00001aba4714957dULL, 0x0000000000000000ULL}
656 , // 10^52
657 {{0x8ea0000000000000ULL, 0xe0828f4db456ff0cULL,
658 0x00010b46c6cdd6e3ULL, 0x0000000000000000ULL}
660 , // 10^53
661 {{0x9240000000000000ULL, 0xc51999090b65f67dULL,
662 0x000a70c3c40a64e6ULL, 0x0000000000000000ULL}
664 , // 10^54
665 {{0xb680000000000000ULL, 0xb2fffa5a71fba0e7ULL,
666 0x006867a5a867f103ULL, 0x0000000000000000ULL}
668 , // 10^55
669 {{0x2100000000000000ULL, 0xfdffc78873d4490dULL,
670 0x04140c78940f6a24ULL, 0x0000000000000000ULL}
672 , // 10^56
673 {{0x4a00000000000000ULL, 0xebfdcb54864ada83ULL,
674 0x28c87cb5c89a2571ULL, 0x0000000000000000ULL}
676 , // 10^57 (58 digits)
677 {{0xe400000000000000ULL, 0x37e9f14d3eec8920ULL,
678 0x97d4df19d6057673ULL, 0x0000000000000001ULL}
680 , // 10^58
681 {{0xe800000000000000ULL, 0x2f236d04753d5b48ULL,
682 0xee50b7025c36a080ULL, 0x000000000000000fULL}
684 , // 10^59
685 {{0x1000000000000000ULL, 0xd762422c946590d9ULL,
686 0x4f2726179a224501ULL, 0x000000000000009fULL}
688 , // 10^60
689 {{0xa000000000000000ULL, 0x69d695bdcbf7a87aULL,
690 0x17877cec0556b212ULL, 0x0000000000000639ULL}
692 , // 10^61
693 {{0x4000000000000000ULL, 0x2261d969f7ac94caULL,
694 0xeb4ae1383562f4b8ULL, 0x0000000000003e3aULL}
696 , // 10^62
697 {{0x8000000000000000ULL, 0x57d27e23acbdcfe6ULL,
698 0x30eccc3215dd8f31ULL, 0x0000000000026e4dULL}
700 , // 10^63
701 {{0x0000000000000000ULL, 0x6e38ed64bf6a1f01ULL,
702 0xe93ff9f4daa797edULL, 0x0000000000184f03ULL}
704 , // 10^64
705 {{0x0000000000000000ULL, 0x4e3945ef7a25360aULL,
706 0x1c7fc3908a8bef46ULL, 0x0000000000f31627ULL}
708 , // 10^65
709 {{0x0000000000000000ULL, 0x0e3cbb5ac5741c64ULL,
710 0x1cfda3a5697758bfULL, 0x00000000097edd87ULL}
712 , // 10^66
713 {{0x0000000000000000ULL, 0x8e5f518bb6891be8ULL,
714 0x21e864761ea97776ULL, 0x000000005ef4a747ULL}
716 , // 10^67
717 {{0x0000000000000000ULL, 0x8fb92f75215b1710ULL,
718 0x5313ec9d329eaaa1ULL, 0x00000003b58e88c7ULL}
720 , // 10^68
721 {{0x0000000000000000ULL, 0x9d3bda934d8ee6a0ULL,
722 0x3ec73e23fa32aa4fULL, 0x00000025179157c9ULL}
724 , // 10^69
725 {{0x0000000000000000ULL, 0x245689c107950240ULL,
726 0x73c86d67c5faa71cULL, 0x00000172ebad6ddcULL}
728 , // 10^70
729 {{0x0000000000000000ULL, 0x6b61618a4bd21680ULL,
730 0x85d4460dbbca8719ULL, 0x00000e7d34c64a9cULL}
732 , // 10^71
733 {{0x0000000000000000ULL, 0x31cdcf66f634e100ULL,
734 0x3a4abc8955e946feULL, 0x000090e40fbeea1dULL}
736 , // 10^72
737 {{0x0000000000000000ULL, 0xf20a1a059e10ca00ULL,
738 0x46eb5d5d5b1cc5edULL, 0x0005a8e89d752524ULL}
740 , // 10^73
741 {{0x0000000000000000ULL, 0x746504382ca7e400ULL,
742 0xc531a5a58f1fbb4bULL, 0x003899162693736aULL}
744 , // 10^74
745 {{0x0000000000000000ULL, 0x8bf22a31be8ee800ULL,
746 0xb3f07877973d50f2ULL, 0x0235fadd81c2822bULL}
748 , // 10^75
749 {{0x0000000000000000ULL, 0x7775a5f171951000ULL,
750 0x0764b4abe8652979ULL, 0x161bcca7119915b5ULL}
752 , // 10^76
753 {{0x0000000000000000ULL, 0xaa987b6e6fd2a000ULL,
754 0x49ef0eb713f39ebeULL, 0xdd15fe86affad912ULL}
755 } // 10^77
758 // ten2mk128[k - 1] = 10^(-k) * 2^exp (k), where 1 <= k <= 34 and
759 // exp (k) = shiftright128[k - 1] + 128
760 UINT128 ten2mk128[] = {
761 {{0x999999999999999aULL, 0x1999999999999999ULL}
763 , // 10^(-1) * 2^128
764 {{0x28f5c28f5c28f5c3ULL, 0x028f5c28f5c28f5cULL}
766 , // 10^(-2) * 2^128
767 {{0x9db22d0e56041894ULL, 0x004189374bc6a7efULL}
769 , // 10^(-3) * 2^128
770 {{0x4af4f0d844d013aaULL, 0x00346dc5d6388659ULL}
772 , // 10^(-4) * 2^131
773 {{0x08c3f3e0370cdc88ULL, 0x0029f16b11c6d1e1ULL}
775 , // 10^(-5) * 2^134
776 {{0x6d698fe69270b06dULL, 0x00218def416bdb1aULL}
778 , // 10^(-6) * 2^137
779 {{0xaf0f4ca41d811a47ULL, 0x0035afe535795e90ULL}
781 , // 10^(-7) * 2^141
782 {{0xbf3f70834acdaea0ULL, 0x002af31dc4611873ULL}
784 , // 10^(-8) * 2^144
785 {{0x65cc5a02a23e254dULL, 0x00225c17d04dad29ULL}
787 , // 10^(-9) * 2^147
788 {{0x6fad5cd10396a214ULL, 0x0036f9bfb3af7b75ULL}
790 , // 10^(-10) * 2^151
791 {{0xbfbde3da69454e76ULL, 0x002bfaffc2f2c92aULL}
793 , // 10^(-11) * 2^154
794 {{0x32fe4fe1edd10b92ULL, 0x00232f33025bd422ULL}
796 , // 10^(-12) * 2^157
797 {{0x84ca19697c81ac1cULL, 0x00384b84d092ed03ULL}
799 , // 10^(-13) * 2^161
800 {{0x03d4e1213067bce4ULL, 0x002d09370d425736ULL}
802 , // 10^(-14) * 2^164
803 {{0x3643e74dc052fd83ULL, 0x0024075f3dceac2bULL}
805 , // 10^(-15) * 2^167
806 {{0x56d30baf9a1e626bULL, 0x0039a5652fb11378ULL}
808 , // 10^(-16) * 2^171
809 {{0x12426fbfae7eb522ULL, 0x002e1dea8c8da92dULL}
811 , // 10^(-17) * 2^174
812 {{0x41cebfcc8b9890e8ULL, 0x0024e4bba3a48757ULL}
814 , // 10^(-18) * 2^177
815 {{0x694acc7a78f41b0dULL, 0x003b07929f6da558ULL}
817 , // 10^(-19) * 2^181
818 {{0xbaa23d2ec729af3eULL, 0x002f394219248446ULL}
820 , // 10^(-20) * 2^184
821 {{0xfbb4fdbf05baf298ULL, 0x0025c768141d369eULL}
823 , // 10^(-21) * 2^187
824 {{0x2c54c931a2c4b759ULL, 0x003c7240202ebdcbULL}
826 , // 10^(-22) * 2^191
827 {{0x89dd6dc14f03c5e1ULL, 0x00305b66802564a2ULL}
829 , // 10^(-23) * 2^194
830 {{0xd4b1249aa59c9e4eULL, 0x0026af8533511d4eULL}
832 , // 10^(-24) * 2^197
833 {{0x544ea0f76f60fd49ULL, 0x003de5a1ebb4fbb1ULL}
835 , // 10^(-25) * 2^201
836 {{0x76a54d92bf80caa1ULL, 0x00318481895d9627ULL}
838 , // 10^(-26) * 2^204
839 {{0x921dd7a89933d54eULL, 0x00279d346de4781fULL}
841 , // 10^(-27) * 2^207
842 {{0x8362f2a75b862215ULL, 0x003f61ed7ca0c032ULL}
844 , // 10^(-28) * 2^211
845 {{0xcf825bb91604e811ULL, 0x0032b4bdfd4d668eULL}
847 , // 10^(-29) * 2^214
848 {{0x0c684960de6a5341ULL, 0x00289097fdd7853fULL}
850 , // 10^(-30) * 2^217
851 {{0x3d203ab3e521dc34ULL, 0x002073accb12d0ffULL}
853 , // 10^(-31) * 2^220
854 {{0x2e99f7863b696053ULL, 0x0033ec47ab514e65ULL}
856 , // 10^(-32) * 2^224
857 {{0x587b2c6b62bab376ULL, 0x002989d2ef743eb7ULL}
859 , // 10^(-33) * 2^227
860 {{0xad2f56bc4efbc2c5ULL, 0x00213b0f25f69892ULL}
862 , // 10^(-34) * 2^230
866 // shiftright128[] contains the right shift count to obtain C2* from the top
867 // 128 bits of the 128x128-bit product C2 * Kx
868 int shiftright128[] = {
869 0, // 128 - 128
870 0, // 128 - 128
871 0, // 128 - 128
873 3, // 131 - 128
874 6, // 134 - 128
875 9, // 137 - 128
876 13, // 141 - 128
877 16, // 144 - 128
878 19, // 147 - 128
879 23, // 151 - 128
880 26, // 154 - 128
881 29, // 157 - 128
882 33, // 161 - 128
883 36, // 164 - 128
884 39, // 167 - 128
885 43, // 171 - 128
886 46, // 174 - 128
887 49, // 177 - 128
888 53, // 181 - 128
889 56, // 184 - 128
890 59, // 187 - 128
891 63, // 191 - 128
893 66, // 194 - 128
894 69, // 197 - 128
895 73, // 201 - 128
896 76, // 204 - 128
897 79, // 207 - 128
898 83, // 211 - 128
899 86, // 214 - 128
900 89, // 217 - 128
901 92, // 220 - 128
902 96, // 224 - 128
903 99, // 227 - 128
904 102 // 230 - 128
908 // maskhigh128[] contains the mask to apply to the top 128 bits of the
909 // 128x128-bit product in order to obtain the high bits of f2*
910 // the 64-bit word order is L, H
911 UINT64 maskhigh128[] = {
912 0x0000000000000000ULL, // 0 = 128 - 128 bits
913 0x0000000000000000ULL, // 0 = 128 - 128 bits
914 0x0000000000000000ULL, // 0 = 128 - 128 bits
915 0x0000000000000007ULL, // 3 = 131 - 128 bits
916 0x000000000000003fULL, // 6 = 134 - 128 bits
917 0x00000000000001ffULL, // 9 = 137 - 128 bits
918 0x0000000000001fffULL, // 13 = 141 - 128 bits
919 0x000000000000ffffULL, // 16 = 144 - 128 bits
920 0x000000000007ffffULL, // 19 = 147 - 128 bits
921 0x00000000007fffffULL, // 23 = 151 - 128 bits
922 0x0000000003ffffffULL, // 26 = 154 - 128 bits
923 0x000000001fffffffULL, // 29 = 157 - 128 bits
924 0x00000001ffffffffULL, // 33 = 161 - 128 bits
925 0x0000000fffffffffULL, // 36 = 164 - 128 bits
926 0x0000007fffffffffULL, // 39 = 167 - 128 bits
927 0x000007ffffffffffULL, // 43 = 171 - 128 bits
928 0x00003fffffffffffULL, // 46 = 174 - 128 bits
929 0x0001ffffffffffffULL, // 49 = 177 - 128 bits
930 0x001fffffffffffffULL, // 53 = 181 - 128 bits
931 0x00ffffffffffffffULL, // 56 = 184 - 128 bits
932 0x07ffffffffffffffULL, // 59 = 187 - 128 bits
933 0x7fffffffffffffffULL, // 63 = 191 - 128 bits
934 0x0000000000000003ULL, // 2 = 194 - 192 bits
935 0x000000000000001fULL, // 5 = 197 - 192 bits
936 0x00000000000001ffULL, // 9 = 201 - 192 bits
937 0x0000000000000fffULL, // 12 = 204 - 192 bits
938 0x0000000000007fffULL, // 15 = 207 - 192 bits
939 0x000000000007ffffULL, // 21 = 211 - 192 bits
940 0x00000000003fffffULL, // 22 = 214 - 192 bits
941 0x0000000001ffffffULL, // 25 = 217 - 192 bits
942 0x000000000fffffffULL, // 28 = 220 - 192 bits
943 0x00000000ffffffffULL, // 32 = 224 - 192 bits
944 0x00000007ffffffffULL, // 35 = 227 - 192 bits
945 0x0000003fffffffffULL // 38 = 230 - 192 bits
949 // onehalf128[] contains the high bits of 1/2 positioned correctly for
950 // comparison with the high bits of f2*
951 // the 64-bit word order is L, H
952 UINT64 onehalf128[] = {
953 0x0000000000000000ULL, // 0 bits
954 0x0000000000000000ULL, // 0 bits
955 0x0000000000000000ULL, // 0 bits
956 0x0000000000000004ULL, // 3 bits
957 0x0000000000000020ULL, // 6 bits
958 0x0000000000000100ULL, // 9 bits
959 0x0000000000001000ULL, // 13 bits
960 0x0000000000008000ULL, // 16 bits
961 0x0000000000040000ULL, // 19 bits
962 0x0000000000400000ULL, // 23 bits
963 0x0000000002000000ULL, // 26 bits
964 0x0000000010000000ULL, // 29 bits
965 0x0000000100000000ULL, // 33 bits
966 0x0000000800000000ULL, // 36 bits
967 0x0000004000000000ULL, // 39 bits
968 0x0000040000000000ULL, // 43 bits
969 0x0000200000000000ULL, // 46 bits
970 0x0001000000000000ULL, // 49 bits
971 0x0010000000000000ULL, // 53 bits
972 0x0080000000000000ULL, // 56 bits
973 0x0400000000000000ULL, // 59 bits
974 0x4000000000000000ULL, // 63 bits
975 0x0000000000000002ULL, // 66 bits
976 0x0000000000000010ULL, // 69 bits
977 0x0000000000000100ULL, // 73 bits
978 0x0000000000000800ULL, // 76 bits
979 0x0000000000004000ULL, // 79 bits
980 0x0000000000040000ULL, // 83 bits
981 0x0000000000200000ULL, // 86 bits
982 0x0000000001000000ULL, // 89 bits
983 0x0000000008000000ULL, // 92 bits
984 0x0000000080000000ULL, // 96 bits
985 0x0000000400000000ULL, // 99 bits
986 0x0000002000000000ULL // 102 bits
989 UINT64 ten2mk64[] = {
990 0x199999999999999aULL, // 10^(-1) * 2^ 64
991 0x028f5c28f5c28f5dULL, // 10^(-2) * 2^ 64
992 0x004189374bc6a7f0ULL, // 10^(-3) * 2^ 64
993 0x00346dc5d638865aULL, // 10^(-4) * 2^ 67
994 0x0029f16b11c6d1e2ULL, // 10^(-5) * 2^ 70
995 0x00218def416bdb1bULL, // 10^(-6) * 2^ 73
996 0x0035afe535795e91ULL, // 10^(-7) * 2^ 77
997 0x002af31dc4611874ULL, // 10^(-8) * 2^ 80
998 0x00225c17d04dad2aULL, // 10^(-9) * 2^ 83
999 0x0036f9bfb3af7b76ULL, // 10^(-10) * 2^ 87
1000 0x002bfaffc2f2c92bULL, // 10^(-11) * 2^ 90
1001 0x00232f33025bd423ULL, // 10^(-12) * 2^ 93
1002 0x00384b84d092ed04ULL, // 10^(-13) * 2^ 97
1003 0x002d09370d425737ULL, // 10^(-14) * 2^100
1004 0x0024075f3dceac2cULL, // 10^(-15) * 2^103
1005 0x0039a5652fb11379ULL, // 10^(-16) * 2^107
1008 // ten2mk128trunc[] contains T*, the top Ex >= 128 bits of 10^(-k),
1009 // for 1 <= k <= 34
1010 // the 64-bit word order is L, H
1011 UINT128 ten2mk128trunc[] = {
1012 {{0x9999999999999999ULL, 0x1999999999999999ULL}}, // 10^(-1) * 2^128
1013 {{0x28f5c28f5c28f5c2ULL, 0x028f5c28f5c28f5cULL}}, // 10^(-2) * 2^128
1014 {{0x9db22d0e56041893ULL, 0x004189374bc6a7efULL}}, // 10^(-3) * 2^128
1015 {{0x4af4f0d844d013a9ULL, 0x00346dc5d6388659ULL}}, // 10^(-4) * 2^131
1016 {{0x08c3f3e0370cdc87ULL, 0x0029f16b11c6d1e1ULL}}, // 10^(-5) * 2^134
1017 {{0x6d698fe69270b06cULL, 0x00218def416bdb1aULL}}, // 10^(-6) * 2^137
1018 {{0xaf0f4ca41d811a46ULL, 0x0035afe535795e90ULL}}, // 10^(-7) * 2^141
1019 {{0xbf3f70834acdae9fULL, 0x002af31dc4611873ULL}}, // 10^(-8) * 2^144
1020 {{0x65cc5a02a23e254cULL, 0x00225c17d04dad29ULL}}, // 10^(-9) * 2^147
1021 {{0x6fad5cd10396a213ULL, 0x0036f9bfb3af7b75ULL}}, // 10^(-10) * 2^151
1022 {{0xbfbde3da69454e75ULL, 0x002bfaffc2f2c92aULL}}, // 10^(-11) * 2^154
1023 {{0x32fe4fe1edd10b91ULL, 0x00232f33025bd422ULL}}, // 10^(-12) * 2^157
1024 {{0x84ca19697c81ac1bULL, 0x00384b84d092ed03ULL}}, // 10^(-13) * 2^161
1025 {{0x03d4e1213067bce3ULL, 0x002d09370d425736ULL}}, // 10^(-14) * 2^164
1026 {{0x3643e74dc052fd82ULL, 0x0024075f3dceac2bULL}}, // 10^(-15) * 2^167
1027 {{0x56d30baf9a1e626aULL, 0x0039a5652fb11378ULL}}, // 10^(-16) * 2^171
1028 {{0x12426fbfae7eb521ULL, 0x002e1dea8c8da92dULL}}, // 10^(-17) * 2^174
1029 {{0x41cebfcc8b9890e7ULL, 0x0024e4bba3a48757ULL}}, // 10^(-18) * 2^177
1030 {{0x694acc7a78f41b0cULL, 0x003b07929f6da558ULL}}, // 10^(-19) * 2^181
1031 {{0xbaa23d2ec729af3dULL, 0x002f394219248446ULL}}, // 10^(-20) * 2^184
1032 {{0xfbb4fdbf05baf297ULL, 0x0025c768141d369eULL}}, // 10^(-21) * 2^187
1033 {{0x2c54c931a2c4b758ULL, 0x003c7240202ebdcbULL}}, // 10^(-22) * 2^191
1034 {{0x89dd6dc14f03c5e0ULL, 0x00305b66802564a2ULL}}, // 10^(-23) * 2^194
1035 {{0xd4b1249aa59c9e4dULL, 0x0026af8533511d4eULL}}, // 10^(-24) * 2^197
1036 {{0x544ea0f76f60fd48ULL, 0x003de5a1ebb4fbb1ULL}}, // 10^(-25) * 2^201
1037 {{0x76a54d92bf80caa0ULL, 0x00318481895d9627ULL}}, // 10^(-26) * 2^204
1038 {{0x921dd7a89933d54dULL, 0x00279d346de4781fULL}}, // 10^(-27) * 2^207
1039 {{0x8362f2a75b862214ULL, 0x003f61ed7ca0c032ULL}}, // 10^(-28) * 2^211
1040 {{0xcf825bb91604e810ULL, 0x0032b4bdfd4d668eULL}}, // 10^(-29) * 2^214
1041 {{0x0c684960de6a5340ULL, 0x00289097fdd7853fULL}}, // 10^(-30) * 2^217
1042 {{0x3d203ab3e521dc33ULL, 0x002073accb12d0ffULL}}, // 10^(-31) * 2^220
1043 {{0x2e99f7863b696052ULL, 0x0033ec47ab514e65ULL}}, // 10^(-32) * 2^224
1044 {{0x587b2c6b62bab375ULL, 0x002989d2ef743eb7ULL}}, // 10^(-33) * 2^227
1045 {{0xad2f56bc4efbc2c4ULL, 0x00213b0f25f69892ULL}}, // 10^(-34) * 2^230
1048 // ten2mk128M[k - 1] = 10^(-k) * 2^exp (k), where 1 <= k <= 4 and
1049 // exp (k) = shiftright128[k - 1] + 128
1050 // the 64-bit word order is L, H
1051 UINT128 ten2mk128M[] = {
1052 {{0xcccccccccccccccdULL, 0xccccccccccccccccULL}}, // 10^(-1) * 2^131
1053 {{0x3d70a3d70a3d70a4ULL, 0xa3d70a3d70a3d70aULL}}, // 10^(-2) * 2^134
1054 {{0x645a1cac083126eaULL, 0x83126e978d4fdf3bULL}}, // 10^(-3) * 2^137
1055 {{0xd3c36113404ea4a9ULL, 0xd1b71758e219652bULL}} // 10^(-4) * 2^141
1058 // ten2mk128truncM[] contains T*, the top Ex >= 128 bits of 10^(-k),
1059 // for 1 <= k <= 4; the top bits which are 0 are not represented
1060 // the 64-bit word order is L, H
1061 UINT128 ten2mk128truncM[] = {
1062 {{0xccccccccccccccccULL, 0xccccccccccccccccULL}}, // 10^(-1) * 2^131
1063 {{0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}}, // 10^(-2) * 2^134
1064 {{0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}}, // 10^(-3) * 2^137
1065 {{0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}} // 10^(-4) * 2^141
1068 // shiftright128M[] contains the right shift count to obtain C2* from the top
1069 // 128 bits of the 128x128-bit product C2 * Kx
1070 int shiftright128M[] = {
1071 3, // 131 - 128
1072 6, // 134 - 128
1073 9, // 137 - 128
1074 13 // 141 - 128
1077 // maskhigh128M[] contains the mask to apply to the top 128 bits of the
1078 // 128x128-bit product in order to obtain the high bits of f*
1079 // the high 64 bits of the mask are 0, so only the low 64 bits are represented
1080 UINT64 maskhigh128M[] = {
1081 0x0000000000000007ULL, // 3 = 131 - 128 bits
1082 0x000000000000003fULL, // 6 = 134 - 128 bits
1083 0x00000000000001ffULL, // 9 = 137 - 128 bits
1084 0x0000000000001fffULL // 13 = 141 - 128 bits
1087 // onehalf128M[] contains 1/2 positioned correctly for
1088 // comparison with the high bits of f*
1089 // the high 64 bits are 0, so only the low 64 bits are represented
1090 UINT64 onehalf128M[] = {
1091 0x0000000000000004ULL, // 3 bits
1092 0x0000000000000020ULL, // 6 bits
1093 0x0000000000000100ULL, // 9 bits
1094 0x0000000000001000ULL // 13 bits
1097 // ten2mk192M[k - 1] = 10^(-k-4) * 2^exp (k), where 1 <= k <= 19 and
1098 // exp (k) = shiftright128[k - 1] + 128
1099 // the 64-bit word order is L, M, H
1100 UINT192 ten2mk192M[] = {
1101 {{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL,
1102 0xa7c5ac471b478423ULL}},
1103 // 10^(-5) * 2^208
1104 {{0xd7e45803cd141a6aULL, 0xa63f9a49c2c1b10fULL,
1105 0x8637bd05af6c69b5ULL}},
1106 // 10^(-6) * 2^211
1107 {{0x8ca08cd2e1b9c3dcULL, 0x3d32907604691b4cULL,
1108 0xd6bf94d5e57a42bcULL}},
1109 // 10^(-7) * 2^215
1110 {{0x3d4d3d758161697dULL, 0xfdc20d2b36ba7c3dULL,
1111 0xabcc77118461cefcULL}},
1112 // 10^(-8) * 2^218
1113 {{0xfdd7645e011abacaULL, 0x31680a88f8953030ULL,
1114 0x89705f4136b4a597ULL}},
1115 // 10^(-9) * 2^221
1116 {{0x2fbf06fcce912addULL, 0xb573440e5a884d1bULL,
1117 0xdbe6fecebdedd5beULL}},
1118 // 10^(-10) * 2^225
1119 {{0xf2ff38ca3eda88b1ULL, 0xf78f69a51539d748ULL,
1120 0xafebff0bcb24aafeULL}},
1121 // 10^(-11) * 2^228
1122 {{0xf598fa3b657ba08eULL, 0xf93f87b7442e45d3ULL,
1123 0x8cbccc096f5088cbULL}},
1124 // 10^(-12) * 2^231
1125 {{0x88f4c3923bf900e3ULL, 0x2865a5f206b06fb9ULL,
1126 0xe12e13424bb40e13ULL}},
1127 // 10^(-13) * 2^235
1128 {{0x6d909c74fcc733e9ULL, 0x538484c19ef38c94ULL,
1129 0xb424dc35095cd80fULL}},
1130 // 10^(-14) * 2^238
1131 {{0x57a6e390ca38f654ULL, 0x0f9d37014bf60a10ULL,
1132 0x901d7cf73ab0acd9ULL}},
1133 // 10^(-15) * 2^241
1134 {{0xbf716c1add27f086ULL, 0x4c2ebe687989a9b3ULL,
1135 0xe69594bec44de15bULL}},
1136 // 10^(-16) * 2^245
1137 {{0xff8df0157db98d38ULL, 0x09befeb9fad487c2ULL,
1138 0xb877aa3236a4b449ULL}},
1139 // 10^(-17) * 2^248
1140 {{0x32d7f344649470faULL, 0x3aff322e62439fcfULL,
1141 0x9392ee8e921d5d07ULL}},
1142 // 10^(-18) * 2^251
1143 {{0x1e2652070753e7f5ULL, 0x2b31e9e3d06c32e5ULL,
1144 0xec1e4a7db69561a5ULL}},
1145 // 10^(-19) * 2^255
1146 {{0x181ea8059f76532bULL, 0x88f4bb1ca6bcf584ULL,
1147 0xbce5086492111aeaULL}},
1148 // 10^(-20) * 2^258
1149 {{0x467eecd14c5ea8efULL, 0xd3f6fc16ebca5e03ULL,
1150 0x971da05074da7beeULL}},
1151 // 10^(-21) * 2^261
1152 {{0x70cb148213caa7e5ULL, 0x5324c68b12dd6338ULL,
1153 0xf1c90080baf72cb1ULL}},
1154 // 10^(-22) * 2^265
1155 {{0x8d6f439b43088651ULL, 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}}
1156 // 10^(-23) * 2^268
1159 // ten2mk192truncM[] contains T*, the top Ex >= 192 bits of 10^(-k),
1160 // for 5 <= k <= 23; the top bits which are 0 are not represented
1161 // the 64-bit word order is L, M, H
1162 UINT192 ten2mk192truncM[] = {
1163 {{0xcddd6e04c0592103ULL, 0x0fcf80dc33721d53ULL,
1164 0xa7c5ac471b478423ULL}},
1165 // 10^(-5) * 2^208
1166 {{0xd7e45803cd141a69ULL, 0xa63f9a49c2c1b10fULL,
1167 0x8637bd05af6c69b5ULL}},
1168 // 10^(-6) * 2^211
1169 {{0x8ca08cd2e1b9c3dbULL, 0x3d32907604691b4cULL,
1170 0xd6bf94d5e57a42bcULL}},
1171 // 10^(-7) * 2^215
1172 {{0x3d4d3d758161697cULL, 0xfdc20d2b36ba7c3dULL,
1173 0xabcc77118461cefcULL}},
1174 // 10^(-8) * 2^218
1175 {{0xfdd7645e011abac9ULL, 0x31680a88f8953030ULL,
1176 0x89705f4136b4a597ULL}},
1177 // 10^(-9) * 2^221
1178 {{0x2fbf06fcce912adcULL, 0xb573440e5a884d1bULL,
1179 0xdbe6fecebdedd5beULL}},
1180 // 10^(-10) * 2^225
1181 {{0xf2ff38ca3eda88b0ULL, 0xf78f69a51539d748ULL,
1182 0xafebff0bcb24aafeULL}},
1183 // 10^(-11) * 2^228
1184 {{0xf598fa3b657ba08dULL, 0xf93f87b7442e45d3ULL,
1185 0x8cbccc096f5088cbULL}},
1186 // 10^(-12) * 2^231
1187 {{0x88f4c3923bf900e2ULL, 0x2865a5f206b06fb9ULL,
1188 0xe12e13424bb40e13ULL}},
1189 // 10^(-13) * 2^235
1190 {{0x6d909c74fcc733e8ULL, 0x538484c19ef38c94ULL,
1191 0xb424dc35095cd80fULL}},
1192 // 10^(-14) * 2^238
1193 {{0x57a6e390ca38f653ULL, 0x0f9d37014bf60a10ULL,
1194 0x901d7cf73ab0acd9ULL}},
1195 // 10^(-15) * 2^241
1196 {{0xbf716c1add27f085ULL, 0x4c2ebe687989a9b3ULL,
1197 0xe69594bec44de15bULL}},
1198 // 10^(-16) * 2^245
1199 {{0xff8df0157db98d37ULL, 0x09befeb9fad487c2ULL,
1200 0xb877aa3236a4b449ULL}},
1201 // 10^(-17) * 2^248
1202 {{0x32d7f344649470f9ULL, 0x3aff322e62439fcfULL,
1203 0x9392ee8e921d5d07ULL}},
1204 // 10^(-18) * 2^251
1205 {{0x1e2652070753e7f4ULL, 0x2b31e9e3d06c32e5ULL,
1206 0xec1e4a7db69561a5ULL}},
1207 // 10^(-19) * 2^255
1208 {{0x181ea8059f76532aULL, 0x88f4bb1ca6bcf584ULL,
1209 0xbce5086492111aeaULL}},
1210 // 10^(-20) * 2^258
1211 {{0x467eecd14c5ea8eeULL, 0xd3f6fc16ebca5e03ULL,
1212 0x971da05074da7beeULL}},
1213 // 10^(-21) * 2^261
1214 {{0x70cb148213caa7e4ULL, 0x5324c68b12dd6338ULL,
1215 0xf1c90080baf72cb1ULL}},
1216 // 10^(-22) * 2^265
1217 {{0x8d6f439b43088650ULL, 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}}
1218 // 10^(-23) * 2^268
1221 // shiftright192M[] contains the right shift count to obtain C2* from the top
1222 // 192 bits of the 192x192-bit product C2 * Kx if 0 <= ind <= 14 where ind is
1223 // the index in the table, or from the top 128 bits if 15 <= ind <= 18
1224 int shiftright192M[] = {
1225 16, // 208 - 192
1226 19, // 211 - 192
1227 23, // 215 - 192
1228 26, // 218 - 192
1229 29, // 221 - 192
1230 33, // 225 - 192
1231 36, // 228 - 192
1232 39, // 231 - 192
1233 43, // 235 - 192
1234 46, // 238 - 192
1235 49, // 241 - 192
1236 53, // 245 - 192
1237 56, // 248 - 192
1238 59, // 251 - 192
1239 63, // 255 - 192
1240 2, // 258 - 256
1241 5, // 261 - 256
1242 9, // 265 - 256
1243 12 // 268 - 256
1246 // maskhigh192M[] contains the mask to apply to the top 192 bits of the
1247 // 192x192-bit product in order to obtain the high bits of f*
1248 // if 0 <= ind <= 14 where ind is the index in the table, then the high 128 bits
1249 // of the 384-bit mask are 0; if 15 <= ind <= 18 then the high 64 bits are 0
1250 UINT64 maskhigh192M[] = {
1251 0x000000000000ffffULL, // 16 = 208 - 192 bits
1252 0x000000000007ffffULL, // 19 = 211 - 192 bits
1253 0x00000000007fffffULL, // 23 = 215 - 192 bits
1254 0x0000000003ffffffULL, // 26 = 218 - 192 bits
1255 0x000000001fffffffULL, // 29 = 221 - 192 bits
1256 0x00000001ffffffffULL, // 33 = 225 - 192 bits
1257 0x0000000fffffffffULL, // 36 = 228 - 192 bits
1258 0x0000007fffffffffULL, // 39 = 231 - 192 bits
1259 0x000007ffffffffffULL, // 43 = 235 - 192 bits
1260 0x00003fffffffffffULL, // 46 = 238 - 192 bits
1261 0x0001ffffffffffffULL, // 49 = 241 - 192 bits
1262 0x001fffffffffffffULL, // 53 = 245 - 192 bits
1263 0x00ffffffffffffffULL, // 56 = 248 - 192 bits
1264 0x07ffffffffffffffULL, // 59 = 251 - 192 bits
1265 0x7fffffffffffffffULL, // 63 = 255 - 192 bits
1266 0x0000000000000003ULL, // 2 = 258 - 256 bits
1267 0x000000000000001fULL, // 5 = 261 - 256 bits
1268 0x00000000000001ffULL, // 9 = 265 - 256 bits
1269 0x0000000000000fffULL // 12 = 268 - 256 bits
1272 // onehalf192M[] contains 1/2 positioned correctly for
1273 // comparison with the high bits of f*
1274 // if 0 <= ind <= 14 where ind is the index in the table, then the high 128 bits
1275 // of the 384-bit mask are 0; if 15 <= ind <= 18 then the high 648 bits are 0
1276 UINT64 onehalf192M[] = {
1277 0x0000000000008000ULL, // 16 = 208 - 192 bits
1278 0x0000000000040000ULL, // 19 = 211 - 192 bits
1279 0x0000000000400000ULL, // 23 = 215 - 192 bits
1280 0x0000000002000000ULL, // 26 = 218 - 192 bits
1281 0x0000000010000000ULL, // 29 = 221 - 192 bits
1282 0x0000000100000000ULL, // 33 = 225 - 192 bits
1283 0x0000000800000000ULL, // 36 = 228 - 192 bits
1284 0x0000004000000000ULL, // 39 = 231 - 192 bits
1285 0x0000040000000000ULL, // 43 = 235 - 192 bits
1286 0x0000200000000000ULL, // 46 = 238 - 192 bits
1287 0x0001000000000000ULL, // 49 = 241 - 192 bits
1288 0x0010000000000000ULL, // 53 = 245 - 192 bits
1289 0x0080000000000000ULL, // 56 = 248 - 192 bits
1290 0x0400000000000000ULL, // 59 = 251 - 192 bits
1291 0x4000000000000000ULL, // 63 = 255 - 192 bits
1292 0x0000000000000002ULL, // 2 = 258 - 256 bits
1293 0x0000000000000010ULL, // 5 = 261 - 256 bits
1294 0x0000000000000100ULL, // 9 = 265 - 256 bits
1295 0x0000000000000800ULL // 12 = 268 - 256 bits
1298 // ten2mk256M[k - 1] = 10^(-k-23) * 2^exp (k), where 1 <= k <= 11 and
1299 // exp (k) = shiftright128[k - 1] + 128
1300 UINT256 ten2mk256M[] = { // the 64-bit word order is LL, LH, HL, HH
1301 {{0xf23472530ce6e3edULL, 0xd78c3615cf3a050cULL,
1302 0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}}, // 10^(-24) * 2^335
1303 {{0xe9ed83b814a49fe1ULL, 0x8c1389bc7ec33b47ULL,
1304 0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}}, // 10^(-25) * 2^339
1305 {{0x87f1362cdd507fe7ULL, 0x3cdc6e306568fc39ULL,
1306 0x95364afe032a819dULL, 0xc612062576589ddaULL}}, // 10^(-26) * 2^342
1307 {{0x9ff42b5717739986ULL, 0xca49f1c05120c9c7ULL,
1308 0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}}, // 10^(-27) * 2^345
1309 {{0xccb9def1bf1f5c09ULL, 0x76dcb60081ce0fa5ULL,
1310 0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}}, // 10^(-28) * 2^349
1311 {{0xa3c7e58e327f7cd4ULL, 0x5f16f80067d80c84ULL,
1312 0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}}, // 10^(-29) * 2^352
1313 {{0xb6398471c1ff9710ULL, 0x18df2ccd1fe00a03ULL,
1314 0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}}, // 10^(-30) * 2^355
1315 {{0xf82e038e34cc78daULL, 0x4718f0a419800802ULL,
1316 0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}}, // 10^(-31) * 2^358
1317 {{0x59e338e387ad8e29ULL, 0x0b5b1aa028ccd99eULL,
1318 0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}}, // 10^(-32) * 2^362
1319 {{0x47e8fa4f9fbe0b54ULL, 0x6f7c154ced70ae18ULL,
1320 0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}}, // 10^(-33) * 2^365
1321 {{0xd320c83fb2fe6f76ULL, 0xbf967770bdf3be79ULL,
1322 0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}} // 10^(-34) * 2^368
1325 // ten2mk256truncM[] contains T*, the top Ex >= 256 bits of 10^(-k),
1326 // for 24 <= k <= 34; the top bits which are 0 are not represented
1327 UINT256 ten2mk256truncM[] = { // the 64-bit word order is LL, LH, HL, HH
1328 {{0xf23472530ce6e3ecULL, 0xd78c3615cf3a050cULL,
1329 0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}}, // 10^(-24) * 2^335
1330 {{0xe9ed83b814a49fe0ULL, 0x8c1389bc7ec33b47ULL,
1331 0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}}, // 10^(-25) * 2^339
1332 {{0x87f1362cdd507fe6ULL, 0x3cdc6e306568fc39ULL,
1333 0x95364afe032a819dULL, 0xc612062576589ddaULL}}, // 10^(-26) * 2^342
1334 {{0x775ea264cf55347cULL, 0x9ff42b5717739986ULL,
1335 0xca49f1c05120c9c7ULL, 0x9e74d1b791e07e48ULL}}, // 10^(-27) * 2^345
1336 {{0xccb9def1bf1f5c08ULL, 0x76dcb60081ce0fa5ULL,
1337 0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}}, // 10^(-28) * 2^349
1338 {{0xa3c7e58e327f7cd3ULL, 0x5f16f80067d80c84ULL,
1339 0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}}, // 10^(-29) * 2^352
1340 {{0xb6398471c1ff970fULL, 0x18df2ccd1fe00a03ULL,
1341 0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}}, // 10^(-30) * 2^355
1342 {{0xf82e038e34cc78d9ULL, 0x4718f0a419800802ULL,
1343 0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}}, // 10^(-31) * 2^358
1344 {{0x59e338e387ad8e28ULL, 0x0b5b1aa028ccd99eULL,
1345 0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}}, // 10^(-32) * 2^362
1346 {{0x47e8fa4f9fbe0b53ULL, 0x6f7c154ced70ae18ULL,
1347 0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}}, // 10^(-33) * 2^365
1348 {{0xd320c83fb2fe6f75ULL, 0xbf967770bdf3be79ULL,
1349 0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}} // 10^(-34) * 2^368
1352 // shiftright256M[] contains the right shift count to obtain C2* from the top
1353 // 192 bits of the 256x256-bit product C2 * Kx
1354 int shiftright256M[] = {
1355 15, // 335 - 320
1356 19, // 339 - 320
1357 22, // 342 - 320
1358 25, // 345 - 320
1359 29, // 349 - 320
1360 32, // 352 - 320 // careful of 32-bit machines!
1361 35, // 355 - 320
1362 38, // 358 - 320
1363 42, // 362 - 320
1364 45, // 365 - 320
1365 48 // 368 - 320
1368 // maskhigh256M[] contains the mask to apply to the top 192 bits of the
1369 // 256x256-bit product in order to obtain the high bits of f*
1370 UINT64 maskhigh256M[] = {
1371 0x0000000000007fffULL, // 15 = 335 - 320 bits
1372 0x000000000007ffffULL, // 19 = 339 - 320 bits
1373 0x00000000003fffffULL, // 22 = 342 - 320 bits
1374 0x0000000001ffffffULL, // 25 = 345 - 320 bits
1375 0x000000001fffffffULL, // 29 = 349 - 320 bits
1376 0x00000000ffffffffULL, // 32 = 352 - 320 bits
1377 0x00000007ffffffffULL, // 35 = 355 - 320 bits
1378 0x0000003fffffffffULL, // 38 = 358 - 320 bits
1379 0x000003ffffffffffULL, // 42 = 362 - 320 bits
1380 0x00001fffffffffffULL, // 45 = 365 - 320 bits
1381 0x0000ffffffffffffULL // 48 = 368 - 320 bits
1384 // onehalf256M[] contains 1/2 positioned correctly for comparison with the
1385 // high bits of f*; the high 128 bits of the 512-bit mask are 0
1386 UINT64 onehalf256M[] = {
1387 0x0000000000004000ULL, // 15 = 335 - 320 bits
1388 0x0000000000040000ULL, // 19 = 339 - 320 bits
1389 0x0000000000200000ULL, // 22 = 342 - 320 bits
1390 0x0000000001000000ULL, // 25 = 345 - 320 bits
1391 0x0000000010000000ULL, // 29 = 349 - 320 bits
1392 0x0000000080000000ULL, // 32 = 352 - 320 bits
1393 0x0000000400000000ULL, // 35 = 355 - 320 bits
1394 0x0000002000000000ULL, // 38 = 358 - 320 bits
1395 0x0000020000000000ULL, // 42 = 362 - 320 bits
1396 0x0000100000000000ULL, // 45 = 365 - 320 bits
1397 0x0000800000000000ULL // 48 = 368 - 320 bits
1401 // char_table2[] is used to convert n to string, where 10 <= n <= 99
1402 unsigned char char_table2[180] = {
1403 '1', '0',
1404 '1', '1',
1405 '1', '2',
1406 '1', '3',
1407 '1', '4',
1408 '1', '5',
1409 '1', '6',
1410 '1', '7',
1411 '1', '8',
1412 '1', '9',
1413 '2', '0',
1414 '2', '1',
1415 '2', '2',
1416 '2', '3',
1417 '2', '4',
1418 '2', '5',
1419 '2', '6',
1420 '2', '7',
1421 '2', '8',
1422 '2', '9',
1423 '3', '0',
1424 '3', '1',
1425 '3', '2',
1426 '3', '3',
1427 '3', '4',
1428 '3', '5',
1429 '3', '6',
1430 '3', '7',
1431 '3', '8',
1432 '3', '9',
1433 '4', '0',
1434 '4', '1',
1435 '4', '2',
1436 '4', '3',
1437 '4', '4',
1438 '4', '5',
1439 '4', '6',
1440 '4', '7',
1441 '4', '8',
1442 '4', '9',
1443 '5', '0',
1444 '5', '1',
1445 '5', '2',
1446 '5', '3',
1447 '5', '4',
1448 '5', '5',
1449 '5', '6',
1450 '5', '7',
1451 '5', '8',
1452 '5', '9',
1453 '6', '0',
1454 '6', '1',
1455 '6', '2',
1456 '6', '3',
1457 '6', '4',
1458 '6', '5',
1459 '6', '6',
1460 '6', '7',
1461 '6', '8',
1462 '6', '9',
1463 '7', '0',
1464 '7', '1',
1465 '7', '2',
1466 '7', '3',
1467 '7', '4',
1468 '7', '5',
1469 '7', '6',
1470 '7', '7',
1471 '7', '8',
1472 '7', '9',
1473 '8', '0',
1474 '8', '1',
1475 '8', '2',
1476 '8', '3',
1477 '8', '4',
1478 '8', '5',
1479 '8', '6',
1480 '8', '7',
1481 '8', '8',
1482 '8', '9',
1483 '9', '0',
1484 '9', '1',
1485 '9', '2',
1486 '9', '3',
1487 '9', '4',
1488 '9', '5',
1489 '9', '6',
1490 '9', '7',
1491 '9', '8',
1492 '9', '9'
1496 // char_table3[] is used to convert n to string, where 000 <= n <= 999
1497 unsigned char char_table3[3000] = {
1498 '0', '0', '0',
1499 '0', '0', '1',
1500 '0', '0', '2',
1501 '0', '0', '3',
1502 '0', '0', '4',
1503 '0', '0', '5',
1504 '0', '0', '6',
1505 '0', '0', '7',
1506 '0', '0', '8',
1507 '0', '0', '9',
1508 '0', '1', '0',
1509 '0', '1', '1',
1510 '0', '1', '2',
1511 '0', '1', '3',
1512 '0', '1', '4',
1513 '0', '1', '5',
1514 '0', '1', '6',
1515 '0', '1', '7',
1516 '0', '1', '8',
1517 '0', '1', '9',
1518 '0', '2', '0',
1519 '0', '2', '1',
1520 '0', '2', '2',
1521 '0', '2', '3',
1522 '0', '2', '4',
1523 '0', '2', '5',
1524 '0', '2', '6',
1525 '0', '2', '7',
1526 '0', '2', '8',
1527 '0', '2', '9',
1528 '0', '3', '0',
1529 '0', '3', '1',
1530 '0', '3', '2',
1531 '0', '3', '3',
1532 '0', '3', '4',
1533 '0', '3', '5',
1534 '0', '3', '6',
1535 '0', '3', '7',
1536 '0', '3', '8',
1537 '0', '3', '9',
1538 '0', '4', '0',
1539 '0', '4', '1',
1540 '0', '4', '2',
1541 '0', '4', '3',
1542 '0', '4', '4',
1543 '0', '4', '5',
1544 '0', '4', '6',
1545 '0', '4', '7',
1546 '0', '4', '8',
1547 '0', '4', '9',
1548 '0', '5', '0',
1549 '0', '5', '1',
1550 '0', '5', '2',
1551 '0', '5', '3',
1552 '0', '5', '4',
1553 '0', '5', '5',
1554 '0', '5', '6',
1555 '0', '5', '7',
1556 '0', '5', '8',
1557 '0', '5', '9',
1558 '0', '6', '0',
1559 '0', '6', '1',
1560 '0', '6', '2',
1561 '0', '6', '3',
1562 '0', '6', '4',
1563 '0', '6', '5',
1564 '0', '6', '6',
1565 '0', '6', '7',
1566 '0', '6', '8',
1567 '0', '6', '9',
1568 '0', '7', '0',
1569 '0', '7', '1',
1570 '0', '7', '2',
1571 '0', '7', '3',
1572 '0', '7', '4',
1573 '0', '7', '5',
1574 '0', '7', '6',
1575 '0', '7', '7',
1576 '0', '7', '8',
1577 '0', '7', '9',
1578 '0', '8', '0',
1579 '0', '8', '1',
1580 '0', '8', '2',
1581 '0', '8', '3',
1582 '0', '8', '4',
1583 '0', '8', '5',
1584 '0', '8', '6',
1585 '0', '8', '7',
1586 '0', '8', '8',
1587 '0', '8', '9',
1588 '0', '9', '0',
1589 '0', '9', '1',
1590 '0', '9', '2',
1591 '0', '9', '3',
1592 '0', '9', '4',
1593 '0', '9', '5',
1594 '0', '9', '6',
1595 '0', '9', '7',
1596 '0', '9', '8',
1597 '0', '9', '9',
1598 '1', '0', '0',
1599 '1', '0', '1',
1600 '1', '0', '2',
1601 '1', '0', '3',
1602 '1', '0', '4',
1603 '1', '0', '5',
1604 '1', '0', '6',
1605 '1', '0', '7',
1606 '1', '0', '8',
1607 '1', '0', '9',
1608 '1', '1', '0',
1609 '1', '1', '1',
1610 '1', '1', '2',
1611 '1', '1', '3',
1612 '1', '1', '4',
1613 '1', '1', '5',
1614 '1', '1', '6',
1615 '1', '1', '7',
1616 '1', '1', '8',
1617 '1', '1', '9',
1618 '1', '2', '0',
1619 '1', '2', '1',
1620 '1', '2', '2',
1621 '1', '2', '3',
1622 '1', '2', '4',
1623 '1', '2', '5',
1624 '1', '2', '6',
1625 '1', '2', '7',
1626 '1', '2', '8',
1627 '1', '2', '9',
1628 '1', '3', '0',
1629 '1', '3', '1',
1630 '1', '3', '2',
1631 '1', '3', '3',
1632 '1', '3', '4',
1633 '1', '3', '5',
1634 '1', '3', '6',
1635 '1', '3', '7',
1636 '1', '3', '8',
1637 '1', '3', '9',
1638 '1', '4', '0',
1639 '1', '4', '1',
1640 '1', '4', '2',
1641 '1', '4', '3',
1642 '1', '4', '4',
1643 '1', '4', '5',
1644 '1', '4', '6',
1645 '1', '4', '7',
1646 '1', '4', '8',
1647 '1', '4', '9',
1648 '1', '5', '0',
1649 '1', '5', '1',
1650 '1', '5', '2',
1651 '1', '5', '3',
1652 '1', '5', '4',
1653 '1', '5', '5',
1654 '1', '5', '6',
1655 '1', '5', '7',
1656 '1', '5', '8',
1657 '1', '5', '9',
1658 '1', '6', '0',
1659 '1', '6', '1',
1660 '1', '6', '2',
1661 '1', '6', '3',
1662 '1', '6', '4',
1663 '1', '6', '5',
1664 '1', '6', '6',
1665 '1', '6', '7',
1666 '1', '6', '8',
1667 '1', '6', '9',
1668 '1', '7', '0',
1669 '1', '7', '1',
1670 '1', '7', '2',
1671 '1', '7', '3',
1672 '1', '7', '4',
1673 '1', '7', '5',
1674 '1', '7', '6',
1675 '1', '7', '7',
1676 '1', '7', '8',
1677 '1', '7', '9',
1678 '1', '8', '0',
1679 '1', '8', '1',
1680 '1', '8', '2',
1681 '1', '8', '3',
1682 '1', '8', '4',
1683 '1', '8', '5',
1684 '1', '8', '6',
1685 '1', '8', '7',
1686 '1', '8', '8',
1687 '1', '8', '9',
1688 '1', '9', '0',
1689 '1', '9', '1',
1690 '1', '9', '2',
1691 '1', '9', '3',
1692 '1', '9', '4',
1693 '1', '9', '5',
1694 '1', '9', '6',
1695 '1', '9', '7',
1696 '1', '9', '8',
1697 '1', '9', '9',
1698 '2', '0', '0',
1699 '2', '0', '1',
1700 '2', '0', '2',
1701 '2', '0', '3',
1702 '2', '0', '4',
1703 '2', '0', '5',
1704 '2', '0', '6',
1705 '2', '0', '7',
1706 '2', '0', '8',
1707 '2', '0', '9',
1708 '2', '1', '0',
1709 '2', '1', '1',
1710 '2', '1', '2',
1711 '2', '1', '3',
1712 '2', '1', '4',
1713 '2', '1', '5',
1714 '2', '1', '6',
1715 '2', '1', '7',
1716 '2', '1', '8',
1717 '2', '1', '9',
1718 '2', '2', '0',
1719 '2', '2', '1',
1720 '2', '2', '2',
1721 '2', '2', '3',
1722 '2', '2', '4',
1723 '2', '2', '5',
1724 '2', '2', '6',
1725 '2', '2', '7',
1726 '2', '2', '8',
1727 '2', '2', '9',
1728 '2', '3', '0',
1729 '2', '3', '1',
1730 '2', '3', '2',
1731 '2', '3', '3',
1732 '2', '3', '4',
1733 '2', '3', '5',
1734 '2', '3', '6',
1735 '2', '3', '7',
1736 '2', '3', '8',
1737 '2', '3', '9',
1738 '2', '4', '0',
1739 '2', '4', '1',
1740 '2', '4', '2',
1741 '2', '4', '3',
1742 '2', '4', '4',
1743 '2', '4', '5',
1744 '2', '4', '6',
1745 '2', '4', '7',
1746 '2', '4', '8',
1747 '2', '4', '9',
1748 '2', '5', '0',
1749 '2', '5', '1',
1750 '2', '5', '2',
1751 '2', '5', '3',
1752 '2', '5', '4',
1753 '2', '5', '5',
1754 '2', '5', '6',
1755 '2', '5', '7',
1756 '2', '5', '8',
1757 '2', '5', '9',
1758 '2', '6', '0',
1759 '2', '6', '1',
1760 '2', '6', '2',
1761 '2', '6', '3',
1762 '2', '6', '4',
1763 '2', '6', '5',
1764 '2', '6', '6',
1765 '2', '6', '7',
1766 '2', '6', '8',
1767 '2', '6', '9',
1768 '2', '7', '0',
1769 '2', '7', '1',
1770 '2', '7', '2',
1771 '2', '7', '3',
1772 '2', '7', '4',
1773 '2', '7', '5',
1774 '2', '7', '6',
1775 '2', '7', '7',
1776 '2', '7', '8',
1777 '2', '7', '9',
1778 '2', '8', '0',
1779 '2', '8', '1',
1780 '2', '8', '2',
1781 '2', '8', '3',
1782 '2', '8', '4',
1783 '2', '8', '5',
1784 '2', '8', '6',
1785 '2', '8', '7',
1786 '2', '8', '8',
1787 '2', '8', '9',
1788 '2', '9', '0',
1789 '2', '9', '1',
1790 '2', '9', '2',
1791 '2', '9', '3',
1792 '2', '9', '4',
1793 '2', '9', '5',
1794 '2', '9', '6',
1795 '2', '9', '7',
1796 '2', '9', '8',
1797 '2', '9', '9',
1798 '3', '0', '0',
1799 '3', '0', '1',
1800 '3', '0', '2',
1801 '3', '0', '3',
1802 '3', '0', '4',
1803 '3', '0', '5',
1804 '3', '0', '6',
1805 '3', '0', '7',
1806 '3', '0', '8',
1807 '3', '0', '9',
1808 '3', '1', '0',
1809 '3', '1', '1',
1810 '3', '1', '2',
1811 '3', '1', '3',
1812 '3', '1', '4',
1813 '3', '1', '5',
1814 '3', '1', '6',
1815 '3', '1', '7',
1816 '3', '1', '8',
1817 '3', '1', '9',
1818 '3', '2', '0',
1819 '3', '2', '1',
1820 '3', '2', '2',
1821 '3', '2', '3',
1822 '3', '2', '4',
1823 '3', '2', '5',
1824 '3', '2', '6',
1825 '3', '2', '7',
1826 '3', '2', '8',
1827 '3', '2', '9',
1828 '3', '3', '0',
1829 '3', '3', '1',
1830 '3', '3', '2',
1831 '3', '3', '3',
1832 '3', '3', '4',
1833 '3', '3', '5',
1834 '3', '3', '6',
1835 '3', '3', '7',
1836 '3', '3', '8',
1837 '3', '3', '9',
1838 '3', '4', '0',
1839 '3', '4', '1',
1840 '3', '4', '2',
1841 '3', '4', '3',
1842 '3', '4', '4',
1843 '3', '4', '5',
1844 '3', '4', '6',
1845 '3', '4', '7',
1846 '3', '4', '8',
1847 '3', '4', '9',
1848 '3', '5', '0',
1849 '3', '5', '1',
1850 '3', '5', '2',
1851 '3', '5', '3',
1852 '3', '5', '4',
1853 '3', '5', '5',
1854 '3', '5', '6',
1855 '3', '5', '7',
1856 '3', '5', '8',
1857 '3', '5', '9',
1858 '3', '6', '0',
1859 '3', '6', '1',
1860 '3', '6', '2',
1861 '3', '6', '3',
1862 '3', '6', '4',
1863 '3', '6', '5',
1864 '3', '6', '6',
1865 '3', '6', '7',
1866 '3', '6', '8',
1867 '3', '6', '9',
1868 '3', '7', '0',
1869 '3', '7', '1',
1870 '3', '7', '2',
1871 '3', '7', '3',
1872 '3', '7', '4',
1873 '3', '7', '5',
1874 '3', '7', '6',
1875 '3', '7', '7',
1876 '3', '7', '8',
1877 '3', '7', '9',
1878 '3', '8', '0',
1879 '3', '8', '1',
1880 '3', '8', '2',
1881 '3', '8', '3',
1882 '3', '8', '4',
1883 '3', '8', '5',
1884 '3', '8', '6',
1885 '3', '8', '7',
1886 '3', '8', '8',
1887 '3', '8', '9',
1888 '3', '9', '0',
1889 '3', '9', '1',
1890 '3', '9', '2',
1891 '3', '9', '3',
1892 '3', '9', '4',
1893 '3', '9', '5',
1894 '3', '9', '6',
1895 '3', '9', '7',
1896 '3', '9', '8',
1897 '3', '9', '9',
1898 '4', '0', '0',
1899 '4', '0', '1',
1900 '4', '0', '2',
1901 '4', '0', '3',
1902 '4', '0', '4',
1903 '4', '0', '5',
1904 '4', '0', '6',
1905 '4', '0', '7',
1906 '4', '0', '8',
1907 '4', '0', '9',
1908 '4', '1', '0',
1909 '4', '1', '1',
1910 '4', '1', '2',
1911 '4', '1', '3',
1912 '4', '1', '4',
1913 '4', '1', '5',
1914 '4', '1', '6',
1915 '4', '1', '7',
1916 '4', '1', '8',
1917 '4', '1', '9',
1918 '4', '2', '0',
1919 '4', '2', '1',
1920 '4', '2', '2',
1921 '4', '2', '3',
1922 '4', '2', '4',
1923 '4', '2', '5',
1924 '4', '2', '6',
1925 '4', '2', '7',
1926 '4', '2', '8',
1927 '4', '2', '9',
1928 '4', '3', '0',
1929 '4', '3', '1',
1930 '4', '3', '2',
1931 '4', '3', '3',
1932 '4', '3', '4',
1933 '4', '3', '5',
1934 '4', '3', '6',
1935 '4', '3', '7',
1936 '4', '3', '8',
1937 '4', '3', '9',
1938 '4', '4', '0',
1939 '4', '4', '1',
1940 '4', '4', '2',
1941 '4', '4', '3',
1942 '4', '4', '4',
1943 '4', '4', '5',
1944 '4', '4', '6',
1945 '4', '4', '7',
1946 '4', '4', '8',
1947 '4', '4', '9',
1948 '4', '5', '0',
1949 '4', '5', '1',
1950 '4', '5', '2',
1951 '4', '5', '3',
1952 '4', '5', '4',
1953 '4', '5', '5',
1954 '4', '5', '6',
1955 '4', '5', '7',
1956 '4', '5', '8',
1957 '4', '5', '9',
1958 '4', '6', '0',
1959 '4', '6', '1',
1960 '4', '6', '2',
1961 '4', '6', '3',
1962 '4', '6', '4',
1963 '4', '6', '5',
1964 '4', '6', '6',
1965 '4', '6', '7',
1966 '4', '6', '8',
1967 '4', '6', '9',
1968 '4', '7', '0',
1969 '4', '7', '1',
1970 '4', '7', '2',
1971 '4', '7', '3',
1972 '4', '7', '4',
1973 '4', '7', '5',
1974 '4', '7', '6',
1975 '4', '7', '7',
1976 '4', '7', '8',
1977 '4', '7', '9',
1978 '4', '8', '0',
1979 '4', '8', '1',
1980 '4', '8', '2',
1981 '4', '8', '3',
1982 '4', '8', '4',
1983 '4', '8', '5',
1984 '4', '8', '6',
1985 '4', '8', '7',
1986 '4', '8', '8',
1987 '4', '8', '9',
1988 '4', '9', '0',
1989 '4', '9', '1',
1990 '4', '9', '2',
1991 '4', '9', '3',
1992 '4', '9', '4',
1993 '4', '9', '5',
1994 '4', '9', '6',
1995 '4', '9', '7',
1996 '4', '9', '8',
1997 '4', '9', '9',
1998 '5', '0', '0',
1999 '5', '0', '1',
2000 '5', '0', '2',
2001 '5', '0', '3',
2002 '5', '0', '4',
2003 '5', '0', '5',
2004 '5', '0', '6',
2005 '5', '0', '7',
2006 '5', '0', '8',
2007 '5', '0', '9',
2008 '5', '1', '0',
2009 '5', '1', '1',
2010 '5', '1', '2',
2011 '5', '1', '3',
2012 '5', '1', '4',
2013 '5', '1', '5',
2014 '5', '1', '6',
2015 '5', '1', '7',
2016 '5', '1', '8',
2017 '5', '1', '9',
2018 '5', '2', '0',
2019 '5', '2', '1',
2020 '5', '2', '2',
2021 '5', '2', '3',
2022 '5', '2', '4',
2023 '5', '2', '5',
2024 '5', '2', '6',
2025 '5', '2', '7',
2026 '5', '2', '8',
2027 '5', '2', '9',
2028 '5', '3', '0',
2029 '5', '3', '1',
2030 '5', '3', '2',
2031 '5', '3', '3',
2032 '5', '3', '4',
2033 '5', '3', '5',
2034 '5', '3', '6',
2035 '5', '3', '7',
2036 '5', '3', '8',
2037 '5', '3', '9',
2038 '5', '4', '0',
2039 '5', '4', '1',
2040 '5', '4', '2',
2041 '5', '4', '3',
2042 '5', '4', '4',
2043 '5', '4', '5',
2044 '5', '4', '6',
2045 '5', '4', '7',
2046 '5', '4', '8',
2047 '5', '4', '9',
2048 '5', '5', '0',
2049 '5', '5', '1',
2050 '5', '5', '2',
2051 '5', '5', '3',
2052 '5', '5', '4',
2053 '5', '5', '5',
2054 '5', '5', '6',
2055 '5', '5', '7',
2056 '5', '5', '8',
2057 '5', '5', '9',
2058 '5', '6', '0',
2059 '5', '6', '1',
2060 '5', '6', '2',
2061 '5', '6', '3',
2062 '5', '6', '4',
2063 '5', '6', '5',
2064 '5', '6', '6',
2065 '5', '6', '7',
2066 '5', '6', '8',
2067 '5', '6', '9',
2068 '5', '7', '0',
2069 '5', '7', '1',
2070 '5', '7', '2',
2071 '5', '7', '3',
2072 '5', '7', '4',
2073 '5', '7', '5',
2074 '5', '7', '6',
2075 '5', '7', '7',
2076 '5', '7', '8',
2077 '5', '7', '9',
2078 '5', '8', '0',
2079 '5', '8', '1',
2080 '5', '8', '2',
2081 '5', '8', '3',
2082 '5', '8', '4',
2083 '5', '8', '5',
2084 '5', '8', '6',
2085 '5', '8', '7',
2086 '5', '8', '8',
2087 '5', '8', '9',
2088 '5', '9', '0',
2089 '5', '9', '1',
2090 '5', '9', '2',
2091 '5', '9', '3',
2092 '5', '9', '4',
2093 '5', '9', '5',
2094 '5', '9', '6',
2095 '5', '9', '7',
2096 '5', '9', '8',
2097 '5', '9', '9',
2098 '6', '0', '0',
2099 '6', '0', '1',
2100 '6', '0', '2',
2101 '6', '0', '3',
2102 '6', '0', '4',
2103 '6', '0', '5',
2104 '6', '0', '6',
2105 '6', '0', '7',
2106 '6', '0', '8',
2107 '6', '0', '9',
2108 '6', '1', '0',
2109 '6', '1', '1',
2110 '6', '1', '2',
2111 '6', '1', '3',
2112 '6', '1', '4',
2113 '6', '1', '5',
2114 '6', '1', '6',
2115 '6', '1', '7',
2116 '6', '1', '8',
2117 '6', '1', '9',
2118 '6', '2', '0',
2119 '6', '2', '1',
2120 '6', '2', '2',
2121 '6', '2', '3',
2122 '6', '2', '4',
2123 '6', '2', '5',
2124 '6', '2', '6',
2125 '6', '2', '7',
2126 '6', '2', '8',
2127 '6', '2', '9',
2128 '6', '3', '0',
2129 '6', '3', '1',
2130 '6', '3', '2',
2131 '6', '3', '3',
2132 '6', '3', '4',
2133 '6', '3', '5',
2134 '6', '3', '6',
2135 '6', '3', '7',
2136 '6', '3', '8',
2137 '6', '3', '9',
2138 '6', '4', '0',
2139 '6', '4', '1',
2140 '6', '4', '2',
2141 '6', '4', '3',
2142 '6', '4', '4',
2143 '6', '4', '5',
2144 '6', '4', '6',
2145 '6', '4', '7',
2146 '6', '4', '8',
2147 '6', '4', '9',
2148 '6', '5', '0',
2149 '6', '5', '1',
2150 '6', '5', '2',
2151 '6', '5', '3',
2152 '6', '5', '4',
2153 '6', '5', '5',
2154 '6', '5', '6',
2155 '6', '5', '7',
2156 '6', '5', '8',
2157 '6', '5', '9',
2158 '6', '6', '0',
2159 '6', '6', '1',
2160 '6', '6', '2',
2161 '6', '6', '3',
2162 '6', '6', '4',
2163 '6', '6', '5',
2164 '6', '6', '6',
2165 '6', '6', '7',
2166 '6', '6', '8',
2167 '6', '6', '9',
2168 '6', '7', '0',
2169 '6', '7', '1',
2170 '6', '7', '2',
2171 '6', '7', '3',
2172 '6', '7', '4',
2173 '6', '7', '5',
2174 '6', '7', '6',
2175 '6', '7', '7',
2176 '6', '7', '8',
2177 '6', '7', '9',
2178 '6', '8', '0',
2179 '6', '8', '1',
2180 '6', '8', '2',
2181 '6', '8', '3',
2182 '6', '8', '4',
2183 '6', '8', '5',
2184 '6', '8', '6',
2185 '6', '8', '7',
2186 '6', '8', '8',
2187 '6', '8', '9',
2188 '6', '9', '0',
2189 '6', '9', '1',
2190 '6', '9', '2',
2191 '6', '9', '3',
2192 '6', '9', '4',
2193 '6', '9', '5',
2194 '6', '9', '6',
2195 '6', '9', '7',
2196 '6', '9', '8',
2197 '6', '9', '9',
2198 '7', '0', '0',
2199 '7', '0', '1',
2200 '7', '0', '2',
2201 '7', '0', '3',
2202 '7', '0', '4',
2203 '7', '0', '5',
2204 '7', '0', '6',
2205 '7', '0', '7',
2206 '7', '0', '8',
2207 '7', '0', '9',
2208 '7', '1', '0',
2209 '7', '1', '1',
2210 '7', '1', '2',
2211 '7', '1', '3',
2212 '7', '1', '4',
2213 '7', '1', '5',
2214 '7', '1', '6',
2215 '7', '1', '7',
2216 '7', '1', '8',
2217 '7', '1', '9',
2218 '7', '2', '0',
2219 '7', '2', '1',
2220 '7', '2', '2',
2221 '7', '2', '3',
2222 '7', '2', '4',
2223 '7', '2', '5',
2224 '7', '2', '6',
2225 '7', '2', '7',
2226 '7', '2', '8',
2227 '7', '2', '9',
2228 '7', '3', '0',
2229 '7', '3', '1',
2230 '7', '3', '2',
2231 '7', '3', '3',
2232 '7', '3', '4',
2233 '7', '3', '5',
2234 '7', '3', '6',
2235 '7', '3', '7',
2236 '7', '3', '8',
2237 '7', '3', '9',
2238 '7', '4', '0',
2239 '7', '4', '1',
2240 '7', '4', '2',
2241 '7', '4', '3',
2242 '7', '4', '4',
2243 '7', '4', '5',
2244 '7', '4', '6',
2245 '7', '4', '7',
2246 '7', '4', '8',
2247 '7', '4', '9',
2248 '7', '5', '0',
2249 '7', '5', '1',
2250 '7', '5', '2',
2251 '7', '5', '3',
2252 '7', '5', '4',
2253 '7', '5', '5',
2254 '7', '5', '6',
2255 '7', '5', '7',
2256 '7', '5', '8',
2257 '7', '5', '9',
2258 '7', '6', '0',
2259 '7', '6', '1',
2260 '7', '6', '2',
2261 '7', '6', '3',
2262 '7', '6', '4',
2263 '7', '6', '5',
2264 '7', '6', '6',
2265 '7', '6', '7',
2266 '7', '6', '8',
2267 '7', '6', '9',
2268 '7', '7', '0',
2269 '7', '7', '1',
2270 '7', '7', '2',
2271 '7', '7', '3',
2272 '7', '7', '4',
2273 '7', '7', '5',
2274 '7', '7', '6',
2275 '7', '7', '7',
2276 '7', '7', '8',
2277 '7', '7', '9',
2278 '7', '8', '0',
2279 '7', '8', '1',
2280 '7', '8', '2',
2281 '7', '8', '3',
2282 '7', '8', '4',
2283 '7', '8', '5',
2284 '7', '8', '6',
2285 '7', '8', '7',
2286 '7', '8', '8',
2287 '7', '8', '9',
2288 '7', '9', '0',
2289 '7', '9', '1',
2290 '7', '9', '2',
2291 '7', '9', '3',
2292 '7', '9', '4',
2293 '7', '9', '5',
2294 '7', '9', '6',
2295 '7', '9', '7',
2296 '7', '9', '8',
2297 '7', '9', '9',
2298 '8', '0', '0',
2299 '8', '0', '1',
2300 '8', '0', '2',
2301 '8', '0', '3',
2302 '8', '0', '4',
2303 '8', '0', '5',
2304 '8', '0', '6',
2305 '8', '0', '7',
2306 '8', '0', '8',
2307 '8', '0', '9',
2308 '8', '1', '0',
2309 '8', '1', '1',
2310 '8', '1', '2',
2311 '8', '1', '3',
2312 '8', '1', '4',
2313 '8', '1', '5',
2314 '8', '1', '6',
2315 '8', '1', '7',
2316 '8', '1', '8',
2317 '8', '1', '9',
2318 '8', '2', '0',
2319 '8', '2', '1',
2320 '8', '2', '2',
2321 '8', '2', '3',
2322 '8', '2', '4',
2323 '8', '2', '5',
2324 '8', '2', '6',
2325 '8', '2', '7',
2326 '8', '2', '8',
2327 '8', '2', '9',
2328 '8', '3', '0',
2329 '8', '3', '1',
2330 '8', '3', '2',
2331 '8', '3', '3',
2332 '8', '3', '4',
2333 '8', '3', '5',
2334 '8', '3', '6',
2335 '8', '3', '7',
2336 '8', '3', '8',
2337 '8', '3', '9',
2338 '8', '4', '0',
2339 '8', '4', '1',
2340 '8', '4', '2',
2341 '8', '4', '3',
2342 '8', '4', '4',
2343 '8', '4', '5',
2344 '8', '4', '6',
2345 '8', '4', '7',
2346 '8', '4', '8',
2347 '8', '4', '9',
2348 '8', '5', '0',
2349 '8', '5', '1',
2350 '8', '5', '2',
2351 '8', '5', '3',
2352 '8', '5', '4',
2353 '8', '5', '5',
2354 '8', '5', '6',
2355 '8', '5', '7',
2356 '8', '5', '8',
2357 '8', '5', '9',
2358 '8', '6', '0',
2359 '8', '6', '1',
2360 '8', '6', '2',
2361 '8', '6', '3',
2362 '8', '6', '4',
2363 '8', '6', '5',
2364 '8', '6', '6',
2365 '8', '6', '7',
2366 '8', '6', '8',
2367 '8', '6', '9',
2368 '8', '7', '0',
2369 '8', '7', '1',
2370 '8', '7', '2',
2371 '8', '7', '3',
2372 '8', '7', '4',
2373 '8', '7', '5',
2374 '8', '7', '6',
2375 '8', '7', '7',
2376 '8', '7', '8',
2377 '8', '7', '9',
2378 '8', '8', '0',
2379 '8', '8', '1',
2380 '8', '8', '2',
2381 '8', '8', '3',
2382 '8', '8', '4',
2383 '8', '8', '5',
2384 '8', '8', '6',
2385 '8', '8', '7',
2386 '8', '8', '8',
2387 '8', '8', '9',
2388 '8', '9', '0',
2389 '8', '9', '1',
2390 '8', '9', '2',
2391 '8', '9', '3',
2392 '8', '9', '4',
2393 '8', '9', '5',
2394 '8', '9', '6',
2395 '8', '9', '7',
2396 '8', '9', '8',
2397 '8', '9', '9',
2398 '9', '0', '0',
2399 '9', '0', '1',
2400 '9', '0', '2',
2401 '9', '0', '3',
2402 '9', '0', '4',
2403 '9', '0', '5',
2404 '9', '0', '6',
2405 '9', '0', '7',
2406 '9', '0', '8',
2407 '9', '0', '9',
2408 '9', '1', '0',
2409 '9', '1', '1',
2410 '9', '1', '2',
2411 '9', '1', '3',
2412 '9', '1', '4',
2413 '9', '1', '5',
2414 '9', '1', '6',
2415 '9', '1', '7',
2416 '9', '1', '8',
2417 '9', '1', '9',
2418 '9', '2', '0',
2419 '9', '2', '1',
2420 '9', '2', '2',
2421 '9', '2', '3',
2422 '9', '2', '4',
2423 '9', '2', '5',
2424 '9', '2', '6',
2425 '9', '2', '7',
2426 '9', '2', '8',
2427 '9', '2', '9',
2428 '9', '3', '0',
2429 '9', '3', '1',
2430 '9', '3', '2',
2431 '9', '3', '3',
2432 '9', '3', '4',
2433 '9', '3', '5',
2434 '9', '3', '6',
2435 '9', '3', '7',
2436 '9', '3', '8',
2437 '9', '3', '9',
2438 '9', '4', '0',
2439 '9', '4', '1',
2440 '9', '4', '2',
2441 '9', '4', '3',
2442 '9', '4', '4',
2443 '9', '4', '5',
2444 '9', '4', '6',
2445 '9', '4', '7',
2446 '9', '4', '8',
2447 '9', '4', '9',
2448 '9', '5', '0',
2449 '9', '5', '1',
2450 '9', '5', '2',
2451 '9', '5', '3',
2452 '9', '5', '4',
2453 '9', '5', '5',
2454 '9', '5', '6',
2455 '9', '5', '7',
2456 '9', '5', '8',
2457 '9', '5', '9',
2458 '9', '6', '0',
2459 '9', '6', '1',
2460 '9', '6', '2',
2461 '9', '6', '3',
2462 '9', '6', '4',
2463 '9', '6', '5',
2464 '9', '6', '6',
2465 '9', '6', '7',
2466 '9', '6', '8',
2467 '9', '6', '9',
2468 '9', '7', '0',
2469 '9', '7', '1',
2470 '9', '7', '2',
2471 '9', '7', '3',
2472 '9', '7', '4',
2473 '9', '7', '5',
2474 '9', '7', '6',
2475 '9', '7', '7',
2476 '9', '7', '8',
2477 '9', '7', '9',
2478 '9', '8', '0',
2479 '9', '8', '1',
2480 '9', '8', '2',
2481 '9', '8', '3',
2482 '9', '8', '4',
2483 '9', '8', '5',
2484 '9', '8', '6',
2485 '9', '8', '7',
2486 '9', '8', '8',
2487 '9', '8', '9',
2488 '9', '9', '0',
2489 '9', '9', '1',
2490 '9', '9', '2',
2491 '9', '9', '3',
2492 '9', '9', '4',
2493 '9', '9', '5',
2494 '9', '9', '6',
2495 '9', '9', '7',
2496 '9', '9', '8',
2497 '9', '9', '9'
2500 // ten2m3k64[], shift_ten2m3k64[] used for conversion from BID128 to string
2501 UINT64 ten2m3k64[] = {
2502 0x4189374bc6a7ef9eull, // 4189374bc6a7ef9e * 2^-72 = (10^-3)RP,63
2503 0x10c6f7a0b5ed8d37ull, // 10c6f7a0b5ed8d37 * 2^-80 = (10^-6)RP,61
2504 0x44b82fa09b5a52ccull, // 44b82fa09b5a52cc * 2^-92 = (10^-9)RP,63
2505 0x119799812dea111aull, // 119799812dea111a * 2^-100 = (10^-12)RP,61
2506 0x480ebe7b9d58566dull // 480ebe7b9d58566d * 2^-112 = (10^-15)RP,63
2509 unsigned int shift_ten2m3k64[] = {
2510 8, // 72 - 64
2511 16, // 80 - 64
2512 28, // 92 - 64
2513 36, // 100 - 64
2514 48 // 112 - 64
2517 UINT128 ten2m3k128[] = {
2518 {{0xb22d0e5604189375ull, 0x4189374bc6a7ef9dull}},
2519 // 4189374bc6a7ef9d b22d0e5604189375 * 2^-136 = (10^-3)RP,127
2520 {{0xb4c7f34938583622ull, 0x10c6f7a0b5ed8d36ull}},
2521 // 10c6f7a0b5ed8d36 b4c7f34938583622 * 2^-144 = (10^-6)RP,125
2522 {{0x98b405447c4a9819ull, 0x44b82fa09b5a52cbull}},
2523 // 44b82fa09b5a52cb 98b405447c4a9819 * 2^-156 = (10^-9)RP,127
2524 {{0x7f27f0f6e885c8bbull, 0x119799812dea1119ull}},
2525 // 119799812dea1119 7f27f0f6e885c8bb * 2^-164 = (10^-12)RP,125
2526 {{0x87ce9b80a5fb0509ull, 0x480ebe7b9d58566cull}},
2527 // 480ebe7b9d58566c 87ce9b80a5fb0509 * 2^-176 = (10^-15)RP,127
2528 {{0xe75fe645cc4873faull, 0x12725dd1d243aba0ull}},
2529 // 12725dd1d243aba0 e75fe645cc4873fa * 2^-184 = (10^-18)RP,125
2530 {{0x69fb7e0b75e52f02ull, 0x4b8ed0283a6d3df7ull}},
2531 // 4b8ed0283a6d3df7 69fb7e0b75e52f02 * 2^-196 = (10^-21)RP,127
2532 {{0x58924d52ce4f26a9ull, 0x1357c299a88ea76aull}},
2533 // 1357c299a88ea76a 58924d52ce4f26a9 * 2^-204 = (10^-24)RP,125
2534 {{0x3baf513267aa9a3full, 0x4f3a68dbc8f03f24ull}},
2535 // 4f3a68dbc8f03f24 3baf513267aa9a3f * 2^-216 = (10^-27)RP,127
2536 {{0x3424b06f3529a052ull, 0x14484bfeebc29f86ull}},
2537 // 14484bfeebc29f86 3424b06f3529a052 * 2^-224 = (10^-30)RP,125
2538 {{0xf658d6c57566eac8ull, 0x5313a5dee87d6eb0ull}}
2539 // 5313a5dee87d6eb0 f658d6c57566eac8 * 2^-236 = (10^-33)RP,127
2542 unsigned int shift_ten2m3k128[] = {
2543 8, // 136 - 128
2544 16, // 144 - 128
2545 28, // 156 - 128
2546 36, // 164 - 128
2547 48, // 176 - 128
2548 56, // 184 - 128
2549 4, // 196 - 192
2550 12, // 204 - 192
2551 24, // 216 - 192
2552 32, // 224 - 192
2553 44 // 236 - 192
2557 /***************************************************************************
2558 *************** TABLES FOR GENERAL ROUNDING FUNCTIONS *********************
2559 ***************************************************************************/
2560 // Note: not all entries in these tables will be used with IEEE 754R decimal
2561 // floating-point arithmetic
2562 // a) In round128_2_18() numbers with 2 <= q <= 18 will be rounded only
2563 // for 1 <= x <= 3:
2564 // x = 1 or x = 2 when q = 17
2565 // x = 2 or x = 3 when q = 18
2566 // b) In round128_19_38() numbers with 19 <= q <= 38 will be rounded only
2567 // for 1 <= x <= 23:
2568 // x = 3 or x = 4 when q = 19
2569 // x = 4 or x = 5 when q = 20
2570 // ...
2571 // x = 18 or x = 19 when q = 34
2572 // x = 1 or x = 2 or x = 19 or x = 20 when q = 35
2573 // x = 2 or x = 3 or x = 20 or x = 21 when q = 36
2574 // x = 3 or x = 4 or x = 21 or x = 22 when q = 37
2575 // x = 4 or x = 5 or x = 22 or x = 23 when q = 38
2576 // c) ...
2577 // However, for generality and possible uses outside the frame of IEEE 754R
2578 // this implementation includes table values for all x in [1, q - 1]
2580 // Note: 64-bit tables generated with ten2mx64.ma; output in ten2mx64.out
2582 // Kx from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 64 bits, 1 <= x <= 17
2583 UINT64 Kx64[] = {
2584 0xcccccccccccccccdULL, // 10^-1 ~= cccccccccccccccd * 2^-67
2585 0xa3d70a3d70a3d70bULL, // 10^-2 ~= a3d70a3d70a3d70b * 2^-70
2586 0x83126e978d4fdf3cULL, // 10^-3 ~= 83126e978d4fdf3c * 2^-73
2587 0xd1b71758e219652cULL, // 10^-4 ~= d1b71758e219652c * 2^-77
2588 0xa7c5ac471b478424ULL, // 10^-5 ~= a7c5ac471b478424 * 2^-80
2589 0x8637bd05af6c69b6ULL, // 10^-6 ~= 8637bd05af6c69b6 * 2^-83
2590 0xd6bf94d5e57a42bdULL, // 10^-7 ~= d6bf94d5e57a42bd * 2^-87
2591 0xabcc77118461cefdULL, // 10^-8 ~= abcc77118461cefd * 2^-90
2592 0x89705f4136b4a598ULL, // 10^-9 ~= 89705f4136b4a598 * 2^-93
2593 0xdbe6fecebdedd5bfULL, // 10^-10 ~= dbe6fecebdedd5bf * 2^-97
2594 0xafebff0bcb24aaffULL, // 10^-11 ~= afebff0bcb24aaff * 2^-100
2595 0x8cbccc096f5088ccULL, // 10^-12 ~= 8cbccc096f5088cc * 2^-103
2596 0xe12e13424bb40e14ULL, // 10^-13 ~= e12e13424bb40e14 * 2^-107
2597 0xb424dc35095cd810ULL, // 10^-14 ~= b424dc35095cd810 * 2^-110
2598 0x901d7cf73ab0acdaULL, // 10^-15 ~= 901d7cf73ab0acda * 2^-113
2599 0xe69594bec44de15cULL, // 10^-16 ~= e69594bec44de15c * 2^-117
2600 0xb877aa3236a4b44aULL // 10^-17 ~= b877aa3236a4b44a * 2^-120
2603 // Ex-64 from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 64 bits, 1 <= x <= 17
2604 unsigned int Ex64m64[] = {
2605 3, // 67 - 64, Ex = 67
2606 6, // 70 - 64, Ex = 70
2607 9, // 73 - 64, Ex = 73
2608 13, // 77 - 64, Ex = 77
2609 16, // 80 - 64, Ex = 80
2610 19, // 83 - 64, Ex = 83
2611 23, // 87 - 64, Ex = 87
2612 26, // 90 - 64, Ex = 90
2613 29, // 93 - 64, Ex = 93
2614 33, // 97 - 64, Ex = 97
2615 36, // 100 - 64, Ex = 100
2616 39, // 103 - 64, Ex = 103
2617 43, // 107 - 64, Ex = 107
2618 46, // 110 - 64, Ex = 110
2619 49, // 113 - 64, Ex = 113
2620 53, // 117 - 64, Ex = 117
2621 56 // 120 - 64, Ex = 120
2624 // Values of 1/2 in the right position to be compared with the fraction from
2625 // C * kx, 1 <= x <= 17; the fraction consists of the low Ex bits in C * kx
2626 // (these values are aligned with the high 64 bits of the fraction)
2627 UINT64 half64[] = {
2628 0x0000000000000004ULL, // half / 2^64 = 4
2629 0x0000000000000020ULL, // half / 2^64 = 20
2630 0x0000000000000100ULL, // half / 2^64 = 100
2631 0x0000000000001000ULL, // half / 2^64 = 1000
2632 0x0000000000008000ULL, // half / 2^64 = 8000
2633 0x0000000000040000ULL, // half / 2^64 = 40000
2634 0x0000000000400000ULL, // half / 2^64 = 400000
2635 0x0000000002000000ULL, // half / 2^64 = 2000000
2636 0x0000000010000000ULL, // half / 2^64 = 10000000
2637 0x0000000100000000ULL, // half / 2^64 = 100000000
2638 0x0000000800000000ULL, // half / 2^64 = 800000000
2639 0x0000004000000000ULL, // half / 2^64 = 4000000000
2640 0x0000040000000000ULL, // half / 2^64 = 40000000000
2641 0x0000200000000000ULL, // half / 2^64 = 200000000000
2642 0x0001000000000000ULL, // half / 2^64 = 1000000000000
2643 0x0010000000000000ULL, // half / 2^64 = 10000000000000
2644 0x0080000000000000ULL // half / 2^64 = 80000000000000
2647 // Values of mask in the right position to obtain the high Ex - 64 bits
2648 // of the fraction from C * kx, 1 <= x <= 17; the fraction consists of
2649 // the low Ex bits in C * kx
2650 UINT64 mask64[] = {
2651 0x0000000000000007ULL, // mask / 2^64
2652 0x000000000000003fULL, // mask / 2^64
2653 0x00000000000001ffULL, // mask / 2^64
2654 0x0000000000001fffULL, // mask / 2^64
2655 0x000000000000ffffULL, // mask / 2^64
2656 0x000000000007ffffULL, // mask / 2^64
2657 0x00000000007fffffULL, // mask / 2^64
2658 0x0000000003ffffffULL, // mask / 2^64
2659 0x000000001fffffffULL, // mask / 2^64
2660 0x00000001ffffffffULL, // mask / 2^64
2661 0x0000000fffffffffULL, // mask / 2^64
2662 0x0000007fffffffffULL, // mask / 2^64
2663 0x000007ffffffffffULL, // mask / 2^64
2664 0x00003fffffffffffULL, // mask / 2^64
2665 0x0001ffffffffffffULL, // mask / 2^64
2666 0x001fffffffffffffULL, // mask / 2^64
2667 0x00ffffffffffffffULL // mask / 2^64
2670 // Values of 10^(-x) trancated to Ex bits beyond the binary point, and
2671 // in the right position to be compared with the fraction from C * kx,
2672 // 1 <= x <= 17; the fraction consists of the low Ex bits in C * kx
2673 // (these values are aligned with the low 64 bits of the fraction)
2674 UINT64 ten2mxtrunc64[] = {
2675 0xccccccccccccccccULL, // (ten2mx >> 64) = cccccccccccccccc
2676 0xa3d70a3d70a3d70aULL, // (ten2mx >> 64) = a3d70a3d70a3d70a
2677 0x83126e978d4fdf3bULL, // (ten2mx >> 64) = 83126e978d4fdf3b
2678 0xd1b71758e219652bULL, // (ten2mx >> 64) = d1b71758e219652b
2679 0xa7c5ac471b478423ULL, // (ten2mx >> 64) = a7c5ac471b478423
2680 0x8637bd05af6c69b5ULL, // (ten2mx >> 64) = 8637bd05af6c69b5
2681 0xd6bf94d5e57a42bcULL, // (ten2mx >> 64) = d6bf94d5e57a42bc
2682 0xabcc77118461cefcULL, // (ten2mx >> 64) = abcc77118461cefc
2683 0x89705f4136b4a597ULL, // (ten2mx >> 64) = 89705f4136b4a597
2684 0xdbe6fecebdedd5beULL, // (ten2mx >> 64) = dbe6fecebdedd5be
2685 0xafebff0bcb24aafeULL, // (ten2mx >> 64) = afebff0bcb24aafe
2686 0x8cbccc096f5088cbULL, // (ten2mx >> 64) = 8cbccc096f5088cb
2687 0xe12e13424bb40e13ULL, // (ten2mx >> 64) = e12e13424bb40e13
2688 0xb424dc35095cd80fULL, // (ten2mx >> 64) = b424dc35095cd80f
2689 0x901d7cf73ab0acd9ULL, // (ten2mx >> 64) = 901d7cf73ab0acd9
2690 0xe69594bec44de15bULL, // (ten2mx >> 64) = e69594bec44de15b
2691 0xb877aa3236a4b449ULL // (ten2mx >> 64) = b877aa3236a4b449
2694 // Note: 128-bit tables generated with ten2mx128.ma; output in ten2mx128.out
2695 // The order of the 64-bit components is L, H
2697 // Kx from 10^(-x) ~= Kx * 2^(-Ex); Kx rounded up to 128 bits, 1 <= x <= 37
2698 UINT128 Kx128[] = {
2699 {{0xcccccccccccccccdULL, 0xccccccccccccccccULL}},
2700 // 10^-1 ~= cccccccccccccccccccccccccccccccd * 2^-131
2701 {{0x3d70a3d70a3d70a4ULL, 0xa3d70a3d70a3d70aULL}},
2702 // 10^-2 ~= a3d70a3d70a3d70a3d70a3d70a3d70a4 * 2^-134
2703 {{0x645a1cac083126eaULL, 0x83126e978d4fdf3bULL}},
2704 // 10^-3 ~= 83126e978d4fdf3b645a1cac083126ea * 2^-137
2705 {{0xd3c36113404ea4a9ULL, 0xd1b71758e219652bULL}},
2706 // 10^-4 ~= d1b71758e219652bd3c36113404ea4a9 * 2^-141
2707 {{0x0fcf80dc33721d54ULL, 0xa7c5ac471b478423ULL}},
2708 // 10^-5 ~= a7c5ac471b4784230fcf80dc33721d54 * 2^-144
2709 {{0xa63f9a49c2c1b110ULL, 0x8637bd05af6c69b5ULL}},
2710 // 10^-6 ~= 8637bd05af6c69b5a63f9a49c2c1b110 * 2^-147
2711 {{0x3d32907604691b4dULL, 0xd6bf94d5e57a42bcULL}},
2712 // 10^-7 ~= d6bf94d5e57a42bc3d32907604691b4d * 2^-151
2713 {{0xfdc20d2b36ba7c3eULL, 0xabcc77118461cefcULL}},
2714 // 10^-8 ~= abcc77118461cefcfdc20d2b36ba7c3e * 2^-154
2715 {{0x31680a88f8953031ULL, 0x89705f4136b4a597ULL}},
2716 // 10^-9 ~= 89705f4136b4a59731680a88f8953031 * 2^-157
2717 {{0xb573440e5a884d1cULL, 0xdbe6fecebdedd5beULL}},
2718 // 10^-10 ~= dbe6fecebdedd5beb573440e5a884d1c * 2^-161
2719 {{0xf78f69a51539d749ULL, 0xafebff0bcb24aafeULL}},
2720 // 10^-11 ~= afebff0bcb24aafef78f69a51539d749 * 2^-164
2721 {{0xf93f87b7442e45d4ULL, 0x8cbccc096f5088cbULL}},
2722 // 10^-12 ~= 8cbccc096f5088cbf93f87b7442e45d4 * 2^-167
2723 {{0x2865a5f206b06fbaULL, 0xe12e13424bb40e13ULL}},
2724 // 10^-13 ~= e12e13424bb40e132865a5f206b06fba * 2^-171
2725 {{0x538484c19ef38c95ULL, 0xb424dc35095cd80fULL}},
2726 // 10^-14 ~= b424dc35095cd80f538484c19ef38c95 * 2^-174
2727 {{0x0f9d37014bf60a11ULL, 0x901d7cf73ab0acd9ULL}},
2728 // 10^-15 ~= 901d7cf73ab0acd90f9d37014bf60a11 * 2^-177
2729 {{0x4c2ebe687989a9b4ULL, 0xe69594bec44de15bULL}},
2730 // 10^-16 ~= e69594bec44de15b4c2ebe687989a9b4 * 2^-181
2731 {{0x09befeb9fad487c3ULL, 0xb877aa3236a4b449ULL}},
2732 // 10^-17 ~= b877aa3236a4b44909befeb9fad487c3 * 2^-184
2733 {{0x3aff322e62439fd0ULL, 0x9392ee8e921d5d07ULL}},
2734 // 10^-18 ~= 9392ee8e921d5d073aff322e62439fd0 * 2^-187
2735 {{0x2b31e9e3d06c32e6ULL, 0xec1e4a7db69561a5ULL}},
2736 // 10^-19 ~= ec1e4a7db69561a52b31e9e3d06c32e6 * 2^-191
2737 {{0x88f4bb1ca6bcf585ULL, 0xbce5086492111aeaULL}},
2738 // 10^-20 ~= bce5086492111aea88f4bb1ca6bcf585 * 2^-194
2739 {{0xd3f6fc16ebca5e04ULL, 0x971da05074da7beeULL}},
2740 // 10^-21 ~= 971da05074da7beed3f6fc16ebca5e04 * 2^-197
2741 {{0x5324c68b12dd6339ULL, 0xf1c90080baf72cb1ULL}},
2742 // 10^-22 ~= f1c90080baf72cb15324c68b12dd6339 * 2^-201
2743 {{0x75b7053c0f178294ULL, 0xc16d9a0095928a27ULL}},
2744 // 10^-23 ~= c16d9a0095928a2775b7053c0f178294 * 2^-204
2745 {{0xc4926a9672793543ULL, 0x9abe14cd44753b52ULL}},
2746 // 10^-24 ~= 9abe14cd44753b52c4926a9672793543 * 2^-207
2747 {{0x3a83ddbd83f52205ULL, 0xf79687aed3eec551ULL}},
2748 // 10^-25 ~= f79687aed3eec5513a83ddbd83f52205 * 2^-211
2749 {{0x95364afe032a819eULL, 0xc612062576589ddaULL}},
2750 // 10^-26 ~= c612062576589dda95364afe032a819e * 2^-214
2751 {{0x775ea264cf55347eULL, 0x9e74d1b791e07e48ULL}},
2752 // 10^-27 ~= 9e74d1b791e07e48775ea264cf55347e * 2^-217
2753 {{0x8bca9d6e188853fdULL, 0xfd87b5f28300ca0dULL}},
2754 // 10^-28 ~= fd87b5f28300ca0d8bca9d6e188853fd * 2^-221
2755 {{0x096ee45813a04331ULL, 0xcad2f7f5359a3b3eULL}},
2756 // 10^-29 ~= cad2f7f5359a3b3e096ee45813a04331 * 2^-224
2757 {{0xa1258379a94d028eULL, 0xa2425ff75e14fc31ULL}},
2758 // 10^-30 ~= a2425ff75e14fc31a1258379a94d028e * 2^-227
2759 {{0x80eacf948770ced8ULL, 0x81ceb32c4b43fcf4ULL}},
2760 // 10^-31 ~= 81ceb32c4b43fcf480eacf948770ced8 * 2^-230
2761 {{0x67de18eda5814af3ULL, 0xcfb11ead453994baULL}},
2762 // 10^-32 ~= cfb11ead453994ba67de18eda5814af3 * 2^-234
2763 {{0xecb1ad8aeacdd58fULL, 0xa6274bbdd0fadd61ULL}},
2764 // 10^-33 ~= a6274bbdd0fadd61ecb1ad8aeacdd58f * 2^-237
2765 {{0xbd5af13bef0b113fULL, 0x84ec3c97da624ab4ULL}},
2766 // 10^-34 ~= 84ec3c97da624ab4bd5af13bef0b113f * 2^-240
2767 {{0x955e4ec64b44e865ULL, 0xd4ad2dbfc3d07787ULL}},
2768 // 10^-35 ~= d4ad2dbfc3d07787955e4ec64b44e865 * 2^-244
2769 {{0xdde50bd1d5d0b9eaULL, 0xaa242499697392d2ULL}},
2770 // 10^-36 ~= aa242499697392d2dde50bd1d5d0b9ea * 2^-247
2771 {{0x7e50d64177da2e55ULL, 0x881cea14545c7575ULL}}
2772 // 10^-37 ~= 881cea14545c75757e50d64177da2e55 * 2^-250
2775 // Ex-128 from 10^(-x) ~= Kx*2^(-Ex); Kx rounded up to 128 bits, 1 <= x <= 37
2776 unsigned int Ex128m128[] = {
2777 3, // 131 - 128, Ex = 131
2778 6, // 134 - 128, Ex = 134
2779 9, // 137 - 128, Ex = 137
2780 13, // 141 - 128, Ex = 141
2781 16, // 144 - 128, Ex = 144
2782 19, // 147 - 128, Ex = 147
2783 23, // 151 - 128, Ex = 151
2784 26, // 154 - 128, Ex = 154
2785 29, // 157 - 128, Ex = 157
2786 33, // 161 - 128, Ex = 161
2787 36, // 164 - 128, Ex = 164
2788 39, // 167 - 128, Ex = 167
2789 43, // 171 - 128, Ex = 171
2790 46, // 174 - 128, Ex = 174
2791 49, // 177 - 128, Ex = 177
2792 53, // 181 - 128, Ex = 181
2793 56, // 184 - 128, Ex = 184
2794 59, // 187 - 128, Ex = 187
2795 63, // 191 - 128, Ex = 191
2796 2, // 194 - 192, Ex = 194
2797 5, // 197 - 192, Ex = 197
2798 9, // 201 - 192, Ex = 201
2799 12, // 204 - 192, Ex = 204
2800 15, // 207 - 192, Ex = 207
2801 19, // 211 - 192, Ex = 211
2802 22, // 214 - 192, Ex = 214
2803 25, // 217 - 192, Ex = 217
2804 29, // 221 - 192, Ex = 221
2805 32, // 224 - 192, Ex = 224
2806 35, // 227 - 192, Ex = 227
2807 38, // 230 - 192, Ex = 230
2808 42, // 234 - 192, Ex = 234
2809 45, // 237 - 192, Ex = 237
2810 48, // 240 - 192, Ex = 240
2811 52, // 244 - 192, Ex = 244
2812 55, // 247 - 192, Ex = 247
2813 58 // 250 - 192, Ex = 250
2816 // Values of 1/2 in the right position to be compared with the fraction from
2817 // C * kx, 1 <= x <= 37; the fraction consists of the low Ex bits in C * kx
2818 // (these values are aligned with the high 128 bits of the fraction)
2819 UINT64 half128[] = {
2820 0x0000000000000004ULL, // half / 2^128 = 4
2821 0x0000000000000020ULL, // half / 2^128 = 20
2822 0x0000000000000100ULL, // half / 2^128 = 100
2823 0x0000000000001000ULL, // half / 2^128 = 1000
2824 0x0000000000008000ULL, // half / 2^128 = 8000
2825 0x0000000000040000ULL, // half / 2^128 = 40000
2826 0x0000000000400000ULL, // half / 2^128 = 400000
2827 0x0000000002000000ULL, // half / 2^128 = 2000000
2828 0x0000000010000000ULL, // half / 2^128 = 10000000
2829 0x0000000100000000ULL, // half / 2^128 = 100000000
2830 0x0000000800000000ULL, // half / 2^128 = 800000000
2831 0x0000004000000000ULL, // half / 2^128 = 4000000000
2832 0x0000040000000000ULL, // half / 2^128 = 40000000000
2833 0x0000200000000000ULL, // half / 2^128 = 200000000000
2834 0x0001000000000000ULL, // half / 2^128 = 1000000000000
2835 0x0010000000000000ULL, // half / 2^128 = 10000000000000
2836 0x0080000000000000ULL, // half / 2^128 = 80000000000000
2837 0x0400000000000000ULL, // half / 2^128 = 400000000000000
2838 0x4000000000000000ULL, // half / 2^128 = 4000000000000000
2839 0x0000000000000002ULL, // half / 2^192 = 2
2840 0x0000000000000010ULL, // half / 2^192 = 10
2841 0x0000000000000100ULL, // half / 2^192 = 100
2842 0x0000000000000800ULL, // half / 2^192 = 800
2843 0x0000000000004000ULL, // half / 2^192 = 4000
2844 0x0000000000040000ULL, // half / 2^192 = 40000
2845 0x0000000000200000ULL, // half / 2^192 = 200000
2846 0x0000000001000000ULL, // half / 2^192 = 1000000
2847 0x0000000010000000ULL, // half / 2^192 = 10000000
2848 0x0000000080000000ULL, // half / 2^192 = 80000000
2849 0x0000000400000000ULL, // half / 2^192 = 400000000
2850 0x0000002000000000ULL, // half / 2^192 = 2000000000
2851 0x0000020000000000ULL, // half / 2^192 = 20000000000
2852 0x0000100000000000ULL, // half / 2^192 = 100000000000
2853 0x0000800000000000ULL, // half / 2^192 = 800000000000
2854 0x0008000000000000ULL, // half / 2^192 = 8000000000000
2855 0x0040000000000000ULL, // half / 2^192 = 40000000000000
2856 0x0200000000000000ULL // half / 2^192 = 200000000000000
2859 // Values of mask in the right position to obtain the high Ex - 128 or Ex - 192
2860 // bits of the fraction from C * kx, 1 <= x <= 37; the fraction consists of
2861 // the low Ex bits in C * kx
2862 UINT64 mask128[] = {
2863 0x0000000000000007ULL, // mask / 2^128
2864 0x000000000000003fULL, // mask / 2^128
2865 0x00000000000001ffULL, // mask / 2^128
2866 0x0000000000001fffULL, // mask / 2^128
2867 0x000000000000ffffULL, // mask / 2^128
2868 0x000000000007ffffULL, // mask / 2^128
2869 0x00000000007fffffULL, // mask / 2^128
2870 0x0000000003ffffffULL, // mask / 2^128
2871 0x000000001fffffffULL, // mask / 2^128
2872 0x00000001ffffffffULL, // mask / 2^128
2873 0x0000000fffffffffULL, // mask / 2^128
2874 0x0000007fffffffffULL, // mask / 2^128
2875 0x000007ffffffffffULL, // mask / 2^128
2876 0x00003fffffffffffULL, // mask / 2^128
2877 0x0001ffffffffffffULL, // mask / 2^128
2878 0x001fffffffffffffULL, // mask / 2^128
2879 0x00ffffffffffffffULL, // mask / 2^128
2880 0x07ffffffffffffffULL, // mask / 2^128
2881 0x7fffffffffffffffULL, // mask / 2^128
2882 0x0000000000000003ULL, // mask / 2^192
2883 0x000000000000001fULL, // mask / 2^192
2884 0x00000000000001ffULL, // mask / 2^192
2885 0x0000000000000fffULL, // mask / 2^192
2886 0x0000000000007fffULL, // mask / 2^192
2887 0x000000000007ffffULL, // mask / 2^192
2888 0x00000000003fffffULL, // mask / 2^192
2889 0x0000000001ffffffULL, // mask / 2^192
2890 0x000000001fffffffULL, // mask / 2^192
2891 0x00000000ffffffffULL, // mask / 2^192
2892 0x00000007ffffffffULL, // mask / 2^192
2893 0x0000003fffffffffULL, // mask / 2^192
2894 0x000003ffffffffffULL, // mask / 2^192
2895 0x00001fffffffffffULL, // mask / 2^192
2896 0x0000ffffffffffffULL, // mask / 2^192
2897 0x000fffffffffffffULL, // mask / 2^192
2898 0x007fffffffffffffULL, // mask / 2^192
2899 0x03ffffffffffffffULL // mask / 2^192
2902 // Values of 10^(-x) trancated to Ex bits beyond the binary point, and
2903 // in the right position to be compared with the fraction from C * kx,
2904 // 1 <= x <= 37; the fraction consists of the low Ex bits in C * kx
2905 // (these values are aligned with the low 128 bits of the fraction)
2906 UINT128 ten2mxtrunc128[] = {
2907 {{0xccccccccccccccccULL, 0xccccccccccccccccULL}},
2908 // (ten2mx >> 128) = cccccccccccccccccccccccccccccccc
2909 {{0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
2910 // (ten2mx >> 128) = a3d70a3d70a3d70a3d70a3d70a3d70a3
2911 {{0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
2912 // (ten2mx >> 128) = 83126e978d4fdf3b645a1cac083126e9
2913 {{0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
2914 // (ten2mx >> 128) = d1b71758e219652bd3c36113404ea4a8
2915 {{0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
2916 // (ten2mx >> 128) = a7c5ac471b4784230fcf80dc33721d53
2917 {{0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
2918 // (ten2mx >> 128) = 8637bd05af6c69b5a63f9a49c2c1b10f
2919 {{0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
2920 // (ten2mx >> 128) = d6bf94d5e57a42bc3d32907604691b4c
2921 {{0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
2922 // (ten2mx >> 128) = abcc77118461cefcfdc20d2b36ba7c3d
2923 {{0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
2924 // (ten2mx >> 128) = 89705f4136b4a59731680a88f8953030
2925 {{0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
2926 // (ten2mx >> 128) = dbe6fecebdedd5beb573440e5a884d1b
2927 {{0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
2928 // (ten2mx >> 128) = afebff0bcb24aafef78f69a51539d748
2929 {{0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
2930 // (ten2mx >> 128) = 8cbccc096f5088cbf93f87b7442e45d3
2931 {{0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
2932 // (ten2mx >> 128) = e12e13424bb40e132865a5f206b06fb9
2933 {{0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
2934 // (ten2mx >> 128) = b424dc35095cd80f538484c19ef38c94
2935 {{0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
2936 // (ten2mx >> 128) = 901d7cf73ab0acd90f9d37014bf60a10
2937 {{0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
2938 // (ten2mx >> 128) = e69594bec44de15b4c2ebe687989a9b3
2939 {{0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
2940 // (ten2mx >> 128) = b877aa3236a4b44909befeb9fad487c2
2941 {{0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
2942 // (ten2mx >> 128) = 9392ee8e921d5d073aff322e62439fcf
2943 {{0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
2944 // (ten2mx >> 128) = ec1e4a7db69561a52b31e9e3d06c32e5
2945 {{0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
2946 // (ten2mx >> 128) = bce5086492111aea88f4bb1ca6bcf584
2947 {{0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
2948 // (ten2mx >> 128) = 971da05074da7beed3f6fc16ebca5e03
2949 {{0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
2950 // (ten2mx >> 128) = f1c90080baf72cb15324c68b12dd6338
2951 {{0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
2952 // (ten2mx >> 128) = c16d9a0095928a2775b7053c0f178293
2953 {{0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
2954 // (ten2mx >> 128) = 9abe14cd44753b52c4926a9672793542
2955 {{0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
2956 // (ten2mx >> 128) = f79687aed3eec5513a83ddbd83f52204
2957 {{0x95364afe032a819dULL, 0xc612062576589ddaULL}},
2958 // (ten2mx >> 128) = c612062576589dda95364afe032a819d
2959 {{0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
2960 // (ten2mx >> 128) = 9e74d1b791e07e48775ea264cf55347d
2961 {{0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
2962 // (ten2mx >> 128) = fd87b5f28300ca0d8bca9d6e188853fc
2963 {{0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
2964 // (ten2mx >> 128) = cad2f7f5359a3b3e096ee45813a04330
2965 {{0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
2966 // (ten2mx >> 128) = a2425ff75e14fc31a1258379a94d028d
2967 {{0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
2968 // (ten2mx >> 128) = 81ceb32c4b43fcf480eacf948770ced7
2969 {{0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
2970 // (ten2mx >> 128) = cfb11ead453994ba67de18eda5814af2
2971 {{0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
2972 // (ten2mx >> 128) = a6274bbdd0fadd61ecb1ad8aeacdd58e
2973 {{0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
2974 // (ten2mx >> 128) = 84ec3c97da624ab4bd5af13bef0b113e
2975 {{0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
2976 // (ten2mx >> 128) = d4ad2dbfc3d07787955e4ec64b44e864
2977 {{0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
2978 // (ten2mx >> 128) = aa242499697392d2dde50bd1d5d0b9e9
2979 {{0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}}
2980 // (ten2mx >> 128) = 881cea14545c75757e50d64177da2e54
2983 UINT192 Kx192[] = {
2984 {{0xcccccccccccccccdULL, 0xccccccccccccccccULL,
2985 0xccccccccccccccccULL}},
2986 // 10^-1 ~= cccccccccccccccccccccccccccccccccccccccccccccccd * 2^-195
2987 {{0xd70a3d70a3d70a3eULL, 0x3d70a3d70a3d70a3ULL,
2988 0xa3d70a3d70a3d70aULL}},
2989 // 10^-2 ~= a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3e * 2^-198
2990 {{0x78d4fdf3b645a1cbULL, 0x645a1cac083126e9ULL,
2991 0x83126e978d4fdf3bULL}},
2992 // 10^-3 ~= 83126e978d4fdf3b645a1cac083126e978d4fdf3b645a1cb * 2^-201
2993 {{0xc154c985f06f6945ULL, 0xd3c36113404ea4a8ULL,
2994 0xd1b71758e219652bULL}},
2995 // 10^-4 ~= d1b71758e219652bd3c36113404ea4a8c154c985f06f6945 * 2^-205
2996 {{0xcddd6e04c0592104ULL, 0x0fcf80dc33721d53ULL,
2997 0xa7c5ac471b478423ULL}},
2998 // 10^-5 ~= a7c5ac471b4784230fcf80dc33721d53cddd6e04c0592104 * 2^-208
2999 {{0xd7e45803cd141a6aULL, 0xa63f9a49c2c1b10fULL,
3000 0x8637bd05af6c69b5ULL}},
3001 // 10^-6 ~= 8637bd05af6c69b5a63f9a49c2c1b10fd7e45803cd141a6a * 2^-211
3002 {{0x8ca08cd2e1b9c3dcULL, 0x3d32907604691b4cULL,
3003 0xd6bf94d5e57a42bcULL}},
3004 // 10^-7 ~= d6bf94d5e57a42bc3d32907604691b4c8ca08cd2e1b9c3dc * 2^-215
3005 {{0x3d4d3d758161697dULL, 0xfdc20d2b36ba7c3dULL,
3006 0xabcc77118461cefcULL}},
3007 // 10^-8 ~= abcc77118461cefcfdc20d2b36ba7c3d3d4d3d758161697d * 2^-218
3008 {{0xfdd7645e011abacaULL, 0x31680a88f8953030ULL,
3009 0x89705f4136b4a597ULL}},
3010 // 10^-9 ~= 89705f4136b4a59731680a88f8953030fdd7645e011abaca * 2^-221
3011 {{0x2fbf06fcce912addULL, 0xb573440e5a884d1bULL,
3012 0xdbe6fecebdedd5beULL}},
3013 // 10^-10 ~= dbe6fecebdedd5beb573440e5a884d1b2fbf06fcce912add * 2^-225
3014 {{0xf2ff38ca3eda88b1ULL, 0xf78f69a51539d748ULL,
3015 0xafebff0bcb24aafeULL}},
3016 // 10^-11 ~= afebff0bcb24aafef78f69a51539d748f2ff38ca3eda88b1 * 2^-228
3017 {{0xf598fa3b657ba08eULL, 0xf93f87b7442e45d3ULL,
3018 0x8cbccc096f5088cbULL}},
3019 // 10^-12 ~= 8cbccc096f5088cbf93f87b7442e45d3f598fa3b657ba08e * 2^-231
3020 {{0x88f4c3923bf900e3ULL, 0x2865a5f206b06fb9ULL,
3021 0xe12e13424bb40e13ULL}},
3022 // 10^-13 ~= e12e13424bb40e132865a5f206b06fb988f4c3923bf900e3 * 2^-235
3023 {{0x6d909c74fcc733e9ULL, 0x538484c19ef38c94ULL,
3024 0xb424dc35095cd80fULL}},
3025 // 10^-14 ~= b424dc35095cd80f538484c19ef38c946d909c74fcc733e9 * 2^-238
3026 {{0x57a6e390ca38f654ULL, 0x0f9d37014bf60a10ULL,
3027 0x901d7cf73ab0acd9ULL}},
3028 // 10^-15 ~= 901d7cf73ab0acd90f9d37014bf60a1057a6e390ca38f654 * 2^-241
3029 {{0xbf716c1add27f086ULL, 0x4c2ebe687989a9b3ULL,
3030 0xe69594bec44de15bULL}},
3031 // 10^-16 ~= e69594bec44de15b4c2ebe687989a9b3bf716c1add27f086 * 2^-245
3032 {{0xff8df0157db98d38ULL, 0x09befeb9fad487c2ULL,
3033 0xb877aa3236a4b449ULL}},
3034 // 10^-17 ~= b877aa3236a4b44909befeb9fad487c2ff8df0157db98d38 * 2^-248
3035 {{0x32d7f344649470faULL, 0x3aff322e62439fcfULL,
3036 0x9392ee8e921d5d07ULL}},
3037 // 10^-18 ~= 9392ee8e921d5d073aff322e62439fcf32d7f344649470fa * 2^-251
3038 {{0x1e2652070753e7f5ULL, 0x2b31e9e3d06c32e5ULL,
3039 0xec1e4a7db69561a5ULL}},
3040 // 10^-19 ~= ec1e4a7db69561a52b31e9e3d06c32e51e2652070753e7f5 * 2^-255
3041 {{0x181ea8059f76532bULL, 0x88f4bb1ca6bcf584ULL,
3042 0xbce5086492111aeaULL}},
3043 // 10^-20 ~= bce5086492111aea88f4bb1ca6bcf584181ea8059f76532b * 2^-258
3044 {{0x467eecd14c5ea8efULL, 0xd3f6fc16ebca5e03ULL,
3045 0x971da05074da7beeULL}},
3046 // 10^-21 ~= 971da05074da7beed3f6fc16ebca5e03467eecd14c5ea8ef * 2^-261
3047 {{0x70cb148213caa7e5ULL, 0x5324c68b12dd6338ULL,
3048 0xf1c90080baf72cb1ULL}},
3049 // 10^-22 ~= f1c90080baf72cb15324c68b12dd633870cb148213caa7e5 * 2^-265
3050 {{0x8d6f439b43088651ULL, 0x75b7053c0f178293ULL,
3051 0xc16d9a0095928a27ULL}},
3052 // 10^-23 ~= c16d9a0095928a2775b7053c0f1782938d6f439b43088651 * 2^-268
3053 {{0xd78c3615cf3a050dULL, 0xc4926a9672793542ULL,
3054 0x9abe14cd44753b52ULL}},
3055 // 10^-24 ~= 9abe14cd44753b52c4926a9672793542d78c3615cf3a050d * 2^-271
3056 {{0x8c1389bc7ec33b48ULL, 0x3a83ddbd83f52204ULL,
3057 0xf79687aed3eec551ULL}},
3058 // 10^-25 ~= f79687aed3eec5513a83ddbd83f522048c1389bc7ec33b48 * 2^-275
3059 {{0x3cdc6e306568fc3aULL, 0x95364afe032a819dULL,
3060 0xc612062576589ddaULL}},
3061 // 10^-26 ~= c612062576589dda95364afe032a819d3cdc6e306568fc3a * 2^-278
3062 {{0xca49f1c05120c9c8ULL, 0x775ea264cf55347dULL,
3063 0x9e74d1b791e07e48ULL}},
3064 // 10^-27 ~= 9e74d1b791e07e48775ea264cf55347dca49f1c05120c9c8 * 2^-281
3065 {{0x76dcb60081ce0fa6ULL, 0x8bca9d6e188853fcULL,
3066 0xfd87b5f28300ca0dULL}},
3067 // 10^-28 ~= fd87b5f28300ca0d8bca9d6e188853fc76dcb60081ce0fa6 * 2^-285
3068 {{0x5f16f80067d80c85ULL, 0x096ee45813a04330ULL,
3069 0xcad2f7f5359a3b3eULL}},
3070 // 10^-29 ~= cad2f7f5359a3b3e096ee45813a043305f16f80067d80c85 * 2^-288
3071 {{0x18df2ccd1fe00a04ULL, 0xa1258379a94d028dULL,
3072 0xa2425ff75e14fc31ULL}},
3073 // 10^-30 ~= a2425ff75e14fc31a1258379a94d028d18df2ccd1fe00a04 * 2^-291
3074 {{0x4718f0a419800803ULL, 0x80eacf948770ced7ULL,
3075 0x81ceb32c4b43fcf4ULL}},
3076 // 10^-31 ~= 81ceb32c4b43fcf480eacf948770ced74718f0a419800803 * 2^-294
3077 {{0x0b5b1aa028ccd99fULL, 0x67de18eda5814af2ULL,
3078 0xcfb11ead453994baULL}},
3079 // 10^-32 ~= cfb11ead453994ba67de18eda5814af20b5b1aa028ccd99f * 2^-298
3080 {{0x6f7c154ced70ae19ULL, 0xecb1ad8aeacdd58eULL,
3081 0xa6274bbdd0fadd61ULL}},
3082 // 10^-33 ~= a6274bbdd0fadd61ecb1ad8aeacdd58e6f7c154ced70ae19 * 2^-301
3083 {{0xbf967770bdf3be7aULL, 0xbd5af13bef0b113eULL,
3084 0x84ec3c97da624ab4ULL}},
3085 // 10^-34 ~= 84ec3c97da624ab4bd5af13bef0b113ebf967770bdf3be7a * 2^-304
3086 {{0x65bd8be79652ca5dULL, 0x955e4ec64b44e864ULL,
3087 0xd4ad2dbfc3d07787ULL}},
3088 // 10^-35 ~= d4ad2dbfc3d07787955e4ec64b44e86465bd8be79652ca5d * 2^-308
3089 {{0xeafe098611dbd517ULL, 0xdde50bd1d5d0b9e9ULL,
3090 0xaa242499697392d2ULL}},
3091 // 10^-36 ~= aa242499697392d2dde50bd1d5d0b9e9eafe098611dbd517 * 2^-311
3092 {{0xbbfe6e04db164413ULL, 0x7e50d64177da2e54ULL,
3093 0x881cea14545c7575ULL}},
3094 // 10^-37 ~= 881cea14545c75757e50d64177da2e54bbfe6e04db164413 * 2^-314
3095 {{0x2cca49a15e8a0684ULL, 0x96e7bd358c904a21ULL,
3096 0xd9c7dced53c72255ULL}},
3097 // 10^-38 ~= d9c7dced53c7225596e7bd358c904a212cca49a15e8a0684 * 2^-318
3098 {{0x8a3b6e1ab2080537ULL, 0xabec975e0a0d081aULL,
3099 0xae397d8aa96c1b77ULL}},
3100 // 10^-39 ~= ae397d8aa96c1b77abec975e0a0d081a8a3b6e1ab2080537 * 2^-321
3101 {{0x3b62be7bc1a0042cULL, 0x2323ac4b3b3da015ULL,
3102 0x8b61313bbabce2c6ULL}},
3103 // 10^-40 ~= 8b61313bbabce2c62323ac4b3b3da0153b62be7bc1a0042c * 2^-324
3104 {{0x5f0463f935ccd379ULL, 0x6b6c46dec52f6688ULL,
3105 0xdf01e85f912e37a3ULL}},
3106 // 10^-41 ~= df01e85f912e37a36b6c46dec52f66885f0463f935ccd379 * 2^-328
3107 {{0x7f36b660f7d70f94ULL, 0x55f038b237591ed3ULL,
3108 0xb267ed1940f1c61cULL}},
3109 // 10^-42 ~= b267ed1940f1c61c55f038b237591ed37f36b660f7d70f94 * 2^-331
3110 {{0xcc2bc51a5fdf3faaULL, 0x77f3608e92adb242ULL,
3111 0x8eb98a7a9a5b04e3ULL}},
3112 // 10^-43 ~= 8eb98a7a9a5b04e377f3608e92adb242cc2bc51a5fdf3faa * 2^-334
3113 {{0xe046082a32fecc42ULL, 0x8cb89a7db77c506aULL,
3114 0xe45c10c42a2b3b05ULL}},
3115 // 10^-44 ~= e45c10c42a2b3b058cb89a7db77c506ae046082a32fecc42 * 2^-338
3116 {{0x4d04d354f598a368ULL, 0x3d607b97c5fd0d22ULL,
3117 0xb6b00d69bb55c8d1ULL}},
3118 // 10^-45 ~= b6b00d69bb55c8d13d607b97c5fd0d224d04d354f598a368 * 2^-341
3119 {{0x3d9d75dd9146e920ULL, 0xcab3961304ca70e8ULL,
3120 0x9226712162ab070dULL}},
3121 // 10^-46 ~= 9226712162ab070dcab3961304ca70e83d9d75dd9146e920 * 2^-344
3122 {{0xc8fbefc8e8717500ULL, 0xaab8f01e6e10b4a6ULL,
3123 0xe9d71b689dde71afULL}},
3124 // 10^-47 ~= e9d71b689dde71afaab8f01e6e10b4a6c8fbefc8e8717500 * 2^-348
3125 {{0x3a63263a538df734ULL, 0x5560c018580d5d52ULL,
3126 0xbb127c53b17ec159ULL}},
3127 // 10^-48 ~= bb127c53b17ec1595560c018580d5d523a63263a538df734 * 2^-351
3128 {{0x2eb5b82ea93e5f5dULL, 0xdde7001379a44aa8ULL,
3129 0x95a8637627989aadULL}},
3130 // 10^-49 ~= 95a8637627989aaddde7001379a44aa82eb5b82ea93e5f5d * 2^-354
3131 {{0x4abc59e441fd6561ULL, 0x963e66858f6d4440ULL,
3132 0xef73d256a5c0f77cULL}},
3133 // 10^-50 ~= ef73d256a5c0f77c963e66858f6d44404abc59e441fd6561 * 2^-358
3134 {{0x6efd14b69b311de7ULL, 0xde98520472bdd033ULL,
3135 0xbf8fdb78849a5f96ULL}},
3136 // 10^-51 ~= bf8fdb78849a5f96de98520472bdd0336efd14b69b311de7 * 2^-361
3137 {{0x259743c548f417ecULL, 0xe546a8038efe4029ULL,
3138 0x993fe2c6d07b7fabULL}},
3139 // 10^-52 ~= 993fe2c6d07b7fabe546a8038efe4029259743c548f417ec * 2^-364
3140 {{0x3c25393ba7ecf313ULL, 0xd53dd99f4b3066a8ULL,
3141 0xf53304714d9265dfULL}},
3142 // 10^-53 ~= f53304714d9265dfd53dd99f4b3066a83c25393ba7ecf313 * 2^-368
3143 {{0x96842dc95323f5a9ULL, 0xaa97e14c3c26b886ULL,
3144 0xc428d05aa4751e4cULL}},
3145 // 10^-54 ~= c428d05aa4751e4caa97e14c3c26b88696842dc95323f5a9 * 2^-371
3146 {{0xab9cf16ddc1cc487ULL, 0x55464dd69685606bULL,
3147 0x9ced737bb6c4183dULL}},
3148 // 10^-55 ~= 9ced737bb6c4183d55464dd69685606bab9cf16ddc1cc487 * 2^-374
3149 {{0xac2e4f162cfad40bULL, 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}}
3150 // 10^-56 ~= fb158592be068d2eeed6e2f0f0d56712ac2e4f162cfad40b * 2^-378
3153 unsigned int Ex192m192[] = {
3154 3, // 195 - 192, Ex = 195
3155 6, // 198 - 192, Ex = 198
3156 9, // 201 - 192, Ex = 201
3157 13, // 205 - 192, Ex = 205
3158 16, // 208 - 192, Ex = 208
3159 19, // 211 - 192, Ex = 211
3160 23, // 215 - 192, Ex = 215
3161 26, // 218 - 192, Ex = 218
3162 29, // 221 - 192, Ex = 221
3163 33, // 225 - 192, Ex = 225
3164 36, // 228 - 192, Ex = 228
3165 39, // 231 - 192, Ex = 231
3166 43, // 235 - 192, Ex = 235
3167 46, // 238 - 192, Ex = 238
3168 49, // 241 - 192, Ex = 241
3169 53, // 245 - 192, Ex = 245
3170 56, // 248 - 192, Ex = 248
3171 59, // 251 - 192, Ex = 251
3172 63, // 255 - 192, Ex = 255
3173 2, // 258 - 256, Ex = 258
3174 5, // 261 - 256, Ex = 261
3175 9, // 265 - 256, Ex = 265
3176 12, // 268 - 256, Ex = 268
3177 15, // 271 - 256, Ex = 271
3178 19, // 275 - 256, Ex = 275
3179 22, // 278 - 256, Ex = 278
3180 25, // 281 - 256, Ex = 281
3181 29, // 285 - 256, Ex = 285
3182 32, // 288 - 256, Ex = 288
3183 35, // 291 - 256, Ex = 291
3184 38, // 294 - 256, Ex = 294
3185 42, // 298 - 256, Ex = 298
3186 45, // 301 - 256, Ex = 301
3187 48, // 304 - 256, Ex = 304
3188 52, // 308 - 256, Ex = 308
3189 55, // 311 - 256, Ex = 311
3190 58, // 314 - 256, Ex = 314
3191 62, // 318 - 256, Ex = 318
3192 1, // 321 - 320, Ex = 321
3193 4, // 324 - 320, Ex = 324
3194 8, // 328 - 320, Ex = 328
3195 11, // 331 - 320, Ex = 331
3196 14, // 334 - 320, Ex = 334
3197 18, // 338 - 320, Ex = 338
3198 21, // 341 - 320, Ex = 341
3199 24, // 344 - 320, Ex = 344
3200 28, // 348 - 320, Ex = 348
3201 31, // 351 - 320, Ex = 351
3202 34, // 354 - 320, Ex = 354
3203 38, // 358 - 320, Ex = 358
3204 41, // 361 - 320, Ex = 361
3205 44, // 364 - 320, Ex = 364
3206 48, // 368 - 320, Ex = 368
3207 51, // 371 - 320, Ex = 371
3208 54, // 374 - 320, Ex = 374
3209 58 // 378 - 320, Ex = 378
3212 UINT64 half192[] = {
3213 0x0000000000000004ULL, // half / 2^192 = 4
3214 0x0000000000000020ULL, // half / 2^192 = 20
3215 0x0000000000000100ULL, // half / 2^192 = 100
3216 0x0000000000001000ULL, // half / 2^192 = 1000
3217 0x0000000000008000ULL, // half / 2^192 = 8000
3218 0x0000000000040000ULL, // half / 2^192 = 40000
3219 0x0000000000400000ULL, // half / 2^192 = 400000
3220 0x0000000002000000ULL, // half / 2^192 = 2000000
3221 0x0000000010000000ULL, // half / 2^192 = 10000000
3222 0x0000000100000000ULL, // half / 2^192 = 100000000
3223 0x0000000800000000ULL, // half / 2^192 = 800000000
3224 0x0000004000000000ULL, // half / 2^192 = 4000000000
3225 0x0000040000000000ULL, // half / 2^192 = 40000000000
3226 0x0000200000000000ULL, // half / 2^192 = 200000000000
3227 0x0001000000000000ULL, // half / 2^192 = 1000000000000
3228 0x0010000000000000ULL, // half / 2^192 = 10000000000000
3229 0x0080000000000000ULL, // half / 2^192 = 80000000000000
3230 0x0400000000000000ULL, // half / 2^192 = 400000000000000
3231 0x4000000000000000ULL, // half / 2^192 = 4000000000000000
3232 0x0000000000000002ULL, // half / 2^256 = 2
3233 0x0000000000000010ULL, // half / 2^256 = 10
3234 0x0000000000000100ULL, // half / 2^256 = 100
3235 0x0000000000000800ULL, // half / 2^256 = 800
3236 0x0000000000004000ULL, // half / 2^256 = 4000
3237 0x0000000000040000ULL, // half / 2^256 = 40000
3238 0x0000000000200000ULL, // half / 2^256 = 200000
3239 0x0000000001000000ULL, // half / 2^256 = 1000000
3240 0x0000000010000000ULL, // half / 2^256 = 10000000
3241 0x0000000080000000ULL, // half / 2^256 = 80000000
3242 0x0000000400000000ULL, // half / 2^256 = 400000000
3243 0x0000002000000000ULL, // half / 2^256 = 2000000000
3244 0x0000020000000000ULL, // half / 2^256 = 20000000000
3245 0x0000100000000000ULL, // half / 2^256 = 100000000000
3246 0x0000800000000000ULL, // half / 2^256 = 800000000000
3247 0x0008000000000000ULL, // half / 2^256 = 8000000000000
3248 0x0040000000000000ULL, // half / 2^256 = 40000000000000
3249 0x0200000000000000ULL, // half / 2^256 = 200000000000000
3250 0x2000000000000000ULL, // half / 2^256 = 2000000000000000
3251 0x0000000000000001ULL, // half / 2^320 = 1
3252 0x0000000000000008ULL, // half / 2^320 = 8
3253 0x0000000000000080ULL, // half / 2^320 = 80
3254 0x0000000000000400ULL, // half / 2^320 = 400
3255 0x0000000000002000ULL, // half / 2^320 = 2000
3256 0x0000000000020000ULL, // half / 2^320 = 20000
3257 0x0000000000100000ULL, // half / 2^320 = 100000
3258 0x0000000000800000ULL, // half / 2^320 = 800000
3259 0x0000000008000000ULL, // half / 2^320 = 8000000
3260 0x0000000040000000ULL, // half / 2^320 = 40000000
3261 0x0000000200000000ULL, // half / 2^320 = 200000000
3262 0x0000002000000000ULL, // half / 2^320 = 2000000000
3263 0x0000010000000000ULL, // half / 2^320 = 10000000000
3264 0x0000080000000000ULL, // half / 2^320 = 80000000000
3265 0x0000800000000000ULL, // half / 2^320 = 800000000000
3266 0x0004000000000000ULL, // half / 2^320 = 4000000000000
3267 0x0020000000000000ULL, // half / 2^320 = 20000000000000
3268 0x0200000000000000ULL // half / 2^320 = 200000000000000
3271 UINT64 mask192[] = {
3272 0x0000000000000007ULL, // mask / 2^192
3273 0x000000000000003fULL, // mask / 2^192
3274 0x00000000000001ffULL, // mask / 2^192
3275 0x0000000000001fffULL, // mask / 2^192
3276 0x000000000000ffffULL, // mask / 2^192
3277 0x000000000007ffffULL, // mask / 2^192
3278 0x00000000007fffffULL, // mask / 2^192
3279 0x0000000003ffffffULL, // mask / 2^192
3280 0x000000001fffffffULL, // mask / 2^192
3281 0x00000001ffffffffULL, // mask / 2^192
3282 0x0000000fffffffffULL, // mask / 2^192
3283 0x0000007fffffffffULL, // mask / 2^192
3284 0x000007ffffffffffULL, // mask / 2^192
3285 0x00003fffffffffffULL, // mask / 2^192
3286 0x0001ffffffffffffULL, // mask / 2^192
3287 0x001fffffffffffffULL, // mask / 2^192
3288 0x00ffffffffffffffULL, // mask / 2^192
3289 0x07ffffffffffffffULL, // mask / 2^192
3290 0x7fffffffffffffffULL, // mask / 2^192
3291 0x0000000000000003ULL, // mask / 2^256
3292 0x000000000000001fULL, // mask / 2^256
3293 0x00000000000001ffULL, // mask / 2^256
3294 0x0000000000000fffULL, // mask / 2^256
3295 0x0000000000007fffULL, // mask / 2^256
3296 0x000000000007ffffULL, // mask / 2^256
3297 0x00000000003fffffULL, // mask / 2^256
3298 0x0000000001ffffffULL, // mask / 2^256
3299 0x000000001fffffffULL, // mask / 2^256
3300 0x00000000ffffffffULL, // mask / 2^256
3301 0x00000007ffffffffULL, // mask / 2^256
3302 0x0000003fffffffffULL, // mask / 2^256
3303 0x000003ffffffffffULL, // mask / 2^256
3304 0x00001fffffffffffULL, // mask / 2^256
3305 0x0000ffffffffffffULL, // mask / 2^256
3306 0x000fffffffffffffULL, // mask / 2^256
3307 0x007fffffffffffffULL, // mask / 2^256
3308 0x03ffffffffffffffULL, // mask / 2^256
3309 0x3fffffffffffffffULL, // mask / 2^256
3310 0x0000000000000001ULL, // mask / 2^320
3311 0x000000000000000fULL, // mask / 2^320
3312 0x00000000000000ffULL, // mask / 2^320
3313 0x00000000000007ffULL, // mask / 2^320
3314 0x0000000000003fffULL, // mask / 2^320
3315 0x000000000003ffffULL, // mask / 2^320
3316 0x00000000001fffffULL, // mask / 2^320
3317 0x0000000000ffffffULL, // mask / 2^320
3318 0x000000000fffffffULL, // mask / 2^320
3319 0x000000007fffffffULL, // mask / 2^320
3320 0x00000003ffffffffULL, // mask / 2^320
3321 0x0000003fffffffffULL, // mask / 2^320
3322 0x000001ffffffffffULL, // mask / 2^320
3323 0x00000fffffffffffULL, // mask / 2^320
3324 0x0000ffffffffffffULL, // mask / 2^320
3325 0x0007ffffffffffffULL, // mask / 2^320
3326 0x003fffffffffffffULL, // mask / 2^320
3327 0x03ffffffffffffffULL // mask / 2^320
3330 UINT192 ten2mxtrunc192[] = {
3331 {{0xccccccccccccccccULL, 0xccccccccccccccccULL,
3332 0xccccccccccccccccULL}},
3333 // (ten2mx >> 192) = cccccccccccccccccccccccccccccccccccccccccccccccc
3334 {{0xd70a3d70a3d70a3dULL, 0x3d70a3d70a3d70a3ULL,
3335 0xa3d70a3d70a3d70aULL}},
3336 // (ten2mx >> 192) = a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d70a3d
3337 {{0x78d4fdf3b645a1caULL, 0x645a1cac083126e9ULL,
3338 0x83126e978d4fdf3bULL}},
3339 // (ten2mx >> 192) = 83126e978d4fdf3b645a1cac083126e978d4fdf3b645a1ca
3340 {{0xc154c985f06f6944ULL, 0xd3c36113404ea4a8ULL,
3341 0xd1b71758e219652bULL}},
3342 // (ten2mx >> 192) = d1b71758e219652bd3c36113404ea4a8c154c985f06f6944
3343 {{0xcddd6e04c0592103ULL, 0x0fcf80dc33721d53ULL,
3344 0xa7c5ac471b478423ULL}},
3345 // (ten2mx >> 192) = a7c5ac471b4784230fcf80dc33721d53cddd6e04c0592103
3346 {{0xd7e45803cd141a69ULL, 0xa63f9a49c2c1b10fULL,
3347 0x8637bd05af6c69b5ULL}},
3348 // (ten2mx >> 192) = 8637bd05af6c69b5a63f9a49c2c1b10fd7e45803cd141a69
3349 {{0x8ca08cd2e1b9c3dbULL, 0x3d32907604691b4cULL,
3350 0xd6bf94d5e57a42bcULL}},
3351 // (ten2mx >> 192) = d6bf94d5e57a42bc3d32907604691b4c8ca08cd2e1b9c3db
3352 {{0x3d4d3d758161697cULL, 0xfdc20d2b36ba7c3dULL,
3353 0xabcc77118461cefcULL}},
3354 // (ten2mx >> 192) = abcc77118461cefcfdc20d2b36ba7c3d3d4d3d758161697c
3355 {{0xfdd7645e011abac9ULL, 0x31680a88f8953030ULL,
3356 0x89705f4136b4a597ULL}},
3357 // (ten2mx >> 192) = 89705f4136b4a59731680a88f8953030fdd7645e011abac9
3358 {{0x2fbf06fcce912adcULL, 0xb573440e5a884d1bULL,
3359 0xdbe6fecebdedd5beULL}},
3360 // (ten2mx >> 192) = dbe6fecebdedd5beb573440e5a884d1b2fbf06fcce912adc
3361 {{0xf2ff38ca3eda88b0ULL, 0xf78f69a51539d748ULL,
3362 0xafebff0bcb24aafeULL}},
3363 // (ten2mx >> 192) = afebff0bcb24aafef78f69a51539d748f2ff38ca3eda88b0
3364 {{0xf598fa3b657ba08dULL, 0xf93f87b7442e45d3ULL,
3365 0x8cbccc096f5088cbULL}},
3366 // (ten2mx >> 192) = 8cbccc096f5088cbf93f87b7442e45d3f598fa3b657ba08d
3367 {{0x88f4c3923bf900e2ULL, 0x2865a5f206b06fb9ULL,
3368 0xe12e13424bb40e13ULL}},
3369 // (ten2mx >> 192) = e12e13424bb40e132865a5f206b06fb988f4c3923bf900e2
3370 {{0x6d909c74fcc733e8ULL, 0x538484c19ef38c94ULL,
3371 0xb424dc35095cd80fULL}},
3372 // (ten2mx >> 192) = b424dc35095cd80f538484c19ef38c946d909c74fcc733e8
3373 {{0x57a6e390ca38f653ULL, 0x0f9d37014bf60a10ULL,
3374 0x901d7cf73ab0acd9ULL}},
3375 // (ten2mx >> 192) = 901d7cf73ab0acd90f9d37014bf60a1057a6e390ca38f653
3376 {{0xbf716c1add27f085ULL, 0x4c2ebe687989a9b3ULL,
3377 0xe69594bec44de15bULL}},
3378 // (ten2mx >> 192) = e69594bec44de15b4c2ebe687989a9b3bf716c1add27f085
3379 {{0xff8df0157db98d37ULL, 0x09befeb9fad487c2ULL,
3380 0xb877aa3236a4b449ULL}},
3381 // (ten2mx >> 192) = b877aa3236a4b44909befeb9fad487c2ff8df0157db98d37
3382 {{0x32d7f344649470f9ULL, 0x3aff322e62439fcfULL,
3383 0x9392ee8e921d5d07ULL}},
3384 // (ten2mx >> 192) = 9392ee8e921d5d073aff322e62439fcf32d7f344649470f9
3385 {{0x1e2652070753e7f4ULL, 0x2b31e9e3d06c32e5ULL,
3386 0xec1e4a7db69561a5ULL}},
3387 // (ten2mx >> 192) = ec1e4a7db69561a52b31e9e3d06c32e51e2652070753e7f4
3388 {{0x181ea8059f76532aULL, 0x88f4bb1ca6bcf584ULL,
3389 0xbce5086492111aeaULL}},
3390 // (ten2mx >> 192) = bce5086492111aea88f4bb1ca6bcf584181ea8059f76532a
3391 {{0x467eecd14c5ea8eeULL, 0xd3f6fc16ebca5e03ULL,
3392 0x971da05074da7beeULL}},
3393 // (ten2mx >> 192) = 971da05074da7beed3f6fc16ebca5e03467eecd14c5ea8ee
3394 {{0x70cb148213caa7e4ULL, 0x5324c68b12dd6338ULL,
3395 0xf1c90080baf72cb1ULL}},
3396 // (ten2mx >> 192) = f1c90080baf72cb15324c68b12dd633870cb148213caa7e4
3397 {{0x8d6f439b43088650ULL, 0x75b7053c0f178293ULL,
3398 0xc16d9a0095928a27ULL}},
3399 // (ten2mx >> 192) = c16d9a0095928a2775b7053c0f1782938d6f439b43088650
3400 {{0xd78c3615cf3a050cULL, 0xc4926a9672793542ULL,
3401 0x9abe14cd44753b52ULL}},
3402 // (ten2mx >> 192) = 9abe14cd44753b52c4926a9672793542d78c3615cf3a050c
3403 {{0x8c1389bc7ec33b47ULL, 0x3a83ddbd83f52204ULL,
3404 0xf79687aed3eec551ULL}},
3405 // (ten2mx >> 192) = f79687aed3eec5513a83ddbd83f522048c1389bc7ec33b47
3406 {{0x3cdc6e306568fc39ULL, 0x95364afe032a819dULL,
3407 0xc612062576589ddaULL}},
3408 // (ten2mx >> 192) = c612062576589dda95364afe032a819d3cdc6e306568fc39
3409 {{0xca49f1c05120c9c7ULL, 0x775ea264cf55347dULL,
3410 0x9e74d1b791e07e48ULL}},
3411 // (ten2mx >> 192) = 9e74d1b791e07e48775ea264cf55347dca49f1c05120c9c7
3412 {{0x76dcb60081ce0fa5ULL, 0x8bca9d6e188853fcULL,
3413 0xfd87b5f28300ca0dULL}},
3414 // (ten2mx >> 192) = fd87b5f28300ca0d8bca9d6e188853fc76dcb60081ce0fa5
3415 {{0x5f16f80067d80c84ULL, 0x096ee45813a04330ULL,
3416 0xcad2f7f5359a3b3eULL}},
3417 // (ten2mx >> 192) = cad2f7f5359a3b3e096ee45813a043305f16f80067d80c84
3418 {{0x18df2ccd1fe00a03ULL, 0xa1258379a94d028dULL,
3419 0xa2425ff75e14fc31ULL}},
3420 // (ten2mx >> 192) = a2425ff75e14fc31a1258379a94d028d18df2ccd1fe00a03
3421 {{0x4718f0a419800802ULL, 0x80eacf948770ced7ULL,
3422 0x81ceb32c4b43fcf4ULL}},
3423 // (ten2mx >> 192) = 81ceb32c4b43fcf480eacf948770ced74718f0a419800802
3424 {{0x0b5b1aa028ccd99eULL, 0x67de18eda5814af2ULL,
3425 0xcfb11ead453994baULL}},
3426 // (ten2mx >> 192) = cfb11ead453994ba67de18eda5814af20b5b1aa028ccd99e
3427 {{0x6f7c154ced70ae18ULL, 0xecb1ad8aeacdd58eULL,
3428 0xa6274bbdd0fadd61ULL}},
3429 // (ten2mx >> 192) = a6274bbdd0fadd61ecb1ad8aeacdd58e6f7c154ced70ae18
3430 {{0xbf967770bdf3be79ULL, 0xbd5af13bef0b113eULL,
3431 0x84ec3c97da624ab4ULL}},
3432 // (ten2mx >> 192) = 84ec3c97da624ab4bd5af13bef0b113ebf967770bdf3be79
3433 {{0x65bd8be79652ca5cULL, 0x955e4ec64b44e864ULL,
3434 0xd4ad2dbfc3d07787ULL}},
3435 // (ten2mx >> 192) = d4ad2dbfc3d07787955e4ec64b44e86465bd8be79652ca5c
3436 {{0xeafe098611dbd516ULL, 0xdde50bd1d5d0b9e9ULL,
3437 0xaa242499697392d2ULL}},
3438 // (ten2mx >> 192) = aa242499697392d2dde50bd1d5d0b9e9eafe098611dbd516
3439 {{0xbbfe6e04db164412ULL, 0x7e50d64177da2e54ULL,
3440 0x881cea14545c7575ULL}},
3441 // (ten2mx >> 192) = 881cea14545c75757e50d64177da2e54bbfe6e04db164412
3442 {{0x2cca49a15e8a0683ULL, 0x96e7bd358c904a21ULL,
3443 0xd9c7dced53c72255ULL}},
3444 // (ten2mx >> 192) = d9c7dced53c7225596e7bd358c904a212cca49a15e8a0683
3445 {{0x8a3b6e1ab2080536ULL, 0xabec975e0a0d081aULL,
3446 0xae397d8aa96c1b77ULL}},
3447 // (ten2mx >> 192) = ae397d8aa96c1b77abec975e0a0d081a8a3b6e1ab2080536
3448 {{0x3b62be7bc1a0042bULL, 0x2323ac4b3b3da015ULL,
3449 0x8b61313bbabce2c6ULL}},
3450 // (ten2mx >> 192) = 8b61313bbabce2c62323ac4b3b3da0153b62be7bc1a0042b
3451 {{0x5f0463f935ccd378ULL, 0x6b6c46dec52f6688ULL,
3452 0xdf01e85f912e37a3ULL}},
3453 // (ten2mx >> 192) = df01e85f912e37a36b6c46dec52f66885f0463f935ccd378
3454 {{0x7f36b660f7d70f93ULL, 0x55f038b237591ed3ULL,
3455 0xb267ed1940f1c61cULL}},
3456 // (ten2mx >> 192) = b267ed1940f1c61c55f038b237591ed37f36b660f7d70f93
3457 {{0xcc2bc51a5fdf3fa9ULL, 0x77f3608e92adb242ULL,
3458 0x8eb98a7a9a5b04e3ULL}},
3459 // (ten2mx >> 192) = 8eb98a7a9a5b04e377f3608e92adb242cc2bc51a5fdf3fa9
3460 {{0xe046082a32fecc41ULL, 0x8cb89a7db77c506aULL,
3461 0xe45c10c42a2b3b05ULL}},
3462 // (ten2mx >> 192) = e45c10c42a2b3b058cb89a7db77c506ae046082a32fecc41
3463 {{0x4d04d354f598a367ULL, 0x3d607b97c5fd0d22ULL,
3464 0xb6b00d69bb55c8d1ULL}},
3465 // (ten2mx >> 192) = b6b00d69bb55c8d13d607b97c5fd0d224d04d354f598a367
3466 {{0x3d9d75dd9146e91fULL, 0xcab3961304ca70e8ULL,
3467 0x9226712162ab070dULL}},
3468 // (ten2mx >> 192) = 9226712162ab070dcab3961304ca70e83d9d75dd9146e91f
3469 {{0xc8fbefc8e87174ffULL, 0xaab8f01e6e10b4a6ULL,
3470 0xe9d71b689dde71afULL}},
3471 // (ten2mx >> 192) = e9d71b689dde71afaab8f01e6e10b4a6c8fbefc8e87174ff
3472 {{0x3a63263a538df733ULL, 0x5560c018580d5d52ULL,
3473 0xbb127c53b17ec159ULL}},
3474 // (ten2mx >> 192) = bb127c53b17ec1595560c018580d5d523a63263a538df733
3475 {{0x2eb5b82ea93e5f5cULL, 0xdde7001379a44aa8ULL,
3476 0x95a8637627989aadULL}},
3477 // (ten2mx >> 192) = 95a8637627989aaddde7001379a44aa82eb5b82ea93e5f5c
3478 {{0x4abc59e441fd6560ULL, 0x963e66858f6d4440ULL,
3479 0xef73d256a5c0f77cULL}},
3480 // (ten2mx >> 192) = ef73d256a5c0f77c963e66858f6d44404abc59e441fd6560
3481 {{0x6efd14b69b311de6ULL, 0xde98520472bdd033ULL,
3482 0xbf8fdb78849a5f96ULL}},
3483 // (ten2mx >> 192) = bf8fdb78849a5f96de98520472bdd0336efd14b69b311de6
3484 {{0x259743c548f417ebULL, 0xe546a8038efe4029ULL,
3485 0x993fe2c6d07b7fabULL}},
3486 // (ten2mx >> 192) = 993fe2c6d07b7fabe546a8038efe4029259743c548f417eb
3487 {{0x3c25393ba7ecf312ULL, 0xd53dd99f4b3066a8ULL,
3488 0xf53304714d9265dfULL}},
3489 // (ten2mx >> 192) = f53304714d9265dfd53dd99f4b3066a83c25393ba7ecf312
3490 {{0x96842dc95323f5a8ULL, 0xaa97e14c3c26b886ULL,
3491 0xc428d05aa4751e4cULL}},
3492 // (ten2mx >> 192) = c428d05aa4751e4caa97e14c3c26b88696842dc95323f5a8
3493 {{0xab9cf16ddc1cc486ULL, 0x55464dd69685606bULL,
3494 0x9ced737bb6c4183dULL}},
3495 // (ten2mx >> 192) = 9ced737bb6c4183d55464dd69685606bab9cf16ddc1cc486
3496 {{0xac2e4f162cfad40aULL, 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}}
3497 // (ten2mx >> 192) = fb158592be068d2eeed6e2f0f0d56712ac2e4f162cfad40a
3500 UINT256 Kx256[] = {
3501 {{0xcccccccccccccccdULL, 0xccccccccccccccccULL,
3502 0xccccccccccccccccULL, 0xccccccccccccccccULL}},
3503 // 10^-1 ~= cccccccccccccccc cccccccccccccccc
3504 // cccccccccccccccccccccccccccccccd * 2^-259
3505 {{0x70a3d70a3d70a3d8ULL, 0xd70a3d70a3d70a3dULL,
3506 0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
3507 // 10^-2 ~= a3d70a3d70a3d70a 3d70a3d70a3d70a3
3508 // d70a3d70a3d70a3d70a3d70a3d70a3d8 * 2^-262
3509 {{0xc083126e978d4fe0ULL, 0x78d4fdf3b645a1caULL,
3510 0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
3511 // 10^-3 ~= 83126e978d4fdf3b 645a1cac083126e9
3512 // 78d4fdf3b645a1cac083126e978d4fe0 * 2^-265
3513 {{0x67381d7dbf487fccULL, 0xc154c985f06f6944ULL,
3514 0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
3515 // 10^-4 ~= d1b71758e219652b d3c36113404ea4a8
3516 // c154c985f06f694467381d7dbf487fcc * 2^-269
3517 {{0x85c67dfe32a0663dULL, 0xcddd6e04c0592103ULL,
3518 0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
3519 // 10^-5 ~= a7c5ac471b478423 fcf80dc33721d53
3520 // cddd6e04c059210385c67dfe32a0663d * 2^-272
3521 {{0x37d1fe64f54d1e97ULL, 0xd7e45803cd141a69ULL,
3522 0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
3523 // 10^-6 ~= 8637bd05af6c69b5 a63f9a49c2c1b10f
3524 // d7e45803cd141a6937d1fe64f54d1e97 * 2^-275
3525 {{0x8c8330a1887b6425ULL, 0x8ca08cd2e1b9c3dbULL,
3526 0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
3527 // 10^-7 ~= d6bf94d5e57a42bc 3d32907604691b4c
3528 // 8ca08cd2e1b9c3db8c8330a1887b6425 * 2^-279
3529 {{0x7068f3b46d2f8351ULL, 0x3d4d3d758161697cULL,
3530 0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
3531 // 10^-8 ~= abcc77118461cefc fdc20d2b36ba7c3d
3532 // 3d4d3d758161697c7068f3b46d2f8351 * 2^-282
3533 {{0xf387295d242602a7ULL, 0xfdd7645e011abac9ULL,
3534 0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
3535 // 10^-9 ~= 89705f4136b4a597 31680a88f8953030
3536 // fdd7645e011abac9f387295d242602a7 * 2^-285
3537 {{0xb8d8422ea03cd10bULL, 0x2fbf06fcce912adcULL,
3538 0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
3539 // 10^-10 ~= dbe6fecebdedd5be b573440e5a884d1b
3540 // 2fbf06fcce912adcb8d8422ea03cd10b * 2^-289
3541 {{0x93e034f219ca40d6ULL, 0xf2ff38ca3eda88b0ULL,
3542 0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
3543 // 10^-11 ~= afebff0bcb24aafe f78f69a51539d748
3544 // f2ff38ca3eda88b093e034f219ca40d6 * 2^-292
3545 {{0x4319c3f4e16e9a45ULL, 0xf598fa3b657ba08dULL,
3546 0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
3547 // 10^-12 ~= 8cbccc096f5088cb f93f87b7442e45d3
3548 // f598fa3b657ba08d4319c3f4e16e9a45 * 2^-295
3549 {{0x04f606549be42a07ULL, 0x88f4c3923bf900e2ULL,
3550 0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
3551 // 10^-13 ~= e12e13424bb40e13 2865a5f206b06fb9
3552 // 88f4c3923bf900e204f606549be42a07 * 2^-299
3553 {{0x03f805107cb68806ULL, 0x6d909c74fcc733e8ULL,
3554 0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
3555 // 10^-14 ~= b424dc35095cd80f 538484c19ef38c94
3556 // 6d909c74fcc733e803f805107cb68806 * 2^-302
3557 {{0x3660040d3092066bULL, 0x57a6e390ca38f653ULL,
3558 0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
3559 // 10^-15 ~= 901d7cf73ab0acd9 f9d37014bf60a10
3560 // 57a6e390ca38f6533660040d3092066b * 2^-305
3561 {{0x23ccd3484db670abULL, 0xbf716c1add27f085ULL,
3562 0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
3563 // 10^-16 ~= e69594bec44de15b 4c2ebe687989a9b3
3564 // bf716c1add27f08523ccd3484db670ab * 2^-309
3565 {{0x4fd70f6d0af85a23ULL, 0xff8df0157db98d37ULL,
3566 0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
3567 // 10^-17 ~= b877aa3236a4b449 9befeb9fad487c2
3568 // ff8df0157db98d374fd70f6d0af85a23 * 2^-312
3569 {{0x0cac0c573bf9e1b6ULL, 0x32d7f344649470f9ULL,
3570 0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
3571 // 10^-18 ~= 9392ee8e921d5d07 3aff322e62439fcf
3572 // 32d7f344649470f90cac0c573bf9e1b6 * 2^-315
3573 {{0xe11346f1f98fcf89ULL, 0x1e2652070753e7f4ULL,
3574 0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
3575 // 10^-19 ~= ec1e4a7db69561a5 2b31e9e3d06c32e5
3576 // 1e2652070753e7f4e11346f1f98fcf89 * 2^-319
3577 {{0x4da9058e613fd93aULL, 0x181ea8059f76532aULL,
3578 0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
3579 // 10^-20 ~= bce5086492111aea 88f4bb1ca6bcf584
3580 // 181ea8059f76532a4da9058e613fd93a * 2^-322
3581 {{0xa48737a51a997a95ULL, 0x467eecd14c5ea8eeULL,
3582 0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
3583 // 10^-21 ~= 971da05074da7bee d3f6fc16ebca5e03
3584 // 467eecd14c5ea8eea48737a51a997a95 * 2^-325
3585 {{0x3a71f2a1c428c421ULL, 0x70cb148213caa7e4ULL,
3586 0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
3587 // 10^-22 ~= f1c90080baf72cb1 5324c68b12dd6338
3588 // 70cb148213caa7e43a71f2a1c428c421 * 2^-329
3589 {{0x2ec18ee7d0209ce8ULL, 0x8d6f439b43088650ULL,
3590 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
3591 // 10^-23 ~= c16d9a0095928a27 75b7053c0f178293
3592 // 8d6f439b430886502ec18ee7d0209ce8 * 2^-332
3593 {{0xf23472530ce6e3edULL, 0xd78c3615cf3a050cULL,
3594 0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
3595 // 10^-24 ~= 9abe14cd44753b52 c4926a9672793542
3596 // d78c3615cf3a050cf23472530ce6e3ed * 2^-335
3597 {{0xe9ed83b814a49fe1ULL, 0x8c1389bc7ec33b47ULL,
3598 0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
3599 // 10^-25 ~= f79687aed3eec551 3a83ddbd83f52204
3600 // 8c1389bc7ec33b47e9ed83b814a49fe1 * 2^-339
3601 {{0x87f1362cdd507fe7ULL, 0x3cdc6e306568fc39ULL,
3602 0x95364afe032a819dULL, 0xc612062576589ddaULL}},
3603 // 10^-26 ~= c612062576589dda 95364afe032a819d
3604 // 3cdc6e306568fc3987f1362cdd507fe7 * 2^-342
3605 {{0x9ff42b5717739986ULL, 0xca49f1c05120c9c7ULL,
3606 0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
3607 // 10^-27 ~= 9e74d1b791e07e48 775ea264cf55347d
3608 // ca49f1c05120c9c79ff42b5717739986 * 2^-345
3609 {{0xccb9def1bf1f5c09ULL, 0x76dcb60081ce0fa5ULL,
3610 0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
3611 // 10^-28 ~= fd87b5f28300ca0d 8bca9d6e188853fc
3612 // 76dcb60081ce0fa5ccb9def1bf1f5c09 * 2^-349
3613 {{0xa3c7e58e327f7cd4ULL, 0x5f16f80067d80c84ULL,
3614 0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
3615 // 10^-29 ~= cad2f7f5359a3b3e 96ee45813a04330
3616 // 5f16f80067d80c84a3c7e58e327f7cd4 * 2^-352
3617 {{0xb6398471c1ff9710ULL, 0x18df2ccd1fe00a03ULL,
3618 0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
3619 // 10^-30 ~= a2425ff75e14fc31 a1258379a94d028d
3620 // 18df2ccd1fe00a03b6398471c1ff9710 * 2^-355
3621 {{0xf82e038e34cc78daULL, 0x4718f0a419800802ULL,
3622 0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
3623 // 10^-31 ~= 81ceb32c4b43fcf4 80eacf948770ced7
3624 // 4718f0a419800802f82e038e34cc78da * 2^-358
3625 {{0x59e338e387ad8e29ULL, 0x0b5b1aa028ccd99eULL,
3626 0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
3627 // 10^-32 ~= cfb11ead453994ba 67de18eda5814af2
3628 // b5b1aa028ccd99e59e338e387ad8e29 * 2^-362
3629 {{0x47e8fa4f9fbe0b54ULL, 0x6f7c154ced70ae18ULL,
3630 0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
3631 // 10^-33 ~= a6274bbdd0fadd61 ecb1ad8aeacdd58e
3632 // 6f7c154ced70ae1847e8fa4f9fbe0b54 * 2^-365
3633 {{0xd320c83fb2fe6f76ULL, 0xbf967770bdf3be79ULL,
3634 0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
3635 // 10^-34 ~= 84ec3c97da624ab4 bd5af13bef0b113e
3636 // bf967770bdf3be79d320c83fb2fe6f76 * 2^-368
3637 {{0x85014065eb30b257ULL, 0x65bd8be79652ca5cULL,
3638 0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
3639 // 10^-35 ~= d4ad2dbfc3d07787 955e4ec64b44e864
3640 // 65bd8be79652ca5c85014065eb30b257 * 2^-372
3641 {{0xd0cdcd1e55c08eacULL, 0xeafe098611dbd516ULL,
3642 0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
3643 // 10^-36 ~= aa242499697392d2 dde50bd1d5d0b9e9
3644 // eafe098611dbd516d0cdcd1e55c08eac * 2^-375
3645 {{0x40a4a418449a0bbdULL, 0xbbfe6e04db164412ULL,
3646 0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}},
3647 // 10^-37 ~= 881cea14545c7575 7e50d64177da2e54
3648 // bbfe6e04db16441240a4a418449a0bbd * 2^-378
3649 {{0x9aa1068d3a9012c8ULL, 0x2cca49a15e8a0683ULL,
3650 0x96e7bd358c904a21ULL, 0xd9c7dced53c72255ULL}},
3651 // 10^-38 ~= d9c7dced53c72255 96e7bd358c904a21
3652 // 2cca49a15e8a06839aa1068d3a9012c8 * 2^-382
3653 {{0x154d9ed7620cdbd3ULL, 0x8a3b6e1ab2080536ULL,
3654 0xabec975e0a0d081aULL, 0xae397d8aa96c1b77ULL}},
3655 // 10^-39 ~= ae397d8aa96c1b77 abec975e0a0d081a
3656 // 8a3b6e1ab2080536154d9ed7620cdbd3 * 2^-385
3657 {{0x443e18ac4e70afdcULL, 0x3b62be7bc1a0042bULL,
3658 0x2323ac4b3b3da015ULL, 0x8b61313bbabce2c6ULL}},
3659 // 10^-40 ~= 8b61313bbabce2c6 2323ac4b3b3da015
3660 // 3b62be7bc1a0042b443e18ac4e70afdc * 2^-388
3661 {{0x6d30277a171ab2f9ULL, 0x5f0463f935ccd378ULL,
3662 0x6b6c46dec52f6688ULL, 0xdf01e85f912e37a3ULL}},
3663 // 10^-41 ~= df01e85f912e37a3 6b6c46dec52f6688
3664 // 5f0463f935ccd3786d30277a171ab2f9 * 2^-392
3665 {{0x8a8cec61ac155bfbULL, 0x7f36b660f7d70f93ULL,
3666 0x55f038b237591ed3ULL, 0xb267ed1940f1c61cULL}},
3667 // 10^-42 ~= b267ed1940f1c61c 55f038b237591ed3
3668 // 7f36b660f7d70f938a8cec61ac155bfb * 2^-395
3669 {{0x3ba3f04e23444996ULL, 0xcc2bc51a5fdf3fa9ULL,
3670 0x77f3608e92adb242ULL, 0x8eb98a7a9a5b04e3ULL}},
3671 // 10^-43 ~= 8eb98a7a9a5b04e3 77f3608e92adb242
3672 // cc2bc51a5fdf3fa93ba3f04e23444996 * 2^-398
3673 {{0xf9064d49d206dc22ULL, 0xe046082a32fecc41ULL,
3674 0x8cb89a7db77c506aULL, 0xe45c10c42a2b3b05ULL}},
3675 // 10^-44 ~= e45c10c42a2b3b05 8cb89a7db77c506a
3676 // e046082a32fecc41f9064d49d206dc22 * 2^-402
3677 {{0xfa6b7107db38b01bULL, 0x4d04d354f598a367ULL,
3678 0x3d607b97c5fd0d22ULL, 0xb6b00d69bb55c8d1ULL}},
3679 // 10^-45 ~= b6b00d69bb55c8d1 3d607b97c5fd0d22
3680 // 4d04d354f598a367fa6b7107db38b01b * 2^-405
3681 {{0xfb8927397c2d59b0ULL, 0x3d9d75dd9146e91fULL,
3682 0xcab3961304ca70e8ULL, 0x9226712162ab070dULL}},
3683 // 10^-46 ~= 9226712162ab070d cab3961304ca70e8
3684 // 3d9d75dd9146e91ffb8927397c2d59b0 * 2^-408
3685 {{0xf8db71f5937bc2b2ULL, 0xc8fbefc8e87174ffULL,
3686 0xaab8f01e6e10b4a6ULL, 0xe9d71b689dde71afULL}},
3687 // 10^-47 ~= e9d71b689dde71af aab8f01e6e10b4a6
3688 // c8fbefc8e87174fff8db71f5937bc2b2 * 2^-412
3689 {{0x2d7c5b2adc630228ULL, 0x3a63263a538df733ULL,
3690 0x5560c018580d5d52ULL, 0xbb127c53b17ec159ULL}},
3691 // 10^-48 ~= bb127c53b17ec159 5560c018580d5d52
3692 // 3a63263a538df7332d7c5b2adc630228 * 2^-415
3693 {{0x24637c2249e8ce87ULL, 0x2eb5b82ea93e5f5cULL,
3694 0xdde7001379a44aa8ULL, 0x95a8637627989aadULL}},
3695 // 10^-49 ~= 95a8637627989aad dde7001379a44aa8
3696 // 2eb5b82ea93e5f5c24637c2249e8ce87 * 2^-418
3697 {{0x3a38c69d430e173eULL, 0x4abc59e441fd6560ULL,
3698 0x963e66858f6d4440ULL, 0xef73d256a5c0f77cULL}},
3699 // 10^-50 ~= ef73d256a5c0f77c 963e66858f6d4440
3700 // 4abc59e441fd65603a38c69d430e173e * 2^-422
3701 {{0x94fa387dcf3e78feULL, 0x6efd14b69b311de6ULL,
3702 0xde98520472bdd033ULL, 0xbf8fdb78849a5f96ULL}},
3703 // 10^-51 ~= bf8fdb78849a5f96 de98520472bdd033
3704 // 6efd14b69b311de694fa387dcf3e78fe * 2^-425
3705 {{0xaa61c6cb0c31fa65ULL, 0x259743c548f417ebULL,
3706 0xe546a8038efe4029ULL, 0x993fe2c6d07b7fabULL}},
3707 // 10^-52 ~= 993fe2c6d07b7fab e546a8038efe4029
3708 // 259743c548f417ebaa61c6cb0c31fa65 * 2^-428
3709 {{0xaa360ade79e990a2ULL, 0x3c25393ba7ecf312ULL,
3710 0xd53dd99f4b3066a8ULL, 0xf53304714d9265dfULL}},
3711 // 10^-53 ~= f53304714d9265df d53dd99f4b3066a8
3712 // 3c25393ba7ecf312aa360ade79e990a2 * 2^-432
3713 {{0x882b3be52e5473b5ULL, 0x96842dc95323f5a8ULL,
3714 0xaa97e14c3c26b886ULL, 0xc428d05aa4751e4cULL}},
3715 // 10^-54 ~= c428d05aa4751e4c aa97e14c3c26b886
3716 // 96842dc95323f5a8882b3be52e5473b5 * 2^-435
3717 {{0xd355c98425105c91ULL, 0xab9cf16ddc1cc486ULL,
3718 0x55464dd69685606bULL, 0x9ced737bb6c4183dULL}},
3719 // 10^-55 ~= 9ced737bb6c4183d 55464dd69685606b
3720 // ab9cf16ddc1cc486d355c98425105c91 * 2^-438
3721 {{0xebbc75a03b4d60e7ULL, 0xac2e4f162cfad40aULL,
3722 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}},
3723 // 10^-56 ~= fb158592be068d2e eed6e2f0f0d56712
3724 // ac2e4f162cfad40aebbc75a03b4d60e7 * 2^-442
3725 {{0x8963914cfc3de71fULL, 0x568b727823fbdcd5ULL,
3726 0xf245825a5a445275ULL, 0xc8de047564d20a8bULL}},
3727 // 10^-57 ~= c8de047564d20a8b f245825a5a445275
3728 // 568b727823fbdcd58963914cfc3de71f * 2^-445
3729 {{0xd44fa770c9cb1f4cULL, 0x453c5b934ffcb0aaULL,
3730 0x5b6aceaeae9d0ec4ULL, 0xa0b19d2ab70e6ed6ULL}},
3731 // 10^-58 ~= a0b19d2ab70e6ed6 5b6aceaeae9d0ec4
3732 // 453c5b934ffcb0aad44fa770c9cb1f4c * 2^-448
3733 {{0xdd0c85f3d4a27f70ULL, 0x37637c75d996f3bbULL,
3734 0xe2bbd88bbee40bd0ULL, 0x808e17555f3ebf11ULL}},
3735 // 10^-59 ~= 808e17555f3ebf11 e2bbd88bbee40bd0
3736 // 37637c75d996f3bbdd0c85f3d4a27f70 * 2^-451
3737 {{0x61ada31fba9d98b3ULL, 0x256bfa5628f185f9ULL,
3738 0x3792f412cb06794dULL, 0xcdb02555653131b6ULL}},
3739 // 10^-60 ~= cdb02555653131b6 3792f412cb06794d
3740 // 256bfa5628f185f961ada31fba9d98b3 * 2^-455
3741 {{0xe7be1c196217ad5cULL, 0x51232eab53f46b2dULL,
3742 0x5fa8c3423c052dd7ULL, 0xa48ceaaab75a8e2bULL}},
3743 // 10^-61 ~= a48ceaaab75a8e2b 5fa8c3423c052dd7
3744 // 51232eab53f46b2de7be1c196217ad5c * 2^-458
3745 {{0x52fe7ce11b46244aULL, 0x40e8f222a99055beULL,
3746 0x1953cf68300424acULL, 0x83a3eeeef9153e89ULL}},
3747 // 10^-62 ~= 83a3eeeef9153e89 1953cf68300424ac
3748 // 40e8f222a99055be52fe7ce11b46244a * 2^-461
3749 {{0x51972e34f8703a10ULL, 0x34a7e9d10f4d55fdULL,
3750 0x8eec7f0d19a03aadULL, 0xd29fe4b18e88640eULL}},
3751 // 10^-63 ~= d29fe4b18e88640e 8eec7f0d19a03aad
3752 // 34a7e9d10f4d55fd51972e34f8703a10 * 2^-465
3753 {{0x0e128b5d938cfb40ULL, 0x2a1fee40d90aab31ULL,
3754 0x3f2398d747b36224ULL, 0xa87fea27a539e9a5ULL}},
3755 // 10^-64 ~= a87fea27a539e9a5 3f2398d747b36224
3756 // 2a1fee40d90aab310e128b5d938cfb40 * 2^-468
3757 {{0x3e753c4adc70c900ULL, 0xbb4cbe9a473bbc27ULL,
3758 0x98e947129fc2b4e9ULL, 0x86ccbb52ea94baeaULL}},
3759 // 10^-65 ~= 86ccbb52ea94baea 98e947129fc2b4e9
3760 // bb4cbe9a473bbc273e753c4adc70c900 * 2^-471
3761 {{0x30bb93aafa4e0e66ULL, 0x9214642a0b92c6a5ULL,
3762 0x5b0ed81dcc6abb0fULL, 0xd7adf884aa879177ULL}},
3763 // 10^-66 ~= d7adf884aa879177 5b0ed81dcc6abb0f
3764 // 9214642a0b92c6a530bb93aafa4e0e66 * 2^-475
3765 {{0xc0960fbbfb71a51fULL, 0xa8105021a2dbd21dULL,
3766 0xe272467e3d222f3fULL, 0xac8b2d36eed2dac5ULL}},
3767 // 10^-67 ~= ac8b2d36eed2dac5 e272467e3d222f3f
3768 // a8105021a2dbd21dc0960fbbfb71a51f * 2^-478
3769 {{0x66de72fcc927b74cULL, 0xb9a6a6814f1641b1ULL,
3770 0x1b8e9ecb641b58ffULL, 0x8a08f0f8bf0f156bULL}},
3771 // 10^-68 ~= 8a08f0f8bf0f156b 1b8e9ecb641b58ff
3772 // b9a6a6814f1641b166de72fcc927b74c * 2^-481
3773 {{0xd7ca5194750c5879ULL, 0xf5d770cee4f0691bULL,
3774 0xf8e431456cf88e65ULL, 0xdcdb1b2798182244ULL}},
3775 // 10^-69 ~= dcdb1b2798182244 f8e431456cf88e65
3776 // f5d770cee4f0691bd7ca5194750c5879 * 2^-485
3777 {{0xdfd50e105da379faULL, 0x9179270bea59edafULL,
3778 0x2d835a9df0c6d851ULL, 0xb0af48ec79ace837ULL}},
3779 // 10^-70 ~= b0af48ec79ace837 2d835a9df0c6d851
3780 // 9179270bea59edafdfd50e105da379fa * 2^-488
3781 {{0x19773e737e1c6195ULL, 0x0dfa85a321e18af3ULL,
3782 0x579c487e5a38ad0eULL, 0x8d590723948a535fULL}},
3783 // 10^-71 ~= 8d590723948a535f 579c487e5a38ad0e
3784 // dfa85a321e18af319773e737e1c6195 * 2^-491
3785 {{0xf58b971f302d68efULL, 0x165da29e9c9c1184ULL,
3786 0x25c6da63c38de1b0ULL, 0xe2280b6c20dd5232ULL}},
3787 // 10^-72 ~= e2280b6c20dd5232 25c6da63c38de1b0
3788 // 165da29e9c9c1184f58b971f302d68ef * 2^-495
3789 {{0xc46fac18f3578725ULL, 0x4517b54bb07cdad0ULL,
3790 0x1e38aeb6360b1af3ULL, 0xb4ecd5f01a4aa828ULL}},
3791 // 10^-73 ~= b4ecd5f01a4aa828 1e38aeb6360b1af3
3792 // 4517b54bb07cdad0c46fac18f3578725 * 2^-498
3793 {{0x36bfbce0c2ac6c1eULL, 0x9dac910959fd7bdaULL,
3794 0xb1c6f22b5e6f48c2ULL, 0x90bd77f3483bb9b9ULL}},
3795 // 10^-74 ~= 90bd77f3483bb9b9 b1c6f22b5e6f48c2
3796 // 9dac910959fd7bda36bfbce0c2ac6c1e * 2^-501
3797 {{0x2465fb01377a4696ULL, 0x2f7a81a88ffbf95dULL,
3798 0xb60b1d1230b20e04ULL, 0xe7958cb87392c2c2ULL}}
3799 // 10^-75 ~= e7958cb87392c2c2 b60b1d1230b20e04
3800 // 2f7a81a88ffbf95d2465fb01377a4696 * 2^-505
3803 unsigned int Ex256m256[] = {
3804 3, // 259 - 256, Ex = 259
3805 6, // 262 - 256, Ex = 262
3806 9, // 265 - 256, Ex = 265
3807 13, // 269 - 256, Ex = 269
3808 16, // 272 - 256, Ex = 272
3809 19, // 275 - 256, Ex = 275
3810 23, // 279 - 256, Ex = 279
3811 26, // 282 - 256, Ex = 282
3812 29, // 285 - 256, Ex = 285
3813 33, // 289 - 256, Ex = 289
3814 36, // 292 - 256, Ex = 292
3815 39, // 295 - 256, Ex = 295
3816 43, // 299 - 256, Ex = 299
3817 46, // 302 - 256, Ex = 302
3818 49, // 305 - 256, Ex = 305
3819 53, // 309 - 256, Ex = 309
3820 56, // 312 - 256, Ex = 312
3821 59, // 315 - 256, Ex = 315
3822 63, // 319 - 256, Ex = 319
3823 2, // 322 - 320, Ex = 322
3824 5, // 325 - 320, Ex = 325
3825 9, // 329 - 320, Ex = 329
3826 12, // 332 - 320, Ex = 332
3827 15, // 335 - 320, Ex = 335
3828 19, // 339 - 320, Ex = 339
3829 22, // 342 - 320, Ex = 342
3830 25, // 345 - 320, Ex = 345
3831 29, // 349 - 320, Ex = 349
3832 32, // 352 - 320, Ex = 352
3833 35, // 355 - 320, Ex = 355
3834 38, // 358 - 320, Ex = 358
3835 42, // 362 - 320, Ex = 362
3836 45, // 365 - 320, Ex = 365
3837 48, // 368 - 320, Ex = 368
3838 52, // 372 - 320, Ex = 372
3839 55, // 375 - 320, Ex = 375
3840 58, // 378 - 320, Ex = 378
3841 62, // 382 - 320, Ex = 382
3842 1, // 385 - 384, Ex = 385
3843 4, // 388 - 384, Ex = 388
3844 8, // 392 - 384, Ex = 392
3845 11, // 395 - 384, Ex = 395
3846 14, // 398 - 384, Ex = 398
3847 18, // 402 - 384, Ex = 402
3848 21, // 405 - 384, Ex = 405
3849 24, // 408 - 384, Ex = 408
3850 28, // 412 - 384, Ex = 412
3851 31, // 415 - 384, Ex = 415
3852 34, // 418 - 384, Ex = 418
3853 38, // 422 - 384, Ex = 422
3854 41, // 425 - 384, Ex = 425
3855 44, // 428 - 384, Ex = 428
3856 48, // 432 - 384, Ex = 432
3857 51, // 435 - 384, Ex = 435
3858 54, // 438 - 384, Ex = 438
3859 58, // 442 - 384, Ex = 442
3860 61, // 445 - 384, Ex = 445
3861 0, // 448 - 448, Ex = 448
3862 3, // 451 - 448, Ex = 451
3863 7, // 455 - 448, Ex = 455
3864 10, // 458 - 448, Ex = 458
3865 13, // 461 - 448, Ex = 461
3866 17, // 465 - 448, Ex = 465
3867 20, // 468 - 448, Ex = 468
3868 23, // 471 - 448, Ex = 471
3869 27, // 475 - 448, Ex = 475
3870 30, // 478 - 448, Ex = 478
3871 33, // 481 - 448, Ex = 481
3872 37, // 485 - 448, Ex = 485
3873 40, // 488 - 448, Ex = 488
3874 43, // 491 - 448, Ex = 491
3875 47, // 495 - 448, Ex = 495
3876 50, // 498 - 448, Ex = 498
3877 53, // 501 - 448, Ex = 501
3878 57 // 505 - 448, Ex = 505
3881 UINT64 half256[] = {
3882 0x0000000000000004ULL, // half / 2^256 = 4
3883 0x0000000000000020ULL, // half / 2^256 = 20
3884 0x0000000000000100ULL, // half / 2^256 = 100
3885 0x0000000000001000ULL, // half / 2^256 = 1000
3886 0x0000000000008000ULL, // half / 2^256 = 8000
3887 0x0000000000040000ULL, // half / 2^256 = 40000
3888 0x0000000000400000ULL, // half / 2^256 = 400000
3889 0x0000000002000000ULL, // half / 2^256 = 2000000
3890 0x0000000010000000ULL, // half / 2^256 = 10000000
3891 0x0000000100000000ULL, // half / 2^256 = 100000000
3892 0x0000000800000000ULL, // half / 2^256 = 800000000
3893 0x0000004000000000ULL, // half / 2^256 = 4000000000
3894 0x0000040000000000ULL, // half / 2^256 = 40000000000
3895 0x0000200000000000ULL, // half / 2^256 = 200000000000
3896 0x0001000000000000ULL, // half / 2^256 = 1000000000000
3897 0x0010000000000000ULL, // half / 2^256 = 10000000000000
3898 0x0080000000000000ULL, // half / 2^256 = 80000000000000
3899 0x0400000000000000ULL, // half / 2^256 = 400000000000000
3900 0x4000000000000000ULL, // half / 2^256 = 4000000000000000
3901 0x0000000000000002ULL, // half / 2^320 = 2
3902 0x0000000000000010ULL, // half / 2^320 = 10
3903 0x0000000000000100ULL, // half / 2^320 = 100
3904 0x0000000000000800ULL, // half / 2^320 = 800
3905 0x0000000000004000ULL, // half / 2^320 = 4000
3906 0x0000000000040000ULL, // half / 2^320 = 40000
3907 0x0000000000200000ULL, // half / 2^320 = 200000
3908 0x0000000001000000ULL, // half / 2^320 = 1000000
3909 0x0000000010000000ULL, // half / 2^320 = 10000000
3910 0x0000000080000000ULL, // half / 2^320 = 80000000
3911 0x0000000400000000ULL, // half / 2^320 = 400000000
3912 0x0000002000000000ULL, // half / 2^320 = 2000000000
3913 0x0000020000000000ULL, // half / 2^320 = 20000000000
3914 0x0000100000000000ULL, // half / 2^320 = 100000000000
3915 0x0000800000000000ULL, // half / 2^320 = 800000000000
3916 0x0008000000000000ULL, // half / 2^320 = 8000000000000
3917 0x0040000000000000ULL, // half / 2^320 = 40000000000000
3918 0x0200000000000000ULL, // half / 2^320 = 200000000000000
3919 0x2000000000000000ULL, // half / 2^320 = 2000000000000000
3920 0x0000000000000001ULL, // half / 2^384 = 1
3921 0x0000000000000008ULL, // half / 2^384 = 8
3922 0x0000000000000080ULL, // half / 2^384 = 80
3923 0x0000000000000400ULL, // half / 2^384 = 400
3924 0x0000000000002000ULL, // half / 2^384 = 2000
3925 0x0000000000020000ULL, // half / 2^384 = 20000
3926 0x0000000000100000ULL, // half / 2^384 = 100000
3927 0x0000000000800000ULL, // half / 2^384 = 800000
3928 0x0000000008000000ULL, // half / 2^384 = 8000000
3929 0x0000000040000000ULL, // half / 2^384 = 40000000
3930 0x0000000200000000ULL, // half / 2^384 = 200000000
3931 0x0000002000000000ULL, // half / 2^384 = 2000000000
3932 0x0000010000000000ULL, // half / 2^384 = 10000000000
3933 0x0000080000000000ULL, // half / 2^384 = 80000000000
3934 0x0000800000000000ULL, // half / 2^384 = 800000000000
3935 0x0004000000000000ULL, // half / 2^384 = 4000000000000
3936 0x0020000000000000ULL, // half / 2^384 = 20000000000000
3937 0x0200000000000000ULL, // half / 2^384 = 200000000000000
3938 0x1000000000000000ULL, // half / 2^384 = 1000000000000000
3939 0x8000000000000000ULL, // half / 2^384 = 8000000000000000
3940 0x0000000000000004ULL, // half / 2^448 = 4
3941 0x0000000000000040ULL, // half / 2^448 = 40
3942 0x0000000000000200ULL, // half / 2^448 = 200
3943 0x0000000000001000ULL, // half / 2^448 = 1000
3944 0x0000000000010000ULL, // half / 2^448 = 10000
3945 0x0000000000080000ULL, // half / 2^448 = 80000
3946 0x0000000000400000ULL, // half / 2^448 = 400000
3947 0x0000000004000000ULL, // half / 2^448 = 4000000
3948 0x0000000020000000ULL, // half / 2^448 = 20000000
3949 0x0000000100000000ULL, // half / 2^448 = 100000000
3950 0x0000001000000000ULL, // half / 2^448 = 1000000000
3951 0x0000008000000000ULL, // half / 2^448 = 8000000000
3952 0x0000040000000000ULL, // half / 2^448 = 40000000000
3953 0x0000400000000000ULL, // half / 2^448 = 400000000000
3954 0x0002000000000000ULL, // half / 2^448 = 2000000000000
3955 0x0010000000000000ULL, // half / 2^448 = 10000000000000
3956 0x0100000000000000ULL // half / 2^448 = 100000000000000
3959 UINT64 mask256[] = {
3960 0x0000000000000007ULL, // mask / 2^256
3961 0x000000000000003fULL, // mask / 2^256
3962 0x00000000000001ffULL, // mask / 2^256
3963 0x0000000000001fffULL, // mask / 2^256
3964 0x000000000000ffffULL, // mask / 2^256
3965 0x000000000007ffffULL, // mask / 2^256
3966 0x00000000007fffffULL, // mask / 2^256
3967 0x0000000003ffffffULL, // mask / 2^256
3968 0x000000001fffffffULL, // mask / 2^256
3969 0x00000001ffffffffULL, // mask / 2^256
3970 0x0000000fffffffffULL, // mask / 2^256
3971 0x0000007fffffffffULL, // mask / 2^256
3972 0x000007ffffffffffULL, // mask / 2^256
3973 0x00003fffffffffffULL, // mask / 2^256
3974 0x0001ffffffffffffULL, // mask / 2^256
3975 0x001fffffffffffffULL, // mask / 2^256
3976 0x00ffffffffffffffULL, // mask / 2^256
3977 0x07ffffffffffffffULL, // mask / 2^256
3978 0x7fffffffffffffffULL, // mask / 2^256
3979 0x0000000000000003ULL, // mask / 2^320
3980 0x000000000000001fULL, // mask / 2^320
3981 0x00000000000001ffULL, // mask / 2^320
3982 0x0000000000000fffULL, // mask / 2^320
3983 0x0000000000007fffULL, // mask / 2^320
3984 0x000000000007ffffULL, // mask / 2^320
3985 0x00000000003fffffULL, // mask / 2^320
3986 0x0000000001ffffffULL, // mask / 2^320
3987 0x000000001fffffffULL, // mask / 2^320
3988 0x00000000ffffffffULL, // mask / 2^320
3989 0x00000007ffffffffULL, // mask / 2^320
3990 0x0000003fffffffffULL, // mask / 2^320
3991 0x000003ffffffffffULL, // mask / 2^320
3992 0x00001fffffffffffULL, // mask / 2^320
3993 0x0000ffffffffffffULL, // mask / 2^320
3994 0x000fffffffffffffULL, // mask / 2^320
3995 0x007fffffffffffffULL, // mask / 2^320
3996 0x03ffffffffffffffULL, // mask / 2^320
3997 0x3fffffffffffffffULL, // mask / 2^320
3998 0x0000000000000001ULL, // mask / 2^384
3999 0x000000000000000fULL, // mask / 2^384
4000 0x00000000000000ffULL, // mask / 2^384
4001 0x00000000000007ffULL, // mask / 2^384
4002 0x0000000000003fffULL, // mask / 2^384
4003 0x000000000003ffffULL, // mask / 2^384
4004 0x00000000001fffffULL, // mask / 2^384
4005 0x0000000000ffffffULL, // mask / 2^384
4006 0x000000000fffffffULL, // mask / 2^384
4007 0x000000007fffffffULL, // mask / 2^384
4008 0x00000003ffffffffULL, // mask / 2^384
4009 0x0000003fffffffffULL, // mask / 2^384
4010 0x000001ffffffffffULL, // mask / 2^384
4011 0x00000fffffffffffULL, // mask / 2^384
4012 0x0000ffffffffffffULL, // mask / 2^384
4013 0x0007ffffffffffffULL, // mask / 2^384
4014 0x003fffffffffffffULL, // mask / 2^384
4015 0x03ffffffffffffffULL, // mask / 2^384
4016 0x1fffffffffffffffULL, // mask / 2^384
4017 0xffffffffffffffffULL, // mask / 2^384
4018 0x0000000000000007ULL, // mask / 2^448
4019 0x000000000000007fULL, // mask / 2^448
4020 0x00000000000003ffULL, // mask / 2^448
4021 0x0000000000001fffULL, // mask / 2^448
4022 0x000000000001ffffULL, // mask / 2^448
4023 0x00000000000fffffULL, // mask / 2^448
4024 0x00000000007fffffULL, // mask / 2^448
4025 0x0000000007ffffffULL, // mask / 2^448
4026 0x000000003fffffffULL, // mask / 2^448
4027 0x00000001ffffffffULL, // mask / 2^448
4028 0x0000001fffffffffULL, // mask / 2^448
4029 0x000000ffffffffffULL, // mask / 2^448
4030 0x000007ffffffffffULL, // mask / 2^448
4031 0x00007fffffffffffULL, // mask / 2^448
4032 0x0003ffffffffffffULL, // mask / 2^448
4033 0x001fffffffffffffULL, // mask / 2^448
4034 0x01ffffffffffffffULL // mask / 2^448
4037 UINT256 ten2mxtrunc256[] = {
4038 {{0xccccccccccccccccULL, 0xccccccccccccccccULL,
4039 0xccccccccccccccccULL, 0xccccccccccccccccULL}},
4040 // (ten2mx >> 256) = cccccccccccccccc cccccccccccccccc
4041 // cccccccccccccccccccccccccccccccc
4042 {{0x70a3d70a3d70a3d7ULL, 0xd70a3d70a3d70a3dULL,
4043 0x3d70a3d70a3d70a3ULL, 0xa3d70a3d70a3d70aULL}},
4044 // (ten2mx >> 256) = a3d70a3d70a3d70a 3d70a3d70a3d70a3
4045 // d70a3d70a3d70a3d70a3d70a3d70a3d7
4046 {{0xc083126e978d4fdfULL, 0x78d4fdf3b645a1caULL,
4047 0x645a1cac083126e9ULL, 0x83126e978d4fdf3bULL}},
4048 // (ten2mx >> 256) = 83126e978d4fdf3b 645a1cac083126e9
4049 // 78d4fdf3b645a1cac083126e978d4fdf
4050 {{0x67381d7dbf487fcbULL, 0xc154c985f06f6944ULL,
4051 0xd3c36113404ea4a8ULL, 0xd1b71758e219652bULL}},
4052 // (ten2mx >> 256) = d1b71758e219652b d3c36113404ea4a8
4053 // c154c985f06f694467381d7dbf487fcb
4054 {{0x85c67dfe32a0663cULL, 0xcddd6e04c0592103ULL,
4055 0x0fcf80dc33721d53ULL, 0xa7c5ac471b478423ULL}},
4056 // (ten2mx >> 256) = a7c5ac471b478423 fcf80dc33721d53
4057 // cddd6e04c059210385c67dfe32a0663c
4058 {{0x37d1fe64f54d1e96ULL, 0xd7e45803cd141a69ULL,
4059 0xa63f9a49c2c1b10fULL, 0x8637bd05af6c69b5ULL}},
4060 // (ten2mx >> 256) = 8637bd05af6c69b5 a63f9a49c2c1b10f
4061 // d7e45803cd141a6937d1fe64f54d1e96
4062 {{0x8c8330a1887b6424ULL, 0x8ca08cd2e1b9c3dbULL,
4063 0x3d32907604691b4cULL, 0xd6bf94d5e57a42bcULL}},
4064 // (ten2mx >> 256) = d6bf94d5e57a42bc 3d32907604691b4c
4065 // 8ca08cd2e1b9c3db8c8330a1887b6424
4066 {{0x7068f3b46d2f8350ULL, 0x3d4d3d758161697cULL,
4067 0xfdc20d2b36ba7c3dULL, 0xabcc77118461cefcULL}},
4068 // (ten2mx >> 256) = abcc77118461cefc fdc20d2b36ba7c3d
4069 // 3d4d3d758161697c7068f3b46d2f8350
4070 {{0xf387295d242602a6ULL, 0xfdd7645e011abac9ULL,
4071 0x31680a88f8953030ULL, 0x89705f4136b4a597ULL}},
4072 // (ten2mx >> 256) = 89705f4136b4a597 31680a88f8953030
4073 // fdd7645e011abac9f387295d242602a6
4074 {{0xb8d8422ea03cd10aULL, 0x2fbf06fcce912adcULL,
4075 0xb573440e5a884d1bULL, 0xdbe6fecebdedd5beULL}},
4076 // (ten2mx >> 256) = dbe6fecebdedd5be b573440e5a884d1b
4077 // 2fbf06fcce912adcb8d8422ea03cd10a
4078 {{0x93e034f219ca40d5ULL, 0xf2ff38ca3eda88b0ULL,
4079 0xf78f69a51539d748ULL, 0xafebff0bcb24aafeULL}},
4080 // (ten2mx >> 256) = afebff0bcb24aafe f78f69a51539d748
4081 // f2ff38ca3eda88b093e034f219ca40d5
4082 {{0x4319c3f4e16e9a44ULL, 0xf598fa3b657ba08dULL,
4083 0xf93f87b7442e45d3ULL, 0x8cbccc096f5088cbULL}},
4084 // (ten2mx >> 256) = 8cbccc096f5088cb f93f87b7442e45d3
4085 // f598fa3b657ba08d4319c3f4e16e9a44
4086 {{0x04f606549be42a06ULL, 0x88f4c3923bf900e2ULL,
4087 0x2865a5f206b06fb9ULL, 0xe12e13424bb40e13ULL}},
4088 // (ten2mx >> 256) = e12e13424bb40e13 2865a5f206b06fb9
4089 // 88f4c3923bf900e204f606549be42a06
4090 {{0x03f805107cb68805ULL, 0x6d909c74fcc733e8ULL,
4091 0x538484c19ef38c94ULL, 0xb424dc35095cd80fULL}},
4092 // (ten2mx >> 256) = b424dc35095cd80f 538484c19ef38c94
4093 // 6d909c74fcc733e803f805107cb68805
4094 {{0x3660040d3092066aULL, 0x57a6e390ca38f653ULL,
4095 0x0f9d37014bf60a10ULL, 0x901d7cf73ab0acd9ULL}},
4096 // (ten2mx >> 256) = 901d7cf73ab0acd9 f9d37014bf60a10
4097 // 57a6e390ca38f6533660040d3092066a
4098 {{0x23ccd3484db670aaULL, 0xbf716c1add27f085ULL,
4099 0x4c2ebe687989a9b3ULL, 0xe69594bec44de15bULL}},
4100 // (ten2mx >> 256) = e69594bec44de15b 4c2ebe687989a9b3
4101 // bf716c1add27f08523ccd3484db670aa
4102 {{0x4fd70f6d0af85a22ULL, 0xff8df0157db98d37ULL,
4103 0x09befeb9fad487c2ULL, 0xb877aa3236a4b449ULL}},
4104 // (ten2mx >> 256) = b877aa3236a4b449 9befeb9fad487c2
4105 // ff8df0157db98d374fd70f6d0af85a22
4106 {{0x0cac0c573bf9e1b5ULL, 0x32d7f344649470f9ULL,
4107 0x3aff322e62439fcfULL, 0x9392ee8e921d5d07ULL}},
4108 // (ten2mx >> 256) = 9392ee8e921d5d07 3aff322e62439fcf
4109 // 32d7f344649470f90cac0c573bf9e1b5
4110 {{0xe11346f1f98fcf88ULL, 0x1e2652070753e7f4ULL,
4111 0x2b31e9e3d06c32e5ULL, 0xec1e4a7db69561a5ULL}},
4112 // (ten2mx >> 256) = ec1e4a7db69561a5 2b31e9e3d06c32e5
4113 // 1e2652070753e7f4e11346f1f98fcf88
4114 {{0x4da9058e613fd939ULL, 0x181ea8059f76532aULL,
4115 0x88f4bb1ca6bcf584ULL, 0xbce5086492111aeaULL}},
4116 // (ten2mx >> 256) = bce5086492111aea 88f4bb1ca6bcf584
4117 // 181ea8059f76532a4da9058e613fd939
4118 {{0xa48737a51a997a94ULL, 0x467eecd14c5ea8eeULL,
4119 0xd3f6fc16ebca5e03ULL, 0x971da05074da7beeULL}},
4120 // (ten2mx >> 256) = 971da05074da7bee d3f6fc16ebca5e03
4121 // 467eecd14c5ea8eea48737a51a997a94
4122 {{0x3a71f2a1c428c420ULL, 0x70cb148213caa7e4ULL,
4123 0x5324c68b12dd6338ULL, 0xf1c90080baf72cb1ULL}},
4124 // (ten2mx >> 256) = f1c90080baf72cb1 5324c68b12dd6338
4125 // 70cb148213caa7e43a71f2a1c428c420
4126 {{0x2ec18ee7d0209ce7ULL, 0x8d6f439b43088650ULL,
4127 0x75b7053c0f178293ULL, 0xc16d9a0095928a27ULL}},
4128 // (ten2mx >> 256) = c16d9a0095928a27 75b7053c0f178293
4129 // 8d6f439b430886502ec18ee7d0209ce7
4130 {{0xf23472530ce6e3ecULL, 0xd78c3615cf3a050cULL,
4131 0xc4926a9672793542ULL, 0x9abe14cd44753b52ULL}},
4132 // (ten2mx >> 256) = 9abe14cd44753b52 c4926a9672793542
4133 // d78c3615cf3a050cf23472530ce6e3ec
4134 {{0xe9ed83b814a49fe0ULL, 0x8c1389bc7ec33b47ULL,
4135 0x3a83ddbd83f52204ULL, 0xf79687aed3eec551ULL}},
4136 // (ten2mx >> 256) = f79687aed3eec551 3a83ddbd83f52204
4137 // 8c1389bc7ec33b47e9ed83b814a49fe0
4138 {{0x87f1362cdd507fe6ULL, 0x3cdc6e306568fc39ULL,
4139 0x95364afe032a819dULL, 0xc612062576589ddaULL}},
4140 // (ten2mx >> 256) = c612062576589dda 95364afe032a819d
4141 // 3cdc6e306568fc3987f1362cdd507fe6
4142 {{0x9ff42b5717739985ULL, 0xca49f1c05120c9c7ULL,
4143 0x775ea264cf55347dULL, 0x9e74d1b791e07e48ULL}},
4144 // (ten2mx >> 256) = 9e74d1b791e07e48 775ea264cf55347d
4145 // ca49f1c05120c9c79ff42b5717739985
4146 {{0xccb9def1bf1f5c08ULL, 0x76dcb60081ce0fa5ULL,
4147 0x8bca9d6e188853fcULL, 0xfd87b5f28300ca0dULL}},
4148 // (ten2mx >> 256) = fd87b5f28300ca0d 8bca9d6e188853fc
4149 // 76dcb60081ce0fa5ccb9def1bf1f5c08
4150 {{0xa3c7e58e327f7cd3ULL, 0x5f16f80067d80c84ULL,
4151 0x096ee45813a04330ULL, 0xcad2f7f5359a3b3eULL}},
4152 // (ten2mx >> 256) = cad2f7f5359a3b3e 96ee45813a04330
4153 // 5f16f80067d80c84a3c7e58e327f7cd3
4154 {{0xb6398471c1ff970fULL, 0x18df2ccd1fe00a03ULL,
4155 0xa1258379a94d028dULL, 0xa2425ff75e14fc31ULL}},
4156 // (ten2mx >> 256) = a2425ff75e14fc31 a1258379a94d028d
4157 // 18df2ccd1fe00a03b6398471c1ff970f
4158 {{0xf82e038e34cc78d9ULL, 0x4718f0a419800802ULL,
4159 0x80eacf948770ced7ULL, 0x81ceb32c4b43fcf4ULL}},
4160 // (ten2mx >> 256) = 81ceb32c4b43fcf4 80eacf948770ced7
4161 // 4718f0a419800802f82e038e34cc78d9
4162 {{0x59e338e387ad8e28ULL, 0x0b5b1aa028ccd99eULL,
4163 0x67de18eda5814af2ULL, 0xcfb11ead453994baULL}},
4164 // (ten2mx >> 256) = cfb11ead453994ba 67de18eda5814af2
4165 // b5b1aa028ccd99e59e338e387ad8e28
4166 {{0x47e8fa4f9fbe0b53ULL, 0x6f7c154ced70ae18ULL,
4167 0xecb1ad8aeacdd58eULL, 0xa6274bbdd0fadd61ULL}},
4168 // (ten2mx >> 256) = a6274bbdd0fadd61 ecb1ad8aeacdd58e
4169 // 6f7c154ced70ae1847e8fa4f9fbe0b53
4170 {{0xd320c83fb2fe6f75ULL, 0xbf967770bdf3be79ULL,
4171 0xbd5af13bef0b113eULL, 0x84ec3c97da624ab4ULL}},
4172 // (ten2mx >> 256) = 84ec3c97da624ab4 bd5af13bef0b113e
4173 // bf967770bdf3be79d320c83fb2fe6f75
4174 {{0x85014065eb30b256ULL, 0x65bd8be79652ca5cULL,
4175 0x955e4ec64b44e864ULL, 0xd4ad2dbfc3d07787ULL}},
4176 // (ten2mx >> 256) = d4ad2dbfc3d07787 955e4ec64b44e864
4177 // 65bd8be79652ca5c85014065eb30b256
4178 {{0xd0cdcd1e55c08eabULL, 0xeafe098611dbd516ULL,
4179 0xdde50bd1d5d0b9e9ULL, 0xaa242499697392d2ULL}},
4180 // (ten2mx >> 256) = aa242499697392d2 dde50bd1d5d0b9e9
4181 // eafe098611dbd516d0cdcd1e55c08eab
4182 {{0x40a4a418449a0bbcULL, 0xbbfe6e04db164412ULL,
4183 0x7e50d64177da2e54ULL, 0x881cea14545c7575ULL}},
4184 // (ten2mx >> 256) = 881cea14545c7575 7e50d64177da2e54
4185 // bbfe6e04db16441240a4a418449a0bbc
4186 {{0x9aa1068d3a9012c7ULL, 0x2cca49a15e8a0683ULL,
4187 0x96e7bd358c904a21ULL, 0xd9c7dced53c72255ULL}},
4188 // (ten2mx >> 256) = d9c7dced53c72255 96e7bd358c904a21
4189 // 2cca49a15e8a06839aa1068d3a9012c7
4190 {{0x154d9ed7620cdbd2ULL, 0x8a3b6e1ab2080536ULL,
4191 0xabec975e0a0d081aULL, 0xae397d8aa96c1b77ULL}},
4192 // (ten2mx >> 256) = ae397d8aa96c1b77 abec975e0a0d081a
4193 // 8a3b6e1ab2080536154d9ed7620cdbd2
4194 {{0x443e18ac4e70afdbULL, 0x3b62be7bc1a0042bULL,
4195 0x2323ac4b3b3da015ULL, 0x8b61313bbabce2c6ULL}},
4196 // (ten2mx >> 256) = 8b61313bbabce2c6 2323ac4b3b3da015
4197 // 3b62be7bc1a0042b443e18ac4e70afdb
4198 {{0x6d30277a171ab2f8ULL, 0x5f0463f935ccd378ULL,
4199 0x6b6c46dec52f6688ULL, 0xdf01e85f912e37a3ULL}},
4200 // (ten2mx >> 256) = df01e85f912e37a3 6b6c46dec52f6688
4201 // 5f0463f935ccd3786d30277a171ab2f8
4202 {{0x8a8cec61ac155bfaULL, 0x7f36b660f7d70f93ULL,
4203 0x55f038b237591ed3ULL, 0xb267ed1940f1c61cULL}},
4204 // (ten2mx >> 256) = b267ed1940f1c61c 55f038b237591ed3
4205 // 7f36b660f7d70f938a8cec61ac155bfa
4206 {{0x3ba3f04e23444995ULL, 0xcc2bc51a5fdf3fa9ULL,
4207 0x77f3608e92adb242ULL, 0x8eb98a7a9a5b04e3ULL}},
4208 // (ten2mx >> 256) = 8eb98a7a9a5b04e3 77f3608e92adb242
4209 // cc2bc51a5fdf3fa93ba3f04e23444995
4210 {{0xf9064d49d206dc21ULL, 0xe046082a32fecc41ULL,
4211 0x8cb89a7db77c506aULL, 0xe45c10c42a2b3b05ULL}},
4212 // (ten2mx >> 256) = e45c10c42a2b3b05 8cb89a7db77c506a
4213 // e046082a32fecc41f9064d49d206dc21
4214 {{0xfa6b7107db38b01aULL, 0x4d04d354f598a367ULL,
4215 0x3d607b97c5fd0d22ULL, 0xb6b00d69bb55c8d1ULL}},
4216 // (ten2mx >> 256) = b6b00d69bb55c8d1 3d607b97c5fd0d22
4217 // 4d04d354f598a367fa6b7107db38b01a
4218 {{0xfb8927397c2d59afULL, 0x3d9d75dd9146e91fULL,
4219 0xcab3961304ca70e8ULL, 0x9226712162ab070dULL}},
4220 // (ten2mx >> 256) = 9226712162ab070d cab3961304ca70e8
4221 // 3d9d75dd9146e91ffb8927397c2d59af
4222 {{0xf8db71f5937bc2b1ULL, 0xc8fbefc8e87174ffULL,
4223 0xaab8f01e6e10b4a6ULL, 0xe9d71b689dde71afULL}},
4224 // (ten2mx >> 256) = e9d71b689dde71af aab8f01e6e10b4a6
4225 // c8fbefc8e87174fff8db71f5937bc2b1
4226 {{0x2d7c5b2adc630227ULL, 0x3a63263a538df733ULL,
4227 0x5560c018580d5d52ULL, 0xbb127c53b17ec159ULL}},
4228 // (ten2mx >> 256) = bb127c53b17ec159 5560c018580d5d52
4229 // 3a63263a538df7332d7c5b2adc630227
4230 {{0x24637c2249e8ce86ULL, 0x2eb5b82ea93e5f5cULL,
4231 0xdde7001379a44aa8ULL, 0x95a8637627989aadULL}},
4232 // (ten2mx >> 256) = 95a8637627989aad dde7001379a44aa8
4233 // 2eb5b82ea93e5f5c24637c2249e8ce86
4234 {{0x3a38c69d430e173dULL, 0x4abc59e441fd6560ULL,
4235 0x963e66858f6d4440ULL, 0xef73d256a5c0f77cULL}},
4236 // (ten2mx >> 256) = ef73d256a5c0f77c 963e66858f6d4440
4237 // 4abc59e441fd65603a38c69d430e173d
4238 {{0x94fa387dcf3e78fdULL, 0x6efd14b69b311de6ULL,
4239 0xde98520472bdd033ULL, 0xbf8fdb78849a5f96ULL}},
4240 // (ten2mx >> 256) = bf8fdb78849a5f96 de98520472bdd033
4241 // 6efd14b69b311de694fa387dcf3e78fd
4242 {{0xaa61c6cb0c31fa64ULL, 0x259743c548f417ebULL,
4243 0xe546a8038efe4029ULL, 0x993fe2c6d07b7fabULL}},
4244 // (ten2mx >> 256) = 993fe2c6d07b7fab e546a8038efe4029
4245 // 259743c548f417ebaa61c6cb0c31fa64
4246 {{0xaa360ade79e990a1ULL, 0x3c25393ba7ecf312ULL,
4247 0xd53dd99f4b3066a8ULL, 0xf53304714d9265dfULL}},
4248 // (ten2mx >> 256) = f53304714d9265df d53dd99f4b3066a8
4249 // 3c25393ba7ecf312aa360ade79e990a1
4250 {{0x882b3be52e5473b4ULL, 0x96842dc95323f5a8ULL,
4251 0xaa97e14c3c26b886ULL, 0xc428d05aa4751e4cULL}},
4252 // (ten2mx >> 256) = c428d05aa4751e4c aa97e14c3c26b886
4253 // 96842dc95323f5a8882b3be52e5473b4
4254 {{0xd355c98425105c90ULL, 0xab9cf16ddc1cc486ULL,
4255 0x55464dd69685606bULL, 0x9ced737bb6c4183dULL}},
4256 // (ten2mx >> 256) = 9ced737bb6c4183d 55464dd69685606b
4257 // ab9cf16ddc1cc486d355c98425105c90
4258 {{0xebbc75a03b4d60e6ULL, 0xac2e4f162cfad40aULL,
4259 0xeed6e2f0f0d56712ULL, 0xfb158592be068d2eULL}},
4260 // (ten2mx >> 256) = fb158592be068d2e eed6e2f0f0d56712
4261 // ac2e4f162cfad40aebbc75a03b4d60e6
4262 {{0x8963914cfc3de71eULL, 0x568b727823fbdcd5ULL,
4263 0xf245825a5a445275ULL, 0xc8de047564d20a8bULL}},
4264 // (ten2mx >> 256) = c8de047564d20a8b f245825a5a445275
4265 // 568b727823fbdcd58963914cfc3de71e
4266 {{0xd44fa770c9cb1f4bULL, 0x453c5b934ffcb0aaULL,
4267 0x5b6aceaeae9d0ec4ULL, 0xa0b19d2ab70e6ed6ULL}},
4268 // (ten2mx >> 256) = a0b19d2ab70e6ed6 5b6aceaeae9d0ec4
4269 // 453c5b934ffcb0aad44fa770c9cb1f4b
4270 {{0xdd0c85f3d4a27f6fULL, 0x37637c75d996f3bbULL,
4271 0xe2bbd88bbee40bd0ULL, 0x808e17555f3ebf11ULL}},
4272 // (ten2mx >> 256) = 808e17555f3ebf11 e2bbd88bbee40bd0
4273 // 37637c75d996f3bbdd0c85f3d4a27f6f
4274 {{0x61ada31fba9d98b2ULL, 0x256bfa5628f185f9ULL,
4275 0x3792f412cb06794dULL, 0xcdb02555653131b6ULL}},
4276 // (ten2mx >> 256) = cdb02555653131b6 3792f412cb06794d
4277 // 256bfa5628f185f961ada31fba9d98b2
4278 {{0xe7be1c196217ad5bULL, 0x51232eab53f46b2dULL,
4279 0x5fa8c3423c052dd7ULL, 0xa48ceaaab75a8e2bULL}},
4280 // (ten2mx >> 256) = a48ceaaab75a8e2b 5fa8c3423c052dd7
4281 // 51232eab53f46b2de7be1c196217ad5b
4282 {{0x52fe7ce11b462449ULL, 0x40e8f222a99055beULL,
4283 0x1953cf68300424acULL, 0x83a3eeeef9153e89ULL}},
4284 // (ten2mx >> 256) = 83a3eeeef9153e89 1953cf68300424ac
4285 // 40e8f222a99055be52fe7ce11b462449
4286 {{0x51972e34f8703a0fULL, 0x34a7e9d10f4d55fdULL,
4287 0x8eec7f0d19a03aadULL, 0xd29fe4b18e88640eULL}},
4288 // (ten2mx >> 256) = d29fe4b18e88640e 8eec7f0d19a03aad
4289 // 34a7e9d10f4d55fd51972e34f8703a0f
4290 {{0x0e128b5d938cfb3fULL, 0x2a1fee40d90aab31ULL,
4291 0x3f2398d747b36224ULL, 0xa87fea27a539e9a5ULL}},
4292 // (ten2mx >> 256) = a87fea27a539e9a5 3f2398d747b36224
4293 // 2a1fee40d90aab310e128b5d938cfb3f
4294 {{0x3e753c4adc70c8ffULL, 0xbb4cbe9a473bbc27ULL,
4295 0x98e947129fc2b4e9ULL, 0x86ccbb52ea94baeaULL}},
4296 // (ten2mx >> 256) = 86ccbb52ea94baea 98e947129fc2b4e9
4297 // bb4cbe9a473bbc273e753c4adc70c8ff
4298 {{0x30bb93aafa4e0e65ULL, 0x9214642a0b92c6a5ULL,
4299 0x5b0ed81dcc6abb0fULL, 0xd7adf884aa879177ULL}},
4300 // (ten2mx >> 256) = d7adf884aa879177 5b0ed81dcc6abb0f
4301 // 9214642a0b92c6a530bb93aafa4e0e65
4302 {{0xc0960fbbfb71a51eULL, 0xa8105021a2dbd21dULL,
4303 0xe272467e3d222f3fULL, 0xac8b2d36eed2dac5ULL}},
4304 // (ten2mx >> 256) = ac8b2d36eed2dac5 e272467e3d222f3f
4305 // a8105021a2dbd21dc0960fbbfb71a51e
4306 {{0x66de72fcc927b74bULL, 0xb9a6a6814f1641b1ULL,
4307 0x1b8e9ecb641b58ffULL, 0x8a08f0f8bf0f156bULL}},
4308 // (ten2mx >> 256) = 8a08f0f8bf0f156b 1b8e9ecb641b58ff
4309 // b9a6a6814f1641b166de72fcc927b74b
4310 {{0xd7ca5194750c5878ULL, 0xf5d770cee4f0691bULL,
4311 0xf8e431456cf88e65ULL, 0xdcdb1b2798182244ULL}},
4312 // (ten2mx >> 256) = dcdb1b2798182244 f8e431456cf88e65
4313 // f5d770cee4f0691bd7ca5194750c5878
4314 {{0xdfd50e105da379f9ULL, 0x9179270bea59edafULL,
4315 0x2d835a9df0c6d851ULL, 0xb0af48ec79ace837ULL}},
4316 // (ten2mx >> 256) = b0af48ec79ace837 2d835a9df0c6d851
4317 // 9179270bea59edafdfd50e105da379f9
4318 {{0x19773e737e1c6194ULL, 0x0dfa85a321e18af3ULL,
4319 0x579c487e5a38ad0eULL, 0x8d590723948a535fULL}},
4320 // (ten2mx >> 256) = 8d590723948a535f 579c487e5a38ad0e
4321 // dfa85a321e18af319773e737e1c6194
4322 {{0xf58b971f302d68eeULL, 0x165da29e9c9c1184ULL,
4323 0x25c6da63c38de1b0ULL, 0xe2280b6c20dd5232ULL}},
4324 // (ten2mx >> 256) = e2280b6c20dd5232 25c6da63c38de1b0
4325 // 165da29e9c9c1184f58b971f302d68ee
4326 {{0xc46fac18f3578724ULL, 0x4517b54bb07cdad0ULL,
4327 0x1e38aeb6360b1af3ULL, 0xb4ecd5f01a4aa828ULL}},
4328 // (ten2mx >> 256) = b4ecd5f01a4aa828 1e38aeb6360b1af3
4329 // 4517b54bb07cdad0c46fac18f3578724
4330 {{0x36bfbce0c2ac6c1dULL, 0x9dac910959fd7bdaULL,
4331 0xb1c6f22b5e6f48c2ULL, 0x90bd77f3483bb9b9ULL}},
4332 // (ten2mx >> 256) = 90bd77f3483bb9b9 b1c6f22b5e6f48c2
4333 // 9dac910959fd7bda36bfbce0c2ac6c1d
4334 {{0x2465fb01377a4695ULL, 0x2f7a81a88ffbf95dULL,
4335 0xb60b1d1230b20e04ULL, 0xe7958cb87392c2c2ULL}}
4336 // (ten2mx >> 256) = e7958cb87392c2c2 b60b1d1230b20e04
4337 // 2f7a81a88ffbf95d2465fb01377a4695