|
|
|
@ -229,6 +229,8 @@ struct FloatTraits<float> { |
|
|
|
|
//
|
|
|
|
|
// 2**63 <= Power10Mantissa(n) < 2**64.
|
|
|
|
|
//
|
|
|
|
|
// See the "Table of powers of 10" comment below for a "1e60" example.
|
|
|
|
|
//
|
|
|
|
|
// Lookups into the power-of-10 table must first check the Power10Overflow() and
|
|
|
|
|
// Power10Underflow() functions, to avoid out-of-bounds table access.
|
|
|
|
|
//
|
|
|
|
@ -236,7 +238,6 @@ struct FloatTraits<float> { |
|
|
|
|
// indexes range from kPower10TableMinInclusive to kPower10TableMaxExclusive.
|
|
|
|
|
extern const uint64_t kPower10MantissaHighTable[]; // High 64 of 128 bits.
|
|
|
|
|
extern const uint64_t kPower10MantissaLowTable[]; // Low 64 of 128 bits.
|
|
|
|
|
extern const int16_t kPower10ExponentTable[]; |
|
|
|
|
|
|
|
|
|
// The smallest (inclusive) allowed value for use with the Power10Mantissa()
|
|
|
|
|
// and Power10Exponent() functions below. (If a smaller exponent is needed in
|
|
|
|
@ -253,7 +254,11 @@ uint64_t Power10Mantissa(int n) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int Power10Exponent(int n) { |
|
|
|
|
return kPower10ExponentTable[n - kPower10TableMinInclusive]; |
|
|
|
|
// The 217706 etc magic numbers encode the results as a formula instead of a
|
|
|
|
|
// table. Their equivalence (over the kPower10TableMinInclusive ..
|
|
|
|
|
// kPower10TableMaxExclusive range) is confirmed by
|
|
|
|
|
// https://github.com/google/wuffs/blob/315b2e52625ebd7b02d8fac13e3cd85ea374fb80/script/print-mpb-powers-of-10.go
|
|
|
|
|
return (217706 * n >> 16) - 63; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Returns true if n is large enough that 10**n always results in an IEEE
|
|
|
|
@ -698,9 +703,7 @@ bool EiselLemire(const strings_internal::ParsedFloat& input, bool negative, |
|
|
|
|
// (+) Normalization.
|
|
|
|
|
int clz = countl_zero(man); |
|
|
|
|
man <<= static_cast<unsigned int>(clz); |
|
|
|
|
// The 217706 etc magic numbers encode the kPower10ExponentTable as a formula
|
|
|
|
|
// instead of a table. Their equivalence is confirmed by
|
|
|
|
|
// https://github.com/google/wuffs/blob/315b2e52625ebd7b02d8fac13e3cd85ea374fb80/script/print-mpb-powers-of-10.go
|
|
|
|
|
// The 217706 etc magic numbers are from the Power10Exponent function.
|
|
|
|
|
uint64_t ret_exp2 = |
|
|
|
|
static_cast<uint64_t>((217706 * exp10 >> 16) + 64 + |
|
|
|
|
FloatTraits<FloatType>::kExponentBias - clz); |
|
|
|
@ -935,13 +938,33 @@ namespace { |
|
|
|
|
// kPower10MantissaHighTable[i - kPower10TableMinInclusive] stores the 64-bit
|
|
|
|
|
// mantissa. The high bit is always on.
|
|
|
|
|
//
|
|
|
|
|
// kPower10ExponentTable[i - kPower10TableMinInclusive] stores the power-of-two
|
|
|
|
|
// exponent.
|
|
|
|
|
// kPower10MantissaLowTable extends that 64-bit mantissa to 128 bits.
|
|
|
|
|
//
|
|
|
|
|
// For a given number i, this gives the unique mantissa and exponent such that
|
|
|
|
|
// (mantissa * 2**exponent) <= 10**i < ((mantissa + 1) * 2**exponent).
|
|
|
|
|
// Power10Exponent(i) calculates the power-of-two exponent.
|
|
|
|
|
//
|
|
|
|
|
// kPower10MantissaLowTable extends that 64-bit mantissa to 128 bits.
|
|
|
|
|
// For a number i, this gives the unique mantissaHigh and exponent such that
|
|
|
|
|
// (mantissaHigh * 2**exponent) <= 10**i < ((mantissaHigh + 1) * 2**exponent).
|
|
|
|
|
//
|
|
|
|
|
// For example, Python can confirm that the exact hexadecimal value of 1e60 is:
|
|
|
|
|
// >>> a = 1000000000000000000000000000000000000000000000000000000000000
|
|
|
|
|
// >>> hex(a)
|
|
|
|
|
// '0x9f4f2726179a224501d762422c946590d91000000000000000'
|
|
|
|
|
// Adding underscores at every 8th hex digit shows 50 hex digits:
|
|
|
|
|
// '0x9f4f2726_179a2245_01d76242_2c946590_d9100000_00000000_00'.
|
|
|
|
|
// In this case, the high bit of the first hex digit, 9, is coincidentally set,
|
|
|
|
|
// so we do not have to do further shifting to deduce the 128-bit mantissa:
|
|
|
|
|
// - kPower10MantissaHighTable[60 - kP10TMI] = 0x9f4f2726179a2245U
|
|
|
|
|
// - kPower10MantissaLowTable[ 60 - kP10TMI] = 0x01d762422c946590U
|
|
|
|
|
// where kP10TMI is kPower10TableMinInclusive. The low 18 of those 50 hex
|
|
|
|
|
// digits are truncated.
|
|
|
|
|
//
|
|
|
|
|
// 50 hex digits (with the high bit set) is 200 bits and mantissaHigh holds 64
|
|
|
|
|
// bits, so Power10Exponent(60) = 200 - 64 = 136. Again, Python can confirm:
|
|
|
|
|
// >>> b = 0x9f4f2726179a2245
|
|
|
|
|
// >>> ((b+0)<<136) <= a
|
|
|
|
|
// True
|
|
|
|
|
// >>> ((b+1)<<136) <= a
|
|
|
|
|
// False
|
|
|
|
|
//
|
|
|
|
|
// The tables were generated by
|
|
|
|
|
// https://github.com/google/wuffs/blob/315b2e52625ebd7b02d8fac13e3cd85ea374fb80/script/print-mpb-powers-of-10.go
|
|
|
|
@ -1388,69 +1411,6 @@ const uint64_t kPower10MantissaLowTable[] = { |
|
|
|
|
0xe0133fe4adf8e952U, 0x58180fddd97723a6U, 0x570f09eaa7ea7648U, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
const int16_t kPower10ExponentTable[] = { |
|
|
|
|
-1200, -1196, -1193, -1190, -1186, -1183, -1180, -1176, -1173, -1170, -1166, |
|
|
|
|
-1163, -1160, -1156, -1153, -1150, -1146, -1143, -1140, -1136, -1133, -1130, |
|
|
|
|
-1127, -1123, -1120, -1117, -1113, -1110, -1107, -1103, -1100, -1097, -1093, |
|
|
|
|
-1090, -1087, -1083, -1080, -1077, -1073, -1070, -1067, -1063, -1060, -1057, |
|
|
|
|
-1053, -1050, -1047, -1043, -1040, -1037, -1034, -1030, -1027, -1024, -1020, |
|
|
|
|
-1017, -1014, -1010, -1007, -1004, -1000, -997, -994, -990, -987, -984, |
|
|
|
|
-980, -977, -974, -970, -967, -964, -960, -957, -954, -950, -947, |
|
|
|
|
-944, -940, -937, -934, -931, -927, -924, -921, -917, -914, -911, |
|
|
|
|
-907, -904, -901, -897, -894, -891, -887, -884, -881, -877, -874, |
|
|
|
|
-871, -867, -864, -861, -857, -854, -851, -847, -844, -841, -838, |
|
|
|
|
-834, -831, -828, -824, -821, -818, -814, -811, -808, -804, -801, |
|
|
|
|
-798, -794, -791, -788, -784, -781, -778, -774, -771, -768, -764, |
|
|
|
|
-761, -758, -754, -751, -748, -744, -741, -738, -735, -731, -728, |
|
|
|
|
-725, -721, -718, -715, -711, -708, -705, -701, -698, -695, -691, |
|
|
|
|
-688, -685, -681, -678, -675, -671, -668, -665, -661, -658, -655, |
|
|
|
|
-651, -648, -645, -642, -638, -635, -632, -628, -625, -622, -618, |
|
|
|
|
-615, -612, -608, -605, -602, -598, -595, -592, -588, -585, -582, |
|
|
|
|
-578, -575, -572, -568, -565, -562, -558, -555, -552, -549, -545, |
|
|
|
|
-542, -539, -535, -532, -529, -525, -522, -519, -515, -512, -509, |
|
|
|
|
-505, -502, -499, -495, -492, -489, -485, -482, -479, -475, -472, |
|
|
|
|
-469, -465, -462, -459, -455, -452, -449, -446, -442, -439, -436, |
|
|
|
|
-432, -429, -426, -422, -419, -416, -412, -409, -406, -402, -399, |
|
|
|
|
-396, -392, -389, -386, -382, -379, -376, -372, -369, -366, -362, |
|
|
|
|
-359, -356, -353, -349, -346, -343, -339, -336, -333, -329, -326, |
|
|
|
|
-323, -319, -316, -313, -309, -306, -303, -299, -296, -293, -289, |
|
|
|
|
-286, -283, -279, -276, -273, -269, -266, -263, -259, -256, -253, |
|
|
|
|
-250, -246, -243, -240, -236, -233, -230, -226, -223, -220, -216, |
|
|
|
|
-213, -210, -206, -203, -200, -196, -193, -190, -186, -183, -180, |
|
|
|
|
-176, -173, -170, -166, -163, -160, -157, -153, -150, -147, -143, |
|
|
|
|
-140, -137, -133, -130, -127, -123, -120, -117, -113, -110, -107, |
|
|
|
|
-103, -100, -97, -93, -90, -87, -83, -80, -77, -73, -70, |
|
|
|
|
-67, -63, -60, -57, -54, -50, -47, -44, -40, -37, -34, |
|
|
|
|
-30, -27, -24, -20, -17, -14, -10, -7, -4, 0, 3, |
|
|
|
|
6, 10, 13, 16, 20, 23, 26, 30, 33, 36, 39, |
|
|
|
|
43, 46, 49, 53, 56, 59, 63, 66, 69, 73, 76, |
|
|
|
|
79, 83, 86, 89, 93, 96, 99, 103, 106, 109, 113, |
|
|
|
|
116, 119, 123, 126, 129, 132, 136, 139, 142, 146, 149, |
|
|
|
|
152, 156, 159, 162, 166, 169, 172, 176, 179, 182, 186, |
|
|
|
|
189, 192, 196, 199, 202, 206, 209, 212, 216, 219, 222, |
|
|
|
|
226, 229, 232, 235, 239, 242, 245, 249, 252, 255, 259, |
|
|
|
|
262, 265, 269, 272, 275, 279, 282, 285, 289, 292, 295, |
|
|
|
|
299, 302, 305, 309, 312, 315, 319, 322, 325, 328, 332, |
|
|
|
|
335, 338, 342, 345, 348, 352, 355, 358, 362, 365, 368, |
|
|
|
|
372, 375, 378, 382, 385, 388, 392, 395, 398, 402, 405, |
|
|
|
|
408, 412, 415, 418, 422, 425, 428, 431, 435, 438, 441, |
|
|
|
|
445, 448, 451, 455, 458, 461, 465, 468, 471, 475, 478, |
|
|
|
|
481, 485, 488, 491, 495, 498, 501, 505, 508, 511, 515, |
|
|
|
|
518, 521, 524, 528, 531, 534, 538, 541, 544, 548, 551, |
|
|
|
|
554, 558, 561, 564, 568, 571, 574, 578, 581, 584, 588, |
|
|
|
|
591, 594, 598, 601, 604, 608, 611, 614, 617, 621, 624, |
|
|
|
|
627, 631, 634, 637, 641, 644, 647, 651, 654, 657, 661, |
|
|
|
|
664, 667, 671, 674, 677, 681, 684, 687, 691, 694, 697, |
|
|
|
|
701, 704, 707, 711, 714, 717, 720, 724, 727, 730, 734, |
|
|
|
|
737, 740, 744, 747, 750, 754, 757, 760, 764, 767, 770, |
|
|
|
|
774, 777, 780, 784, 787, 790, 794, 797, 800, 804, 807, |
|
|
|
|
810, 813, 817, 820, 823, 827, 830, 833, 837, 840, 843, |
|
|
|
|
847, 850, 853, 857, 860, 863, 867, 870, 873, 877, 880, |
|
|
|
|
883, 887, 890, 893, 897, 900, 903, 907, 910, 913, 916, |
|
|
|
|
920, 923, 926, 930, 933, 936, 940, 943, 946, 950, 953, |
|
|
|
|
956, 960, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
ABSL_NAMESPACE_END |
|
|
|
|
} // namespace absl
|
|
|
|
|