|
@@ -38,13 +38,13 @@ namespace Jint.Native.Number.Dtoa
|
|
|
|
|
|
private class CachedPower
|
|
private class CachedPower
|
|
{
|
|
{
|
|
- internal readonly long Significand;
|
|
|
|
|
|
+ internal readonly ulong Significand;
|
|
internal readonly short BinaryExponent;
|
|
internal readonly short BinaryExponent;
|
|
internal readonly short DecimalExponent;
|
|
internal readonly short DecimalExponent;
|
|
|
|
|
|
internal CachedPower(ulong significand, short binaryExponent, short decimalExponent)
|
|
internal CachedPower(ulong significand, short binaryExponent, short decimalExponent)
|
|
{
|
|
{
|
|
- Significand = (long) significand;
|
|
|
|
|
|
+ Significand = significand;
|
|
BinaryExponent = binaryExponent;
|
|
BinaryExponent = binaryExponent;
|
|
DecimalExponent = decimalExponent;
|
|
DecimalExponent = decimalExponent;
|
|
}
|
|
}
|
|
@@ -62,15 +62,19 @@ namespace Jint.Native.Number.Dtoa
|
|
internal readonly DiyFp cMk;
|
|
internal readonly DiyFp cMk;
|
|
}
|
|
}
|
|
|
|
|
|
- internal static GetCachedPowerResult GetCachedPower(int e, int alpha, int gamma)
|
|
|
|
|
|
+ internal static GetCachedPowerResult GetCachedPowerForBinaryExponentRange(int min_exponent, int max_exponent)
|
|
{
|
|
{
|
|
const int kQ = DiyFp.KSignificandSize;
|
|
const int kQ = DiyFp.KSignificandSize;
|
|
- double k = System.Math.Ceiling((alpha - e + kQ - 1) * Kd1Log210);
|
|
|
|
- int index = (GrisuCacheOffset + (int) k - 1) / CachedPowersSpacing + 1;
|
|
|
|
|
|
+ double k = System.Math.Ceiling((min_exponent + kQ - 1) * Kd1Log210);
|
|
|
|
+ int foo = kCachedPowersOffset;
|
|
|
|
+ int index =
|
|
|
|
+ (foo + (int) k - 1) / kDecimalExponentDistance + 1;
|
|
|
|
+ Debug.Assert(0 <= index && index < CACHED_POWERS.Length);
|
|
CachedPower cachedPower = CACHED_POWERS[index];
|
|
CachedPower cachedPower = CACHED_POWERS[index];
|
|
|
|
+ Debug.Assert(min_exponent <= cachedPower.BinaryExponent);
|
|
|
|
+ Debug.Assert(cachedPower.BinaryExponent <= max_exponent);
|
|
|
|
|
|
var cMk = new DiyFp(cachedPower.Significand, cachedPower.BinaryExponent);
|
|
var cMk = new DiyFp(cachedPower.Significand, cachedPower.BinaryExponent);
|
|
- Debug.Assert((alpha <= cMk.E + e) && (cMk.E + e <= gamma));
|
|
|
|
return new GetCachedPowerResult(cachedPower.DecimalExponent, cMk);
|
|
return new GetCachedPowerResult(cachedPower.DecimalExponent, cMk);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -78,95 +82,100 @@ namespace Jint.Native.Number.Dtoa
|
|
// Regexp to convert this from original C++ source:
|
|
// Regexp to convert this from original C++ source:
|
|
// \{GRISU_UINT64_C\((\w+), (\w+)\), (\-?\d+), (\-?\d+)\}
|
|
// \{GRISU_UINT64_C\((\w+), (\w+)\), (\-?\d+), (\-?\d+)\}
|
|
|
|
|
|
- // interval between entries of the powers cache below
|
|
|
|
- private const int CachedPowersSpacing = 8;
|
|
|
|
-
|
|
|
|
private static readonly CachedPower[] CACHED_POWERS =
|
|
private static readonly CachedPower[] CACHED_POWERS =
|
|
{
|
|
{
|
|
- new CachedPower(0xe61acf033d1a45dfL, -1087, -308),
|
|
|
|
- new CachedPower(0xab70fe17c79ac6caL, -1060, -300),
|
|
|
|
- new CachedPower(0xff77b1fcbebcdc4fL, -1034, -292),
|
|
|
|
- new CachedPower(0xbe5691ef416bd60cL, -1007, -284),
|
|
|
|
- new CachedPower(0x8dd01fad907ffc3cL, -980, -276),
|
|
|
|
- new CachedPower(0xd3515c2831559a83L, -954, -268),
|
|
|
|
- new CachedPower(0x9d71ac8fada6c9b5L, -927, -260),
|
|
|
|
- new CachedPower(0xea9c227723ee8bcbL, -901, -252),
|
|
|
|
- new CachedPower(0xaecc49914078536dL, -874, -244),
|
|
|
|
- new CachedPower(0x823c12795db6ce57L, -847, -236),
|
|
|
|
- new CachedPower(0xc21094364dfb5637L, -821, -228),
|
|
|
|
- new CachedPower(0x9096ea6f3848984fL, -794, -220),
|
|
|
|
- new CachedPower(0xd77485cb25823ac7L, -768, -212),
|
|
|
|
- new CachedPower(0xa086cfcd97bf97f4L, -741, -204),
|
|
|
|
- new CachedPower(0xef340a98172aace5L, -715, -196),
|
|
|
|
- new CachedPower(0xb23867fb2a35b28eL, -688, -188),
|
|
|
|
- new CachedPower(0x84c8d4dfd2c63f3bL, -661, -180),
|
|
|
|
- new CachedPower(0xc5dd44271ad3cdbaL, -635, -172),
|
|
|
|
- new CachedPower(0x936b9fcebb25c996L, -608, -164),
|
|
|
|
- new CachedPower(0xdbac6c247d62a584L, -582, -156),
|
|
|
|
- new CachedPower(0xa3ab66580d5fdaf6L, -555, -148),
|
|
|
|
- new CachedPower(0xf3e2f893dec3f126L, -529, -140),
|
|
|
|
- new CachedPower(0xb5b5ada8aaff80b8L, -502, -132),
|
|
|
|
- new CachedPower(0x87625f056c7c4a8bL, -475, -124),
|
|
|
|
- new CachedPower(0xc9bcff6034c13053L, -449, -116),
|
|
|
|
- new CachedPower(0x964e858c91ba2655L, -422, -108),
|
|
|
|
- new CachedPower(0xdff9772470297ebdL, -396, -100),
|
|
|
|
- new CachedPower(0xa6dfbd9fb8e5b88fL, -369, -92),
|
|
|
|
- new CachedPower(0xf8a95fcf88747d94L, -343, -84),
|
|
|
|
- new CachedPower(0xb94470938fa89bcfL, -316, -76),
|
|
|
|
- new CachedPower(0x8a08f0f8bf0f156bL, -289, -68),
|
|
|
|
- new CachedPower(0xcdb02555653131b6L, -263, -60),
|
|
|
|
- new CachedPower(0x993fe2c6d07b7facL, -236, -52),
|
|
|
|
- new CachedPower(0xe45c10c42a2b3b06L, -210, -44),
|
|
|
|
- new CachedPower(0xaa242499697392d3L, -183, -36),
|
|
|
|
- new CachedPower(0xfd87b5f28300ca0eL, -157, -28),
|
|
|
|
- new CachedPower(0xbce5086492111aebL, -130, -20),
|
|
|
|
- new CachedPower(0x8cbccc096f5088ccL, -103, -12),
|
|
|
|
- new CachedPower(0xd1b71758e219652cL, -77, -4),
|
|
|
|
- new CachedPower(0x9c40000000000000L, -50, 4),
|
|
|
|
- new CachedPower(0xe8d4a51000000000L, -24, 12),
|
|
|
|
- new CachedPower(0xad78ebc5ac620000L, 3, 20),
|
|
|
|
- new CachedPower(0x813f3978f8940984L, 30, 28),
|
|
|
|
- new CachedPower(0xc097ce7bc90715b3L, 56, 36),
|
|
|
|
- new CachedPower(0x8f7e32ce7bea5c70L, 83, 44),
|
|
|
|
- new CachedPower(0xd5d238a4abe98068L, 109, 52),
|
|
|
|
- new CachedPower(0x9f4f2726179a2245L, 136, 60),
|
|
|
|
- new CachedPower(0xed63a231d4c4fb27L, 162, 68),
|
|
|
|
- new CachedPower(0xb0de65388cc8ada8L, 189, 76),
|
|
|
|
- new CachedPower(0x83c7088e1aab65dbL, 216, 84),
|
|
|
|
- new CachedPower(0xc45d1df942711d9aL, 242, 92),
|
|
|
|
- new CachedPower(0x924d692ca61be758L, 269, 100),
|
|
|
|
- new CachedPower(0xda01ee641a708deaL, 295, 108),
|
|
|
|
- new CachedPower(0xa26da3999aef774aL, 322, 116),
|
|
|
|
- new CachedPower(0xf209787bb47d6b85L, 348, 124),
|
|
|
|
- new CachedPower(0xb454e4a179dd1877L, 375, 132),
|
|
|
|
- new CachedPower(0x865b86925b9bc5c2L, 402, 140),
|
|
|
|
- new CachedPower(0xc83553c5c8965d3dL, 428, 148),
|
|
|
|
- new CachedPower(0x952ab45cfa97a0b3L, 455, 156),
|
|
|
|
- new CachedPower(0xde469fbd99a05fe3L, 481, 164),
|
|
|
|
- new CachedPower(0xa59bc234db398c25L, 508, 172),
|
|
|
|
- new CachedPower(0xf6c69a72a3989f5cL, 534, 180),
|
|
|
|
- new CachedPower(0xb7dcbf5354e9beceL, 561, 188),
|
|
|
|
- new CachedPower(0x88fcf317f22241e2L, 588, 196),
|
|
|
|
- new CachedPower(0xcc20ce9bd35c78a5L, 614, 204),
|
|
|
|
- new CachedPower(0x98165af37b2153dfL, 641, 212),
|
|
|
|
- new CachedPower(0xe2a0b5dc971f303aL, 667, 220),
|
|
|
|
- new CachedPower(0xa8d9d1535ce3b396L, 694, 228),
|
|
|
|
- new CachedPower(0xfb9b7cd9a4a7443cL, 720, 236),
|
|
|
|
- new CachedPower(0xbb764c4ca7a44410L, 747, 244),
|
|
|
|
- new CachedPower(0x8bab8eefb6409c1aL, 774, 252),
|
|
|
|
- new CachedPower(0xd01fef10a657842cL, 800, 260),
|
|
|
|
- new CachedPower(0x9b10a4e5e9913129L, 827, 268),
|
|
|
|
- new CachedPower(0xe7109bfba19c0c9dL, 853, 276),
|
|
|
|
- new CachedPower(0xac2820d9623bf429L, 880, 284),
|
|
|
|
- new CachedPower(0x80444b5e7aa7cf85L, 907, 292),
|
|
|
|
- new CachedPower(0xbf21e44003acdd2dL, 933, 300),
|
|
|
|
- new CachedPower(0x8e679c2f5e44ff8fL, 960, 308),
|
|
|
|
- new CachedPower(0xd433179d9c8cb841L, 986, 316),
|
|
|
|
- new CachedPower(0x9e19db92b4e31ba9L, 1013, 324),
|
|
|
|
- new CachedPower(0xeb96bf6ebadf77d9L, 1039, 332),
|
|
|
|
- new CachedPower(0xaf87023b9bf0ee6bL, 1066, 340)
|
|
|
|
|
|
+ new CachedPower(0xFA8FD5A0081C0288, -1220, -348),
|
|
|
|
+ new CachedPower(0xBAAEE17FA23EBF76, -1193, -340),
|
|
|
|
+ new CachedPower(0x8B16FB203055AC76, -1166, -332),
|
|
|
|
+ new CachedPower(0xCF42894A5DCE35EA, -1140, -324),
|
|
|
|
+ new CachedPower(0x9A6BB0AA55653B2D, -1113, -316),
|
|
|
|
+ new CachedPower(0xE61ACF033D1A45DF, -1087, -308),
|
|
|
|
+ new CachedPower(0xAB70FE17C79AC6CA, -1060, -300),
|
|
|
|
+ new CachedPower(0xFF77B1FCBEBCDC4F, -1034, -292),
|
|
|
|
+ new CachedPower(0xBE5691EF416BD60C, -1007, -284),
|
|
|
|
+ new CachedPower(0x8DD01FAD907FFC3C, -980, -276),
|
|
|
|
+ new CachedPower(0xD3515C2831559A83, -954, -268),
|
|
|
|
+ new CachedPower(0x9D71AC8FADA6C9B5, -927, -260),
|
|
|
|
+ new CachedPower(0xEA9C227723EE8BCB, -901, -252),
|
|
|
|
+ new CachedPower(0xAECC49914078536D, -874, -244),
|
|
|
|
+ new CachedPower(0x823C12795DB6CE57, -847, -236),
|
|
|
|
+ new CachedPower(0xC21094364DFB5637, -821, -228),
|
|
|
|
+ new CachedPower(0x9096EA6F3848984F, -794, -220),
|
|
|
|
+ new CachedPower(0xD77485CB25823AC7, -768, -212),
|
|
|
|
+ new CachedPower(0xA086CFCD97BF97F4, -741, -204),
|
|
|
|
+ new CachedPower(0xEF340A98172AACE5, -715, -196),
|
|
|
|
+ new CachedPower(0xB23867FB2A35B28E, -688, -188),
|
|
|
|
+ new CachedPower(0x84C8D4DFD2C63F3B, -661, -180),
|
|
|
|
+ new CachedPower(0xC5DD44271AD3CDBA, -635, -172),
|
|
|
|
+ new CachedPower(0x936B9FCEBB25C996, -608, -164),
|
|
|
|
+ new CachedPower(0xDBAC6C247D62A584, -582, -156),
|
|
|
|
+ new CachedPower(0xA3AB66580D5FDAF6, -555, -148),
|
|
|
|
+ new CachedPower(0xF3E2F893DEC3F126, -529, -140),
|
|
|
|
+ new CachedPower(0xB5B5ADA8AAFF80B8, -502, -132),
|
|
|
|
+ new CachedPower(0x87625F056C7C4A8B, -475, -124),
|
|
|
|
+ new CachedPower(0xC9BCFF6034C13053, -449, -116),
|
|
|
|
+ new CachedPower(0x964E858C91BA2655, -422, -108),
|
|
|
|
+ new CachedPower(0xDFF9772470297EBD, -396, -100),
|
|
|
|
+ new CachedPower(0xA6DFBD9FB8E5B88F, -369, -92),
|
|
|
|
+ new CachedPower(0xF8A95FCF88747D94, -343, -84),
|
|
|
|
+ new CachedPower(0xB94470938FA89BCF, -316, -76),
|
|
|
|
+ new CachedPower(0x8A08F0F8BF0F156B, -289, -68),
|
|
|
|
+ new CachedPower(0xCDB02555653131B6, -263, -60),
|
|
|
|
+ new CachedPower(0x993FE2C6D07B7FAC, -236, -52),
|
|
|
|
+ new CachedPower(0xE45C10C42A2B3B06, -210, -44),
|
|
|
|
+ new CachedPower(0xAA242499697392D3, -183, -36),
|
|
|
|
+ new CachedPower(0xFD87B5F28300CA0E, -157, -28),
|
|
|
|
+ new CachedPower(0xBCE5086492111AEB, -130, -20),
|
|
|
|
+ new CachedPower(0x8CBCCC096F5088CC, -103, -12),
|
|
|
|
+ new CachedPower(0xD1B71758E219652C, -77, -4),
|
|
|
|
+ new CachedPower(0x9C40000000000000, -50, 4),
|
|
|
|
+ new CachedPower(0xE8D4A51000000000, -24, 12),
|
|
|
|
+ new CachedPower(0xAD78EBC5AC620000, 3, 20),
|
|
|
|
+ new CachedPower(0x813F3978F8940984, 30, 28),
|
|
|
|
+ new CachedPower(0xC097CE7BC90715B3, 56, 36),
|
|
|
|
+ new CachedPower(0x8F7E32CE7BEA5C70, 83, 44),
|
|
|
|
+ new CachedPower(0xD5D238A4ABE98068, 109, 52),
|
|
|
|
+ new CachedPower(0x9F4F2726179A2245, 136, 60),
|
|
|
|
+ new CachedPower(0xED63A231D4C4FB27, 162, 68),
|
|
|
|
+ new CachedPower(0xB0DE65388CC8ADA8, 189, 76),
|
|
|
|
+ new CachedPower(0x83C7088E1AAB65DB, 216, 84),
|
|
|
|
+ new CachedPower(0xC45D1DF942711D9A, 242, 92),
|
|
|
|
+ new CachedPower(0x924D692CA61BE758, 269, 100),
|
|
|
|
+ new CachedPower(0xDA01EE641A708DEA, 295, 108),
|
|
|
|
+ new CachedPower(0xA26DA3999AEF774A, 322, 116),
|
|
|
|
+ new CachedPower(0xF209787BB47D6B85, 348, 124),
|
|
|
|
+ new CachedPower(0xB454E4A179DD1877, 375, 132),
|
|
|
|
+ new CachedPower(0x865B86925B9BC5C2, 402, 140),
|
|
|
|
+ new CachedPower(0xC83553C5C8965D3D, 428, 148),
|
|
|
|
+ new CachedPower(0x952AB45CFA97A0B3, 455, 156),
|
|
|
|
+ new CachedPower(0xDE469FBD99A05FE3, 481, 164),
|
|
|
|
+ new CachedPower(0xA59BC234DB398C25, 508, 172),
|
|
|
|
+ new CachedPower(0xF6C69A72A3989F5C, 534, 180),
|
|
|
|
+ new CachedPower(0xB7DCBF5354E9BECE, 561, 188),
|
|
|
|
+ new CachedPower(0x88FCF317F22241E2, 588, 196),
|
|
|
|
+ new CachedPower(0xCC20CE9BD35C78A5, 614, 204),
|
|
|
|
+ new CachedPower(0x98165AF37B2153DF, 641, 212),
|
|
|
|
+ new CachedPower(0xE2A0B5DC971F303A, 667, 220),
|
|
|
|
+ new CachedPower(0xA8D9D1535CE3B396, 694, 228),
|
|
|
|
+ new CachedPower(0xFB9B7CD9A4A7443C, 720, 236),
|
|
|
|
+ new CachedPower(0xBB764C4CA7A44410, 747, 244),
|
|
|
|
+ new CachedPower(0x8BAB8EEFB6409C1A, 774, 252),
|
|
|
|
+ new CachedPower(0xD01FEF10A657842C, 800, 260),
|
|
|
|
+ new CachedPower(0x9B10A4E5E9913129, 827, 268),
|
|
|
|
+ new CachedPower(0xE7109BFBA19C0C9D, 853, 276),
|
|
|
|
+ new CachedPower(0xAC2820D9623BF429, 880, 284),
|
|
|
|
+ new CachedPower(0x80444B5E7AA7CF85, 907, 292),
|
|
|
|
+ new CachedPower(0xBF21E44003ACDD2D, 933, 300),
|
|
|
|
+ new CachedPower(0x8E679C2F5E44FF8F, 960, 308),
|
|
|
|
+ new CachedPower(0xD433179D9C8CB841, 986, 316),
|
|
|
|
+ new CachedPower(0x9E19DB92B4E31BA9, 1013, 324),
|
|
|
|
+ new CachedPower(0xEB96BF6EBADF77D9, 1039, 332),
|
|
|
|
+ new CachedPower(0xAF87023B9BF0EE6B, 1066, 340)
|
|
};
|
|
};
|
|
|
|
|
|
- private const int GrisuCacheOffset = 308;
|
|
|
|
|
|
+ const int kCachedPowersOffset = 348; // -1 * the first decimal_exponent.
|
|
|
|
+ const int kDecimalExponentDistance = 8;
|
|
|
|
+ const int kMinDecimalExponent = -348;
|
|
|
|
+ const int kMaxDecimalExponent = 340;
|
|
}
|
|
}
|
|
}
|
|
}
|