blob: 9a5f9ba0abde1901dedcbaa96605ec4ee32c8368 [file] [log] [blame]
/* Copyright (C) 2007 Free Software Foundation, Inc.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.
In addition to the permissions in the GNU General Public License, the
Free Software Foundation gives you unlimited permission to link the
compiled version of this file into combinations with other programs,
and to distribute those combinations without any restriction coming
from the use of this file. (The General Public License restrictions
do apply in other respects; for example, they cover modification of
the file, and distribution when not linked into a combine
executable.)
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING. If not, write to the Free
Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
#include "bid_internal.h"
UINT64 round_const_table[][19] = {
{ // RN
0ull, // 0 extra digits
5ull, // 1 extra digits
50ull, // 2 extra digits
500ull, // 3 extra digits
5000ull, // 4 extra digits
50000ull, // 5 extra digits
500000ull, // 6 extra digits
5000000ull, // 7 extra digits
50000000ull, // 8 extra digits
500000000ull, // 9 extra digits
5000000000ull, // 10 extra digits
50000000000ull, // 11 extra digits
500000000000ull, // 12 extra digits
5000000000000ull, // 13 extra digits
50000000000000ull, // 14 extra digits
500000000000000ull, // 15 extra digits
5000000000000000ull, // 16 extra digits
50000000000000000ull, // 17 extra digits
500000000000000000ull // 18 extra digits
}
,
{ // RD
0ull, // 0 extra digits
0ull, // 1 extra digits
0ull, // 2 extra digits
00ull, // 3 extra digits
000ull, // 4 extra digits
0000ull, // 5 extra digits
00000ull, // 6 extra digits
000000ull, // 7 extra digits
0000000ull, // 8 extra digits
00000000ull, // 9 extra digits
000000000ull, // 10 extra digits
0000000000ull, // 11 extra digits
00000000000ull, // 12 extra digits
000000000000ull, // 13 extra digits
0000000000000ull, // 14 extra digits
00000000000000ull, // 15 extra digits
000000000000000ull, // 16 extra digits
0000000000000000ull, // 17 extra digits
00000000000000000ull // 18 extra digits
}
,
{ // round to Inf
0ull, // 0 extra digits
9ull, // 1 extra digits
99ull, // 2 extra digits
999ull, // 3 extra digits
9999ull, // 4 extra digits
99999ull, // 5 extra digits
999999ull, // 6 extra digits
9999999ull, // 7 extra digits
99999999ull, // 8 extra digits
999999999ull, // 9 extra digits
9999999999ull, // 10 extra digits
99999999999ull, // 11 extra digits
999999999999ull, // 12 extra digits
9999999999999ull, // 13 extra digits
99999999999999ull, // 14 extra digits
999999999999999ull, // 15 extra digits
9999999999999999ull, // 16 extra digits
99999999999999999ull, // 17 extra digits
999999999999999999ull // 18 extra digits
}
,
{ // RZ
0ull, // 0 extra digits
0ull, // 1 extra digits
0ull, // 2 extra digits
00ull, // 3 extra digits
000ull, // 4 extra digits
0000ull, // 5 extra digits
00000ull, // 6 extra digits
000000ull, // 7 extra digits
0000000ull, // 8 extra digits
00000000ull, // 9 extra digits
000000000ull, // 10 extra digits
0000000000ull, // 11 extra digits
00000000000ull, // 12 extra digits
000000000000ull, // 13 extra digits
0000000000000ull, // 14 extra digits
00000000000000ull, // 15 extra digits
000000000000000ull, // 16 extra digits
0000000000000000ull, // 17 extra digits
00000000000000000ull // 18 extra digits
}
,
{ // round ties away from 0
0ull, // 0 extra digits
5ull, // 1 extra digits
50ull, // 2 extra digits
500ull, // 3 extra digits
5000ull, // 4 extra digits
50000ull, // 5 extra digits
500000ull, // 6 extra digits
5000000ull, // 7 extra digits
50000000ull, // 8 extra digits
500000000ull, // 9 extra digits
5000000000ull, // 10 extra digits
50000000000ull, // 11 extra digits
500000000000ull, // 12 extra digits
5000000000000ull, // 13 extra digits
50000000000000ull, // 14 extra digits
500000000000000ull, // 15 extra digits
5000000000000000ull, // 16 extra digits
50000000000000000ull, // 17 extra digits
500000000000000000ull // 18 extra digits
}
,
};
UINT128 round_const_table_128[][36] = {
{ //RN
{{0ull, 0ull}
}
, // 0 extra digits
{{5ull, 0ull}
}
, // 1 extra digits
{{50ull, 0ull}
}
, // 2 extra digits
{{500ull, 0ull}
}
, // 3 extra digits
{{5000ull, 0ull}
}
, // 4 extra digits
{{50000ull, 0ull}
}
, // 5 extra digits
{{500000ull, 0ull}
}
, // 6 extra digits
{{5000000ull, 0ull}
}
, // 7 extra digits
{{50000000ull, 0ull}
}
, // 8 extra digits
{{500000000ull, 0ull}
}
, // 9 extra digits
{{5000000000ull, 0ull}
}
, // 10 extra digits
{{50000000000ull, 0ull}
}
, // 11 extra digits
{{500000000000ull, 0ull}
}
, // 12 extra digits
{{5000000000000ull, 0ull}
}
, // 13 extra digits
{{50000000000000ull, 0ull}
}
, // 14 extra digits
{{500000000000000ull, 0ull}
}
, // 15 extra digits
{{5000000000000000ull, 0ull}
}
, // 16 extra digits
{{50000000000000000ull, 0ull}
}
, // 17 extra digits
{{500000000000000000ull, 0ull}
}
, // 18 extra digits
{{5000000000000000000ull, 0ull}
}
, // 19 extra digits
{{0xb5e3af16b1880000ull, 2ull}
}
, //20
{{0x1ae4d6e2ef500000ull, 27ull}
}
, //21
{{0xcf064dd59200000ull, 271ull}
}
, //22
{{0x8163f0a57b400000ull, 2710ull}
}
, //23
{{0xde76676d0800000ull, 27105ull}
}
, //24
{{0x8b0a00a425000000ull, 0x422caull}
}
, //25
{{0x6e64066972000000ull, 0x295be9ull}
}
, //26
{{0x4fe8401e74000000ull, 0x19d971eull}
}
, //27
{{0x1f12813088000000ull, 0x1027e72full}
}
, //28
{{0x36b90be550000000ull, 0xa18f07d7ull}
}
, //29
{{0x233a76f520000000ull, 0x64f964e68ull}
}
, //30
{{0x6048a59340000000ull, 0x3f1bdf1011ull}
}
, //31
{{0xc2d677c080000000ull, 0x27716b6a0adull}
}
, //32
{{0x9c60ad8500000000ull, 0x18a6e32246c9ull}
}
, //33
{{0x1bc6c73200000000ull, 0xf684df56c3e0ull}
}
, //34
{{0x15c3c7f400000000ull, 0x9a130b963a6c1ull}
}
, //35
}
,
{ //RD
{{0ull, 0ull}
}
, // 0 extra digits
{{0ull, 0ull}
}
, // 1 extra digits
{{0ull, 0ull}
}
, // 2 extra digits
{{00ull, 0ull}
}
, // 3 extra digits
{{000ull, 0ull}
}
, // 4 extra digits
{{0000ull, 0ull}
}
, // 5 extra digits
{{00000ull, 0ull}
}
, // 6 extra digits
{{000000ull, 0ull}
}
, // 7 extra digits
{{0000000ull, 0ull}
}
, // 8 extra digits
{{00000000ull, 0ull}
}
, // 9 extra digits
{{000000000ull, 0ull}
}
, // 10 extra digits
{{0000000000ull, 0ull}
}
, // 11 extra digits
{{00000000000ull, 0ull}
}
, // 12 extra digits
{{000000000000ull, 0ull}
}
, // 13 extra digits
{{0000000000000ull, 0ull}
}
, // 14 extra digits
{{00000000000000ull, 0ull}
}
, // 15 extra digits
{{000000000000000ull, 0ull}
}
, // 16 extra digits
{{0000000000000000ull, 0ull}
}
, // 17 extra digits
{{00000000000000000ull, 0ull}
}
, // 18 extra digits
{{000000000000000000ull, 0ull}
}
, // 19 extra digits
{{0ull, 0ull}
}
, //20
{{0ull, 0ull}
}
, //21
{{0ull, 0ull}
}
, //22
{{0ull, 0ull}
}
, //23
{{0ull, 0ull}
}
, //24
{{0ull, 0ull}
}
, //25
{{0ull, 0ull}
}
, //26
{{0ull, 0ull}
}
, //27
{{0ull, 0ull}
}
, //28
{{0ull, 0ull}
}
, //29
{{0ull, 0ull}
}
, //30
{{0ull, 0ull}
}
, //31
{{0ull, 0ull}
}
, //32
{{0ull, 0ull}
}
, //33
{{0ull, 0ull}
}
, //34
{{0ull, 0ull}
}
, //35
}
,
{ //RU
{{0ull, 0ull}
}
, // 0 extra digits
{{9ull, 0ull}
}
, // 1 extra digits
{{99ull, 0ull}
}
, // 2 extra digits
{{999ull, 0ull}
}
, // 3 extra digits
{{9999ull, 0ull}
}
, // 4 extra digits
{{99999ull, 0ull}
}
, // 5 extra digits
{{999999ull, 0ull}
}
, // 6 extra digits
{{9999999ull, 0ull}
}
, // 7 extra digits
{{99999999ull, 0ull}
}
, // 8 extra digits
{{999999999ull, 0ull}
}
, // 9 extra digits
{{9999999999ull, 0ull}
}
, // 10 extra digits
{{99999999999ull, 0ull}
}
, // 11 extra digits
{{999999999999ull, 0ull}
}
, // 12 extra digits
{{9999999999999ull, 0ull}
}
, // 13 extra digits
{{99999999999999ull, 0ull}
}
, // 14 extra digits
{{999999999999999ull, 0ull}
}
, // 15 extra digits
{{9999999999999999ull, 0ull}
}
, // 16 extra digits
{{99999999999999999ull, 0ull}
}
, // 17 extra digits
{{999999999999999999ull, 0ull}
}
, // 18 extra digits
{{9999999999999999999ull, 0ull}
}
, // 19 extra digits
{{0x6BC75E2D630FFFFFull, 0x5ull}
}
, //20
{{0x35C9ADC5DE9FFFFFull, 0x36ull}
}
, //21
{{0x19E0C9BAB23FFFFFull, 0x21eull}
}
, //22
{{0x2C7E14AF67FFFFFull, 0x152dull}
}
, //23
{{0x1BCECCEDA0FFFFFFull, 0xd3c2ull}
}
, //24
{{0x1614014849FFFFFFull, 0x84595ull}
}
, //25
{{0xDCC80CD2E3FFFFFFull, 0x52b7d2ull}
}
, //26
{{0x9FD0803CE7FFFFFFull, 0x33B2E3Cull}
}
, //27
{{0x3E2502610FFFFFFFull, 0x204FCE5Eull}
}
, //28
{{0x6D7217CA9FFFFFFFull, 0x1431E0FAEull}
}
, //29
{{0x4674EDEA3FFFFFFFull, 0xC9F2C9CD0ull}
}
, //30
{{0xC0914B267FFFFFFFull, 0x7E37BE2022ull}
}
, //31
{{0x85ACEF80FFFFFFFFull, 0x4EE2D6D415Bull}
}
, //32
{{0x38c15b09ffffffffull, 0x314dc6448d93ull}
}
, //33
{{0x378d8e63ffffffffull, 0x1ed09bead87c0ull}
}
, //34
{{0x2b878fe7ffffffffull, 0x13426172c74d82ull}
}
, //35
}
,
{ //RZ
{{0ull, 0ull}
}
, // 0 extra digits
{{0ull, 0ull}
}
, // 1 extra digits
{{0ull, 0ull}
}
, // 2 extra digits
{{00ull, 0ull}
}
, // 3 extra digits
{{000ull, 0ull}
}
, // 4 extra digits
{{0000ull, 0ull}
}
, // 5 extra digits
{{00000ull, 0ull}
}
, // 6 extra digits
{{000000ull, 0ull}
}
, // 7 extra digits
{{0000000ull, 0ull}
}
, // 8 extra digits
{{00000000ull, 0ull}
}
, // 9 extra digits
{{000000000ull, 0ull}
}
, // 10 extra digits
{{0000000000ull, 0ull}
}
, // 11 extra digits
{{00000000000ull, 0ull}
}
, // 12 extra digits
{{000000000000ull, 0ull}
}
, // 13 extra digits
{{0000000000000ull, 0ull}
}
, // 14 extra digits
{{00000000000000ull, 0ull}
}
, // 15 extra digits
{{000000000000000ull, 0ull}
}
, // 16 extra digits
{{0000000000000000ull, 0ull}
}
, // 17 extra digits
{{00000000000000000ull, 0ull}
}
, // 18 extra digits
{{000000000000000000ull, 0ull}
}
, // 19 extra digits
{{0ull, 0ull}
}
, //20
{{0ull, 0ull}
}
, //21
{{0ull, 0ull}
}
, //22
{{0ull, 0ull}
}
, //23
{{0ull, 0ull}
}
, //24
{{0ull, 0ull}
}
, //25
{{0ull, 0ull}
}
, //26
{{0ull, 0ull}
}
, //27
{{0ull, 0ull}
}
, //28
{{0ull, 0ull}
}
, //29
{{0ull, 0ull}
}
, //30
{{0ull, 0ull}
}
, //31
{{0ull, 0ull}
}
, //32
{{0ull, 0ull}
}
, //33
{{0ull, 0ull}
}
, //34
{{0ull, 0ull}
}
, //35
}
,
{ //RN, ties away
{{0ull, 0ull}
}
, // 0 extra digits
{{5ull, 0ull}
}
, // 1 extra digits
{{50ull, 0ull}
}
, // 2 extra digits
{{500ull, 0ull}
}
, // 3 extra digits
{{5000ull, 0ull}
}
, // 4 extra digits
{{50000ull, 0ull}
}
, // 5 extra digits
{{500000ull, 0ull}
}
, // 6 extra digits
{{5000000ull, 0ull}
}
, // 7 extra digits
{{50000000ull, 0ull}
}
, // 8 extra digits
{{500000000ull, 0ull}
}
, // 9 extra digits
{{5000000000ull, 0ull}
}
, // 10 extra digits
{{50000000000ull, 0ull}
}
, // 11 extra digits
{{500000000000ull, 0ull}
}
, // 12 extra digits
{{5000000000000ull, 0ull}
}
, // 13 extra digits
{{50000000000000ull, 0ull}
}
, // 14 extra digits
{{500000000000000ull, 0ull}
}
, // 15 extra digits
{{5000000000000000ull, 0ull}
}
, // 16 extra digits
{{50000000000000000ull, 0ull}
}
, // 17 extra digits
{{500000000000000000ull, 0ull}
}
, // 18 extra digits
{{5000000000000000000ull, 0ull}
}
, // 19 extra digits
{{0xb5e3af16b1880000ull, 2ull}
}
, //20
{{0x1ae4d6e2ef500000ull, 27ull}
}
, //21
{{0xcf064dd59200000ull, 271ull}
}
, //22
{{0x8163f0a57b400000ull, 2710ull}
}
, //23
{{0xde76676d0800000ull, 27105ull}
}
, //24
{{0x8b0a00a425000000ull, 0x422caull}
}
, //25
{{0x6e64066972000000ull, 0x295be9ull}
}
, //26
{{0x4fe8401e74000000ull, 0x19d971eull}
}
, //27
{{0x1f12813088000000ull, 0x1027e72full}
}
, //28
{{0x36b90be550000000ull, 0xa18f07d7ull}
}
, //29
{{0x233a76f520000000ull, 0x64f964e68ull}
}
, //30
{{0x6048a59340000000ull, 0x3f1bdf1011ull}
}
, //31
{{0xc2d677c080000000ull, 0x27716b6a0adull}
}
, //32
{{0x9c60ad8500000000ull, 0x18a6e32246c9ull}
}
, //33
{{0x1bc6c73200000000ull, 0xf684df56c3e0ull}
}
, //34
{{0x15c3c7f400000000ull, 0x9a130b963a6c1ull}
}
, //35
}
};
UINT128 reciprocals10_128[] = {
{{0ull, 0ull}
}
, // 0 extra digits
{{0x3333333333333334ull, 0x3333333333333333ull}
}
, // 1 extra digit
{{0x51eb851eb851eb86ull, 0x051eb851eb851eb8ull}
}
, // 2 extra digits
{{0x3b645a1cac083127ull, 0x0083126e978d4fdfull}
}
, // 3 extra digits
{{0x4af4f0d844d013aaULL, 0x00346dc5d6388659ULL}
}
, // 10^(-4) * 2^131
{{0x08c3f3e0370cdc88ULL, 0x0029f16b11c6d1e1ULL}
}
, // 10^(-5) * 2^134
{{0x6d698fe69270b06dULL, 0x00218def416bdb1aULL}
}
, // 10^(-6) * 2^137
{{0xaf0f4ca41d811a47ULL, 0x0035afe535795e90ULL}
}
, // 10^(-7) * 2^141
{{0xbf3f70834acdaea0ULL, 0x002af31dc4611873ULL}
}
, // 10^(-8) * 2^144
{{0x65cc5a02a23e254dULL, 0x00225c17d04dad29ULL}
}
, // 10^(-9) * 2^147
{{0x6fad5cd10396a214ULL, 0x0036f9bfb3af7b75ULL}
}
, // 10^(-10) * 2^151
{{0xbfbde3da69454e76ULL, 0x002bfaffc2f2c92aULL}
}
, // 10^(-11) * 2^154
{{0x32fe4fe1edd10b92ULL, 0x00232f33025bd422ULL}
}
, // 10^(-12) * 2^157
{{0x84ca19697c81ac1cULL, 0x00384b84d092ed03ULL}
}
, // 10^(-13) * 2^161
{{0x03d4e1213067bce4ULL, 0x002d09370d425736ULL}
}
, // 10^(-14) * 2^164
{{0x3643e74dc052fd83ULL, 0x0024075f3dceac2bULL}
}
, // 10^(-15) * 2^167
{{0x56d30baf9a1e626bULL, 0x0039a5652fb11378ULL}
}
, // 10^(-16) * 2^171
{{0x12426fbfae7eb522ULL, 0x002e1dea8c8da92dULL}
}
, // 10^(-17) * 2^174
{{0x41cebfcc8b9890e8ULL, 0x0024e4bba3a48757ULL}
}
, // 10^(-18) * 2^177
{{0x694acc7a78f41b0dULL, 0x003b07929f6da558ULL}
}
, // 10^(-19) * 2^181
{{0xbaa23d2ec729af3eULL, 0x002f394219248446ULL}
}
, // 10^(-20) * 2^184
{{0xfbb4fdbf05baf298ULL, 0x0025c768141d369eULL}
}
, // 10^(-21) * 2^187
{{0x2c54c931a2c4b759ULL, 0x003c7240202ebdcbULL}
}
, // 10^(-22) * 2^191
{{0x89dd6dc14f03c5e1ULL, 0x00305b66802564a2ULL}
}
, // 10^(-23) * 2^194
{{0xd4b1249aa59c9e4eULL, 0x0026af8533511d4eULL}
}
, // 10^(-24) * 2^197
{{0x544ea0f76f60fd49ULL, 0x003de5a1ebb4fbb1ULL}
}
, // 10^(-25) * 2^201
{{0x76a54d92bf80caa1ULL, 0x00318481895d9627ULL}
}
, // 10^(-26) * 2^204
{{0x921dd7a89933d54eULL, 0x00279d346de4781fULL}
}
, // 10^(-27) * 2^207
{{0x8362f2a75b862215ULL, 0x003f61ed7ca0c032ULL}
}
, // 10^(-28) * 2^211
{{0xcf825bb91604e811ULL, 0x0032b4bdfd4d668eULL}
}
, // 10^(-29) * 2^214
{{0x0c684960de6a5341ULL, 0x00289097fdd7853fULL}
}
, // 10^(-30) * 2^217
{{0x3d203ab3e521dc34ULL, 0x002073accb12d0ffULL}
}
, // 10^(-31) * 2^220
{{0x2e99f7863b696053ULL, 0x0033ec47ab514e65ULL}
}
, // 10^(-32) * 2^224
{{0x587b2c6b62bab376ULL, 0x002989d2ef743eb7ULL}
}
, // 10^(-33) * 2^227
{{0xad2f56bc4efbc2c5ULL, 0x00213b0f25f69892ULL}
}
, // 10^(-34) * 2^230
{{0x0f2abc9d8c9689d1ull, 0x01a95a5b7f87a0efull}
}
, // 35 extra digits
};
int recip_scale[] = {
129 - 128, // 1
129 - 128, // 1/10
129 - 128, // 1/10^2
129 - 128, // 1/10^3
3, // 131 - 128
6, // 134 - 128
9, // 137 - 128
13, // 141 - 128
16, // 144 - 128
19, // 147 - 128
23, // 151 - 128
26, // 154 - 128
29, // 157 - 128
33, // 161 - 128
36, // 164 - 128
39, // 167 - 128
43, // 171 - 128
46, // 174 - 128
49, // 177 - 128
53, // 181 - 128
56, // 184 - 128
59, // 187 - 128
63, // 191 - 128
66, // 194 - 128
69, // 197 - 128
73, // 201 - 128
76, // 204 - 128
79, // 207 - 128
83, // 211 - 128
86, // 214 - 128
89, // 217 - 128
92, // 220 - 128
96, // 224 - 128
99, // 227 - 128
102, // 230 - 128
109, // 237 - 128, 1/10^35
};
// tables used in computation
int estimate_decimal_digits[129] = {
1, //2^0 =1 < 10^0
1, //2^1 =2 < 10^1
1, //2^2 =4 < 10^1
1, //2^3 =8 < 10^1
2, //2^4 =16 < 10^2
2, //2^5 =32 < 10^2
2, //2^6 =64 < 10^2
3, //2^7 =128 < 10^3
3, //2^8 =256 < 10^3
3, //2^9 =512 < 10^3
4, //2^10=1024 < 10^4
4, //2^11=2048 < 10^4
4, //2^12=4096 < 10^4
4, //2^13=8192 < 10^4
5, //2^14=16384 < 10^5
5, //2^15=32768 < 10^5
5, //2^16=65536 < 10^5
6, //2^17=131072 < 10^6
6, //2^18=262144 < 10^6
6, //2^19=524288 < 10^6
7, //2^20=1048576 < 10^7
7, //2^21=2097152 < 10^7
7, //2^22=4194304 < 10^7
7, //2^23=8388608 < 10^7
8, //2^24=16777216 < 10^8
8, //2^25=33554432 < 10^8
8, //2^26=67108864 < 10^8
9, //2^27=134217728 < 10^9
9, //2^28=268435456 < 10^9
9, //2^29=536870912 < 10^9
10, //2^30=1073741824< 10^10
10, //2^31=2147483648< 10^10
10, //2^32=4294967296 < 10^10
10, //2^33=8589934592 < 10^10
11, //2^34=17179869184 < 10^11
11, //2^35=34359738368 < 10^11
11, //2^36=68719476736 < 10^11
12, //2^37=137438953472 < 10^12
12, //2^38=274877906944 < 10^12
12, //2^39=549755813888 < 10^12
13, //2^40=1099511627776 < 10^13
13, //2^41=2199023255552 < 10^13
13, //2^42=4398046511104 < 10^13
13, //2^43=8796093022208 < 10^13
14, //2^44=17592186044416 < 10^14
14, //2^45=35184372088832 < 10^14
14, //2^46=70368744177664 < 10^14
15, //2^47=140737488355328< 10^15
15, //2^48=281474976710656 < 10^15
15, //2^49=562949953421312 < 10^15
16, //2^50=1125899906842624 < 10^16
16, //2^51=2251799813685248 < 10^16
16, //2^52=4503599627370496 < 10^16
16, //2^53=9007199254740992 < 10^16
17, //2^54=18014398509481984 < 10^17
17, //2^55=36028797018963968 < 10^17
17, //2^56=72057594037927936 < 10^17
18, //2^57=144115188075855872 < 10^18
18, //2^58=288230376151711744 < 10^18
18, //2^59=576460752303423488 < 10^18
19, //2^60=1152921504606846976< 10^19
19, //2^61=2305843009213693952< 10^19
19, //2^62=4611686018427387904< 10^19
19, //2^63=9223372036854775808< 10^19
20, //2^64=18446744073709551616
20, //2^65=36893488147419103232
20, //2^66=73786976294838206464
21, //2^67=147573952589676412928
21, //2^68=295147905179352825856
21, //2^69=590295810358705651712
22, //2^70=1180591620717411303424
22, //2^71=2361183241434822606848
22, //2^72=4722366482869645213696
22, //2^73=9444732965739290427392
23, //2^74=18889465931478580854784
23, //2^75=37778931862957161709568
23, //2^76=75557863725914323419136
24, //2^77=151115727451828646838272
24, //2^78=302231454903657293676544
24, //2^79=604462909807314587353088
25, //2^80=1208925819614629174706176
25, //2^81=2417851639229258349412352
25, //2^82=4835703278458516698824704
25, //2^83=9671406556917033397649408
26, //2^84=19342813113834066795298816
26, //2^85=38685626227668133590597632
26, //2^86=77371252455336267181195264
27, //2^87=154742504910672534362390528
27, //2^88=309485009821345068724781056
27, //2^89=618970019642690137449562112
28, //2^90=1237940039285380274899124224
28, //2^91=2475880078570760549798248448
28, //2^92=4951760157141521099596496896
28, //2^93=9903520314283042199192993792
29, //2^94=19807040628566084398385987584
29, //2^95=39614081257132168796771975168
29, //2^96=79228162514264337593543950336
30, //2^97=158456325028528675187087900672
30, //2^98=316912650057057350374175801344
30, //2^99=633825300114114700748351602688
31, //2^100=1267650600228229401496703205376
31, //2^101=2535301200456458802993406410752
31, //2^102=5070602400912917605986812821504
32, //2^103=10141204801825835211973625643008
32, //2^104=20282409603651670423947251286016
32, //2^105=40564819207303340847894502572032
32, //2^106=81129638414606681695789005144064
33, //2^107=162259276829213363391578010288128
33, // 2^108
33, // 2^109
34, // 2^110
34, // 2^111
34, // 2^112
35, // 2^113
35, // 2^114
35, // 2^115
35, // 2^116
36, // 2^117
36, // 2^118
36, // 2^119
37, // 2^120
37, // 2^121
37, // 2^122
38, // 2^123
38, // 2^124
38, // 2^125
38, // 2^126
39, // 2^127
39 // 2^128
};
UINT128 power10_table_128[] = {
{{0x0000000000000001ull, 0x0000000000000000ull}}, // 10^0
{{0x000000000000000aull, 0x0000000000000000ull}}, // 10^1
{{0x0000000000000064ull, 0x0000000000000000ull}}, // 10^2
{{0x00000000000003e8ull, 0x0000000000000000ull}}, // 10^3
{{0x0000000000002710ull, 0x0000000000000000ull}}, // 10^4
{{0x00000000000186a0ull, 0x0000000000000000ull}}, // 10^5
{{0x00000000000f4240ull, 0x0000000000000000ull}}, // 10^6
{{0x0000000000989680ull, 0x0000000000000000ull}}, // 10^7
{{0x0000000005f5e100ull, 0x0000000000000000ull}}, // 10^8
{{0x000000003b9aca00ull, 0x0000000000000000ull}}, // 10^9
{{0x00000002540be400ull, 0x0000000000000000ull}}, // 10^10
{{0x000000174876e800ull, 0x0000000000000000ull}}, // 10^11
{{0x000000e8d4a51000ull, 0x0000000000000000ull}}, // 10^12
{{0x000009184e72a000ull, 0x0000000000000000ull}}, // 10^13
{{0x00005af3107a4000ull, 0x0000000000000000ull}}, // 10^14
{{0x00038d7ea4c68000ull, 0x0000000000000000ull}}, // 10^15
{{0x002386f26fc10000ull, 0x0000000000000000ull}}, // 10^16
{{0x016345785d8a0000ull, 0x0000000000000000ull}}, // 10^17
{{0x0de0b6b3a7640000ull, 0x0000000000000000ull}}, // 10^18
{{0x8ac7230489e80000ull, 0x0000000000000000ull}}, // 10^19
{{0x6bc75e2d63100000ull, 0x0000000000000005ull}}, // 10^20
{{0x35c9adc5dea00000ull, 0x0000000000000036ull}}, // 10^21
{{0x19e0c9bab2400000ull, 0x000000000000021eull}}, // 10^22
{{0x02c7e14af6800000ull, 0x000000000000152dull}}, // 10^23
{{0x1bcecceda1000000ull, 0x000000000000d3c2ull}}, // 10^24
{{0x161401484a000000ull, 0x0000000000084595ull}}, // 10^25
{{0xdcc80cd2e4000000ull, 0x000000000052b7d2ull}}, // 10^26
{{0x9fd0803ce8000000ull, 0x00000000033b2e3cull}}, // 10^27
{{0x3e25026110000000ull, 0x00000000204fce5eull}}, // 10^28
{{0x6d7217caa0000000ull, 0x00000001431e0faeull}}, // 10^29
{{0x4674edea40000000ull, 0x0000000c9f2c9cd0ull}}, // 10^30
{{0xc0914b2680000000ull, 0x0000007e37be2022ull}}, // 10^31
{{0x85acef8100000000ull, 0x000004ee2d6d415bull}}, // 10^32
{{0x38c15b0a00000000ull, 0x0000314dc6448d93ull}}, // 10^33
{{0x378d8e6400000000ull, 0x0001ed09bead87c0ull}}, // 10^34
{{0x2b878fe800000000ull, 0x0013426172c74d82ull}}, // 10^35
{{0xb34b9f1000000000ull, 0x00c097ce7bc90715ull}}, // 10^36
{{0x00f436a000000000ull, 0x0785ee10d5da46d9ull}}, // 10^37
{{0x098a224000000000ull, 0x4b3b4ca85a86c47aull}}, // 10^38
};
int estimate_bin_expon[] = {
0, // 10^0
3, // 10^1
6, // 10^2
9, // 10^3
13, // 10^4
16, // 10^5
19, // 10^6
23, // 10^7
26, // 10^8
29, // 10^9
33, // 10^10
36, // 10^11
39, // 10^12
43, // 10^13
46, // 10^14
49, // 10^15
53 // 10^16
};
UINT64 power10_index_binexp[] = {
0x000000000000000aull,
0x000000000000000aull,
0x000000000000000aull,
0x000000000000000aull,
0x0000000000000064ull,
0x0000000000000064ull,
0x0000000000000064ull,
0x00000000000003e8ull,
0x00000000000003e8ull,
0x00000000000003e8ull,
0x0000000000002710ull,
0x0000000000002710ull,
0x0000000000002710ull,
0x0000000000002710ull,
0x00000000000186a0ull,
0x00000000000186a0ull,
0x00000000000186a0ull,
0x00000000000f4240ull,
0x00000000000f4240ull,
0x00000000000f4240ull,
0x0000000000989680ull,
0x0000000000989680ull,
0x0000000000989680ull,
0x0000000000989680ull,
0x0000000005f5e100ull,
0x0000000005f5e100ull,
0x0000000005f5e100ull,
0x000000003b9aca00ull,
0x000000003b9aca00ull,
0x000000003b9aca00ull,
0x00000002540be400ull,
0x00000002540be400ull,
0x00000002540be400ull,
0x00000002540be400ull,
0x000000174876e800ull,
0x000000174876e800ull,
0x000000174876e800ull,
0x000000e8d4a51000ull,
0x000000e8d4a51000ull,
0x000000e8d4a51000ull,
0x000009184e72a000ull,
0x000009184e72a000ull,
0x000009184e72a000ull,
0x000009184e72a000ull,
0x00005af3107a4000ull,
0x00005af3107a4000ull,
0x00005af3107a4000ull,
0x00038d7ea4c68000ull,
0x00038d7ea4c68000ull,
0x00038d7ea4c68000ull,
0x002386f26fc10000ull,
0x002386f26fc10000ull,
0x002386f26fc10000ull,
0x002386f26fc10000ull,
0x016345785d8a0000ull,
0x016345785d8a0000ull,
0x016345785d8a0000ull,
0x0de0b6b3a7640000ull,
0x0de0b6b3a7640000ull,
0x0de0b6b3a7640000ull,
0x8ac7230489e80000ull,
0x8ac7230489e80000ull,
0x8ac7230489e80000ull,
0x8ac7230489e80000ull
};
int short_recip_scale[] = {
1,
65 - 64,
69 - 64,
71 - 64,
75 - 64,
78 - 64,
81 - 64,
85 - 64,
88 - 64,
91 - 64,
95 - 64,
98 - 64,
101 - 64,
105 - 64,
108 - 64,
111 - 64,
115 - 64, //114 - 64
118 - 64
};
UINT64 reciprocals10_64[] = {
1ull, // dummy value for 0 extra digits
0x3333333333333334ull, // 1 extra digit
0x51eb851eb851eb86ull,
0x20c49ba5e353f7cfull,
0x346dc5d63886594bull,
0x29f16b11c6d1e109ull,
0x218def416bdb1a6eull,
0x35afe535795e90b0ull,
0x2af31dc4611873c0ull,
0x225c17d04dad2966ull,
0x36f9bfb3af7b7570ull,
0x2bfaffc2f2c92ac0ull,
0x232f33025bd42233ull,
0x384b84d092ed0385ull,
0x2d09370d42573604ull,
0x24075f3dceac2b37ull,
0x39a5652fb1137857ull,
0x2e1dea8c8da92d13ull
};
UINT128 power10_index_binexp_128[] = {
{{0x000000000000000aull, 0x0000000000000000ull}},
{{0x000000000000000aull, 0x0000000000000000ull}},
{{0x000000000000000aull, 0x0000000000000000ull}},
{{0x000000000000000aull, 0x0000000000000000ull}},
{{0x0000000000000064ull, 0x0000000000000000ull}},
{{0x0000000000000064ull, 0x0000000000000000ull}},
{{0x0000000000000064ull, 0x0000000000000000ull}},
{{0x00000000000003e8ull, 0x0000000000000000ull}},
{{0x00000000000003e8ull, 0x0000000000000000ull}},
{{0x00000000000003e8ull, 0x0000000000000000ull}},
{{0x0000000000002710ull, 0x0000000000000000ull}},
{{0x0000000000002710ull, 0x0000000000000000ull}},
{{0x0000000000002710ull, 0x0000000000000000ull}},
{{0x0000000000002710ull, 0x0000000000000000ull}},
{{0x00000000000186a0ull, 0x0000000000000000ull}},
{{0x00000000000186a0ull, 0x0000000000000000ull}},
{{0x00000000000186a0ull, 0x0000000000000000ull}},
{{0x00000000000f4240ull, 0x0000000000000000ull}},
{{0x00000000000f4240ull, 0x0000000000000000ull}},
{{0x00000000000f4240ull, 0x0000000000000000ull}},
{{0x0000000000989680ull, 0x0000000000000000ull}},
{{0x0000000000989680ull, 0x0000000000000000ull}},
{{0x0000000000989680ull, 0x0000000000000000ull}},
{{0x0000000000989680ull, 0x0000000000000000ull}},
{{0x0000000005f5e100ull, 0x0000000000000000ull}},
{{0x0000000005f5e100ull, 0x0000000000000000ull}},
{{0x0000000005f5e100ull, 0x0000000000000000ull}},
{{0x000000003b9aca00ull, 0x0000000000000000ull}},
{{0x000000003b9aca00ull, 0x0000000000000000ull}},
{{0x000000003b9aca00ull, 0x0000000000000000ull}},
{{0x00000002540be400ull, 0x0000000000000000ull}},
{{0x00000002540be400ull, 0x0000000000000000ull}},
{{0x00000002540be400ull, 0x0000000000000000ull}},
{{0x00000002540be400ull, 0x0000000000000000ull}},
{{0x000000174876e800ull, 0x0000000000000000ull}},
{{0x000000174876e800ull, 0x0000000000000000ull}},
{{0x000000174876e800ull, 0x0000000000000000ull}},
{{0x000000e8d4a51000ull, 0x0000000000000000ull}},
{{0x000000e8d4a51000ull, 0x0000000000000000ull}},
{{0x000000e8d4a51000ull, 0x0000000000000000ull}},
{{0x000009184e72a000ull, 0x0000000000000000ull}},
{{0x000009184e72a000ull, 0x0000000000000000ull}},
{{0x000009184e72a000ull, 0x0000000000000000ull}},
{{0x000009184e72a000ull, 0x0000000000000000ull}},
{{0x00005af3107a4000ull, 0x0000000000000000ull}},
{{0x00005af3107a4000ull, 0x0000000000000000ull}},
{{0x00005af3107a4000ull, 0x0000000000000000ull}},
{{0x00038d7ea4c68000ull, 0x0000000000000000ull}},
{{0x00038d7ea4c68000ull, 0x0000000000000000ull}},
{{0x00038d7ea4c68000ull, 0x0000000000000000ull}},
{{0x002386f26fc10000ull, 0x0000000000000000ull}},
{{0x002386f26fc10000ull, 0x0000000000000000ull}},
{{0x002386f26fc10000ull, 0x0000000000000000ull}},
{{0x002386f26fc10000ull, 0x0000000000000000ull}},
{{0x016345785d8a0000ull, 0x0000000000000000ull}},
{{0x016345785d8a0000ull, 0x0000000000000000ull}},
{{0x016345785d8a0000ull, 0x0000000000000000ull}},
{{0x0de0b6b3a7640000ull, 0x0000000000000000ull}},
{{0x0de0b6b3a7640000ull, 0x0000000000000000ull}},
{{0x0de0b6b3a7640000ull, 0x0000000000000000ull}},
{{0x8ac7230489e80000ull, 0x0000000000000000ull}},
{{0x8ac7230489e80000ull, 0x0000000000000000ull}},
{{0x8ac7230489e80000ull, 0x0000000000000000ull}},
{{0x8ac7230489e80000ull, 0x0000000000000000ull}},
{{0x6bc75e2d63100000ull, 0x0000000000000005ull}}, // 10^20
{{0x6bc75e2d63100000ull, 0x0000000000000005ull}}, // 10^20
{{0x6bc75e2d63100000ull, 0x0000000000000005ull}}, // 10^20
{{0x35c9adc5dea00000ull, 0x0000000000000036ull}}, // 10^21
{{0x35c9adc5dea00000ull, 0x0000000000000036ull}}, // 10^21
{{0x35c9adc5dea00000ull, 0x0000000000000036ull}}, // 10^21
{{0x19e0c9bab2400000ull, 0x000000000000021eull}}, // 10^22
{{0x19e0c9bab2400000ull, 0x000000000000021eull}}, // 10^22
{{0x19e0c9bab2400000ull, 0x000000000000021eull}}, // 10^22
{{0x19e0c9bab2400000ull, 0x000000000000021eull}}, // 10^22
{{0x02c7e14af6800000ull, 0x000000000000152dull}}, // 10^23
{{0x02c7e14af6800000ull, 0x000000000000152dull}}, // 10^23
{{0x02c7e14af6800000ull, 0x000000000000152dull}}, // 10^23
{{0x1bcecceda1000000ull, 0x000000000000d3c2ull}}, // 10^24
{{0x1bcecceda1000000ull, 0x000000000000d3c2ull}}, // 10^24
{{0x1bcecceda1000000ull, 0x000000000000d3c2ull}}, // 10^24
{{0x161401484a000000ull, 0x0000000000084595ull}}, // 10^25
{{0x161401484a000000ull, 0x0000000000084595ull}}, // 10^25
{{0x161401484a000000ull, 0x0000000000084595ull}}, // 10^25
{{0x161401484a000000ull, 0x0000000000084595ull}}, // 10^25
{{0xdcc80cd2e4000000ull, 0x000000000052b7d2ull}}, // 10^26
{{0xdcc80cd2e4000000ull, 0x000000000052b7d2ull}}, // 10^26
{{0xdcc80cd2e4000000ull, 0x000000000052b7d2ull}}, // 10^26
{{0x9fd0803ce8000000ull, 0x00000000033b2e3cull}}, // 10^27
{{0x9fd0803ce8000000ull, 0x00000000033b2e3cull}}, // 10^27
{{0x9fd0803ce8000000ull, 0x00000000033b2e3cull}}, // 10^27
{{0x3e25026110000000ull, 0x00000000204fce5eull}}, // 10^28
{{0x3e25026110000000ull, 0x00000000204fce5eull}}, // 10^28
{{0x3e25026110000000ull, 0x00000000204fce5eull}}, // 10^28
{{0x3e25026110000000ull, 0x00000000204fce5eull}}, // 10^28
{{0x6d7217caa0000000ull, 0x00000001431e0faeull}}, // 10^29
{{0x6d7217caa0000000ull, 0x00000001431e0faeull}}, // 10^29
{{0x6d7217caa0000000ull, 0x00000001431e0faeull}}, // 10^29
{{0x4674edea40000000ull, 0x0000000c9f2c9cd0ull}}, // 10^30
{{0x4674edea40000000ull, 0x0000000c9f2c9cd0ull}}, // 10^30
{{0x4674edea40000000ull, 0x0000000c9f2c9cd0ull}}, // 10^30
{{0xc0914b2680000000ull, 0x0000007e37be2022ull}}, // 10^31
{{0xc0914b2680000000ull, 0x0000007e37be2022ull}}, // 10^31
{{0xc0914b2680000000ull, 0x0000007e37be2022ull}}, // 10^31
{{0x85acef8100000000ull, 0x000004ee2d6d415bull}}, // 10^32
{{0x85acef8100000000ull, 0x000004ee2d6d415bull}}, // 10^32
{{0x85acef8100000000ull, 0x000004ee2d6d415bull}}, // 10^32
{{0x85acef8100000000ull, 0x000004ee2d6d415bull}}, // 10^32
{{0x38c15b0a00000000ull, 0x0000314dc6448d93ull}}, // 10^33
{{0x38c15b0a00000000ull, 0x0000314dc6448d93ull}}, // 10^33
{{0x38c15b0a00000000ull, 0x0000314dc6448d93ull}}, // 10^33, entry 112
{{0x378d8e6400000000ull, 0x0001ed09bead87c0ull}}, // 10^34
{{0x378d8e6400000000ull, 0x0001ed09bead87c0ull}}, // 10^34
{{0x378d8e6400000000ull, 0x0001ed09bead87c0ull}}, // 10^34
{{0x2b878fe800000000ull, 0x0013426172c74d82ull}}, // 10^35
{{0x2b878fe800000000ull, 0x0013426172c74d82ull}}, // 10^35
{{0x2b878fe800000000ull, 0x0013426172c74d82ull}}, // 10^35
{{0x2b878fe800000000ull, 0x0013426172c74d82ull}}, // 10^35
{{0xb34b9f1000000000ull, 0x00c097ce7bc90715ull}}, // 10^36
{{0x00f436a000000000ull, 0x0785ee10d5da46d9ull}}, // 10^37
{{0x00f436a000000000ull, 0x0785ee10d5da46d9ull}}, // 10^37
{{0x00f436a000000000ull, 0x0785ee10d5da46d9ull}}, // 10^37
{{0x098a224000000000ull, 0x4b3b4ca85a86c47aull}}, // 10^38
{{0x098a224000000000ull, 0x4b3b4ca85a86c47aull}}, // 10^38
{{0x098a224000000000ull, 0x4b3b4ca85a86c47aull}}, // 10^38
{{0x098a224000000000ull, 0x4b3b4ca85a86c47aull}}, // 10^38
};