github.com/swiftstack/ProxyFS@v0.0.0-20210203235616-4017c267d62f/bucketstats/tables.go (about)

     1  // Copyright (c) 2015-2021, NVIDIA CORPORATION.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  // The bucketstats Package implements convenient, easy to use, bucketized
     5  // statistics.
     6  
     7  package bucketstats
     8  
     9  import (
    10  	"fmt"
    11  	"math"
    12  	"math/big"
    13  )
    14  
    15  // Tables for bucketized statistics and the code to generate them.  These tables
    16  // map values to bucket indexes and inversely map bucket indexes to the range of
    17  // values they hold.
    18  
    19  // generate the tables for BucketStatsLogRoot2
    20  //
    21  func genLogRoot2Table() {
    22  
    23  	logRoot2Index := func(val int) (logRoot2_x float64, idx uint) {
    24  
    25  		logRoot2_x = math.Log(float64(val)) / math.Log(math.Sqrt(2))
    26  		if logRoot2_x < 0 {
    27  			idx = 0
    28  		} else if logRoot2_x == 0 {
    29  			idx = 1
    30  		} else {
    31  			// other values are rounded to the nearest bucket
    32  			idx = uint(math.Round(logRoot2_x))
    33  		}
    34  		return
    35  	}
    36  
    37  	genIdxTable("logRoot2RoundIdxTable", logRoot2Index)
    38  	fmt.Printf("\n")
    39  	genBucketTable("logRoot2RoundBucketTable", logRoot2Index, 128, 2)
    40  	fmt.Printf("\n")
    41  }
    42  
    43  // generate the tables for BucketStatsLog2
    44  //
    45  func genLog2Table() {
    46  
    47  	log2Index := func(val int) (log2_x float64, idx uint) {
    48  
    49  		log2_x = math.Log(float64(val)) / math.Log(2)
    50  		if log2_x < 0 {
    51  			idx = 0
    52  		} else {
    53  			// other values are shifted by 1 bucket
    54  			idx = uint(math.Round(log2_x)) + 1
    55  		}
    56  		return
    57  	}
    58  
    59  	genIdxTable("log2RoundIdxTable", log2Index)
    60  	fmt.Printf("\n")
    61  	genBucketTable("log2RoundBucketTable", log2Index, 65, 1)
    62  	fmt.Printf("\n")
    63  }
    64  
    65  // Generate go code for an array mapping the integers 0 .. 255 to an bucket
    66  // (index) in a bucketStats array.
    67  //
    68  // indexFunc() is either our tweaked version of log2(x) or logRoot2(x) with
    69  // float64 being the actual value and int being the bucket index its mapped
    70  // to.
    71  //
    72  func genIdxTable(name string, indexFunc func(int) (float64, uint)) {
    73  	var (
    74  		indent  int = 8
    75  		columns int = 16
    76  	)
    77  
    78  	fmt.Printf("var %s = [256]uint8{\n", name)
    79  	for i := 0; i < 256; i += columns {
    80  
    81  		// print a line with the actual values
    82  		fmt.Printf("%*s//", indent, "")
    83  		for j := 0; j < columns; j += 1 {
    84  			// log_x, idx := indexFunc(i + j)
    85  			fmt.Printf(" %4d", i+j)
    86  		}
    87  		fmt.Printf("\n")
    88  
    89  		// print a line with the actual log_2(x) values
    90  		fmt.Printf("%*s//", indent, "")
    91  		for j := 0; j < columns; j += 1 {
    92  			log_x, _ := indexFunc(i + j)
    93  			fmt.Printf(" %4.1f", log_x)
    94  			// fmt.Printf(" %3.0f", i+j)
    95  		}
    96  		fmt.Printf("\n")
    97  		// fmt.Printf("%*s// log_2(%d .. %d)\n", indent, "", int(i), int(i+columns-1))
    98  
    99  		// print a line with the corresponding decimal value
   100  		// fmt.Printf("%*s ", indent, "")
   101  		fmt.Printf("%*s ", indent, "")
   102  		for j := 0; j < columns; j += 1 {
   103  			_, idx := indexFunc(i + j)
   104  			fmt.Printf(" %3d,", idx)
   105  		}
   106  		fmt.Printf("\n")
   107  		fmt.Printf("\n")
   108  	}
   109  	fmt.Printf("    }\n")
   110  }
   111  
   112  // Generate go code for an array mapping the indexes of a bucketized statistic
   113  // array to the corresponding BucketInfo.
   114  //
   115  // indexFunc() is either our tweaked version of log2(x) or logRoot2(x) for the
   116  // table with float64 being the actual value and int being the bucket index its
   117  // mapped to.
   118  //
   119  func genBucketTable(name string, indexFunc func(int) (float64, uint),
   120  	nBucket uint, bucketsPerBit uint) {
   121  
   122  	var (
   123  		indent int = 8
   124  	)
   125  
   126  	if bucketsPerBit != 1 && bucketsPerBit != 2 {
   127  		panic(fmt.Sprintf("genBucketTable(): bucketsPerBit must be 1 or 2: bucketsPerBit %d", bucketsPerBit))
   128  	}
   129  
   130  	// create the same array that genIdxTable creates, but extend it to
   131  	// 9 bits so we can walk the value of 255 upto the next index change
   132  	var idxTable [512]uint
   133  	for i := 0; i < 256; i += 1 {
   134  		_, idxTable[i] = indexFunc(i)
   135  	}
   136  	for i := 256; i < 512; i += 1 {
   137  		idxTable[i] = idxTable[i>>1] + 1
   138  	}
   139  
   140  	fmt.Printf("var %s = [%d]BucketInfo {\n", name, nBucket)
   141  	fmt.Printf("%*s/*0*/ { RangeLow: 0, RangeHigh: 0, NominalVal: 0, MeanVal: 0 },\n",
   142  		indent, "")
   143  
   144  	// compute and print BucketInfo for the other buckets
   145  	var rangeHigh uint64 = 0
   146  	for i := uint(1); i < nBucket; i += 1 {
   147  
   148  		// start right after the previous entry
   149  		rangeLow := rangeHigh + 1
   150  
   151  		// calculate the nominal value of this bucket; use exponent (i - 1)
   152  		// because bucket 0 is used for 0 and that causes subsequent
   153  		// indexes to be offset for all the log base 2 buckets, but with
   154  		// log base sqrt(2) buckets the indexes eventually converge
   155  		var nominal uint64
   156  		if bucketsPerBit == 1 {
   157  			nominal = uint64(1) << (i - 1)
   158  		} else {
   159  			nominal = powRoot2(i)
   160  		}
   161  
   162  		// the value for rangeHigh is one less then the value that maps
   163  		// to a new index
   164  		var (
   165  			idxOffset     uint   = 0
   166  			scaledNominal uint64 = nominal
   167  		)
   168  		for scaledNominal >= 256 {
   169  			scaledNominal >>= 1
   170  			idxOffset += bucketsPerBit
   171  		}
   172  		if idxTable[scaledNominal] != i-idxOffset {
   173  			panic(fmt.Sprintf("idxTable[%d] (%d) != i (%d) - idxOffset (%d)",
   174  				scaledNominal, idxTable[scaledNominal], i, idxOffset))
   175  		}
   176  
   177  		curIdx := idxTable[scaledNominal]
   178  		nextVal := scaledNominal
   179  		for ; idxTable[nextVal] == curIdx; nextVal += 1 {
   180  		}
   181  		rangeHigh = (nextVal << (idxOffset / bucketsPerBit)) - 1
   182  
   183  		// if this is the last bucket then rangeHigh is the end of the
   184  		// range
   185  		if i == nBucket-1 {
   186  			rangeHigh = (1 << 64) - 1
   187  		}
   188  
   189  		// calculate meanVal; use big.Int because it may overflow
   190  		var bigMeanVal, tmpInt big.Int
   191  		bigMeanVal.SetUint64(rangeHigh)
   192  		tmpInt.SetUint64(rangeLow)
   193  		bigMeanVal.Add(&bigMeanVal, &tmpInt)
   194  		tmpInt.SetUint64(2)
   195  		bigMeanVal.Div(&bigMeanVal, &tmpInt)
   196  		meanVal := bigMeanVal.Uint64()
   197  
   198  		if nominal < 1<<40 {
   199  			fmt.Printf("%*s/*%d*/ { RangeLow: %d, RangeHigh: %d, NominalVal: %d, MeanVal: %d },\n",
   200  				indent, "", i, rangeLow, rangeHigh, nominal, meanVal)
   201  		} else {
   202  			fmt.Printf("%*s/*%d*/ { RangeLow: %d, RangeHigh: %d,\n", indent, "", i, rangeLow, rangeHigh)
   203  			fmt.Printf("%*sNominalVal: %d, MeanVal: %d },\n",
   204  				indent*2, "", nominal, meanVal)
   205  		}
   206  	}
   207  	fmt.Printf("}\n")
   208  }
   209  
   210  // Compute round(sqrt(2)^n) for 0 <= n < 128 and return as a uint64 accurate in
   211  // all 64 bits.
   212  //
   213  func powRoot2(n uint) (pow64 uint64) {
   214  	var (
   215  		bigBase  big.Float
   216  		bigPow   big.Float
   217  		bigFudge big.Float
   218  	)
   219  	bigBase.SetPrec(128)
   220  	bigBase.SetInt64(2)
   221  	bigBase.Sqrt(&bigBase)
   222  
   223  	bigPow.SetPrec(128)
   224  	bigPow.SetInt64(1)
   225  	for i := uint(1); i <= n; i++ {
   226  		bigPow.Mul(&bigPow, &bigBase)
   227  	}
   228  
   229  	// bigPow.Uint64() rounds by truncating toward zero so add 0.500 to get
   230  	// the effect of rounding to the nearest value
   231  	bigFudge.SetFloat64(0.5)
   232  	bigPow.Add(&bigPow, &bigFudge)
   233  	pow64, _ = bigPow.Uint64()
   234  	return
   235  }
   236  
   237  // print a list of which bucket the first 256 values go in and the average
   238  // value represented by the bucket
   239  //
   240  func showDistr(bucketTable []uint8) {
   241  
   242  	// track info for each bucket
   243  	firstVal := make([]int, 17)
   244  	lastVal := make([]int, 17)
   245  	total := make([]int, 17)
   246  	var lastIdx uint8
   247  
   248  	for i := 0; i < 256; i += 1 {
   249  		idx := bucketTable[i]
   250  		if firstVal[idx] == 0 {
   251  			firstVal[idx] = i
   252  		}
   253  		total[idx] += i
   254  		lastVal[idx] = i
   255  		lastIdx = idx
   256  	}
   257  
   258  	// don't print the last bucket because the range and average is wrong (capped at 255)
   259  	for i := uint8(0); i < lastIdx-1; i += 1 {
   260  		fmt.Printf("Bucket %2d: %3d..%3d  Average %5.1f\n",
   261  			i, firstVal[i], lastVal[i], float64(total[i])/float64((lastVal[i]-firstVal[i]+1)))
   262  	}
   263  	fmt.Printf("\n")
   264  }
   265  
   266  /*
   267   * -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   268   * Everything below this line is (manually) auto-generated by running genLog2Table()
   269   * genLogRoot2Table(), except for the comment, which is preserved by hand.
   270   *
   271   * If you want to change the tables, change the routines that generate them.
   272   * -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   273   */
   274  
   275  // Tables for the computation of log base 2 and log base sqrt(2) for 0 .. 255,
   276  // rounded to the nearest integar, for use as indices into a statistics buckets.
   277  //
   278  // Note that in both tables the entry for 0 is 0 (instead of -Inf) and the entry
   279  // for 1 is 1 (instead of 0).  This means the tables differentiate between
   280  // adding 0 and 1 to a bucketized statistic and precisely track the number of 0
   281  // and 1 values added (the log base sqrt(2) tables also precisely track the
   282  // number of 2, 3, and 4 values added).
   283  //
   284  // One consequence is that the log base 2 statistics require 65 buckets for 64
   285  // bit numbers instead of 64 buckets.
   286  //
   287  var log2RoundIdxTable = [256]uint8{
   288  	//    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
   289  	// -Inf  0.0  1.0  1.6  2.0  2.3  2.6  2.8  3.0  3.2  3.3  3.5  3.6  3.7  3.8  3.9
   290  	0, 1, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5,
   291  
   292  	//   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31
   293  	//  4.0  4.1  4.2  4.2  4.3  4.4  4.5  4.5  4.6  4.6  4.7  4.8  4.8  4.9  4.9  5.0
   294  	5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6,
   295  
   296  	//   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47
   297  	//  5.0  5.0  5.1  5.1  5.2  5.2  5.2  5.3  5.3  5.4  5.4  5.4  5.5  5.5  5.5  5.6
   298  	6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7,
   299  
   300  	//   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63
   301  	//  5.6  5.6  5.6  5.7  5.7  5.7  5.8  5.8  5.8  5.8  5.9  5.9  5.9  5.9  6.0  6.0
   302  	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
   303  
   304  	//   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79
   305  	//  6.0  6.0  6.0  6.1  6.1  6.1  6.1  6.1  6.2  6.2  6.2  6.2  6.2  6.3  6.3  6.3
   306  	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
   307  
   308  	//   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95
   309  	//  6.3  6.3  6.4  6.4  6.4  6.4  6.4  6.4  6.5  6.5  6.5  6.5  6.5  6.5  6.6  6.6
   310  	7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,
   311  
   312  	//   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111
   313  	//  6.6  6.6  6.6  6.6  6.6  6.7  6.7  6.7  6.7  6.7  6.7  6.7  6.8  6.8  6.8  6.8
   314  	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   315  
   316  	//  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
   317  	//  6.8  6.8  6.8  6.8  6.9  6.9  6.9  6.9  6.9  6.9  6.9  6.9  7.0  7.0  7.0  7.0
   318  	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   319  
   320  	//  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143
   321  	//  7.0  7.0  7.0  7.0  7.0  7.1  7.1  7.1  7.1  7.1  7.1  7.1  7.1  7.1  7.1  7.2
   322  	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   323  
   324  	//  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159
   325  	//  7.2  7.2  7.2  7.2  7.2  7.2  7.2  7.2  7.2  7.3  7.3  7.3  7.3  7.3  7.3  7.3
   326  	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   327  
   328  	//  160  161  162  163  164  165  166  167  168  169  170  171  172  173  174  175
   329  	//  7.3  7.3  7.3  7.3  7.4  7.4  7.4  7.4  7.4  7.4  7.4  7.4  7.4  7.4  7.4  7.5
   330  	8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
   331  
   332  	//  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191
   333  	//  7.5  7.5  7.5  7.5  7.5  7.5  7.5  7.5  7.5  7.5  7.5  7.5  7.6  7.6  7.6  7.6
   334  	8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
   335  
   336  	//  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207
   337  	//  7.6  7.6  7.6  7.6  7.6  7.6  7.6  7.6  7.6  7.7  7.7  7.7  7.7  7.7  7.7  7.7
   338  	9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
   339  
   340  	//  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223
   341  	//  7.7  7.7  7.7  7.7  7.7  7.7  7.7  7.7  7.8  7.8  7.8  7.8  7.8  7.8  7.8  7.8
   342  	9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
   343  
   344  	//  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239
   345  	//  7.8  7.8  7.8  7.8  7.8  7.8  7.8  7.9  7.9  7.9  7.9  7.9  7.9  7.9  7.9  7.9
   346  	9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
   347  
   348  	//  240  241  242  243  244  245  246  247  248  249  250  251  252  253  254  255
   349  	//  7.9  7.9  7.9  7.9  7.9  7.9  7.9  7.9  8.0  8.0  8.0  8.0  8.0  8.0  8.0  8.0
   350  	9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
   351  }
   352  
   353  var log2RoundBucketTable = [65]BucketInfo{
   354  	/*0*/ {RangeLow: 0, RangeHigh: 0, NominalVal: 0, MeanVal: 0},
   355  	/*1*/ {RangeLow: 1, RangeHigh: 1, NominalVal: 1, MeanVal: 1},
   356  	/*2*/ {RangeLow: 2, RangeHigh: 2, NominalVal: 2, MeanVal: 2},
   357  	/*3*/ {RangeLow: 3, RangeHigh: 5, NominalVal: 4, MeanVal: 4},
   358  	/*4*/ {RangeLow: 6, RangeHigh: 11, NominalVal: 8, MeanVal: 8},
   359  	/*5*/ {RangeLow: 12, RangeHigh: 22, NominalVal: 16, MeanVal: 17},
   360  	/*6*/ {RangeLow: 23, RangeHigh: 45, NominalVal: 32, MeanVal: 34},
   361  	/*7*/ {RangeLow: 46, RangeHigh: 90, NominalVal: 64, MeanVal: 68},
   362  	/*8*/ {RangeLow: 91, RangeHigh: 181, NominalVal: 128, MeanVal: 136},
   363  	/*9*/ {RangeLow: 182, RangeHigh: 363, NominalVal: 256, MeanVal: 272},
   364  	/*10*/ {RangeLow: 364, RangeHigh: 727, NominalVal: 512, MeanVal: 545},
   365  	/*11*/ {RangeLow: 728, RangeHigh: 1455, NominalVal: 1024, MeanVal: 1091},
   366  	/*12*/ {RangeLow: 1456, RangeHigh: 2911, NominalVal: 2048, MeanVal: 2183},
   367  	/*13*/ {RangeLow: 2912, RangeHigh: 5823, NominalVal: 4096, MeanVal: 4367},
   368  	/*14*/ {RangeLow: 5824, RangeHigh: 11647, NominalVal: 8192, MeanVal: 8735},
   369  	/*15*/ {RangeLow: 11648, RangeHigh: 23295, NominalVal: 16384, MeanVal: 17471},
   370  	/*16*/ {RangeLow: 23296, RangeHigh: 46591, NominalVal: 32768, MeanVal: 34943},
   371  	/*17*/ {RangeLow: 46592, RangeHigh: 93183, NominalVal: 65536, MeanVal: 69887},
   372  	/*18*/ {RangeLow: 93184, RangeHigh: 186367, NominalVal: 131072, MeanVal: 139775},
   373  	/*19*/ {RangeLow: 186368, RangeHigh: 372735, NominalVal: 262144, MeanVal: 279551},
   374  	/*20*/ {RangeLow: 372736, RangeHigh: 745471, NominalVal: 524288, MeanVal: 559103},
   375  	/*21*/ {RangeLow: 745472, RangeHigh: 1490943, NominalVal: 1048576, MeanVal: 1118207},
   376  	/*22*/ {RangeLow: 1490944, RangeHigh: 2981887, NominalVal: 2097152, MeanVal: 2236415},
   377  	/*23*/ {RangeLow: 2981888, RangeHigh: 5963775, NominalVal: 4194304, MeanVal: 4472831},
   378  	/*24*/ {RangeLow: 5963776, RangeHigh: 11927551, NominalVal: 8388608, MeanVal: 8945663},
   379  	/*25*/ {RangeLow: 11927552, RangeHigh: 23855103, NominalVal: 16777216, MeanVal: 17891327},
   380  	/*26*/ {RangeLow: 23855104, RangeHigh: 47710207, NominalVal: 33554432, MeanVal: 35782655},
   381  	/*27*/ {RangeLow: 47710208, RangeHigh: 95420415, NominalVal: 67108864, MeanVal: 71565311},
   382  	/*28*/ {RangeLow: 95420416, RangeHigh: 190840831, NominalVal: 134217728, MeanVal: 143130623},
   383  	/*29*/ {RangeLow: 190840832, RangeHigh: 381681663, NominalVal: 268435456, MeanVal: 286261247},
   384  	/*30*/ {RangeLow: 381681664, RangeHigh: 763363327, NominalVal: 536870912, MeanVal: 572522495},
   385  	/*31*/ {RangeLow: 763363328, RangeHigh: 1526726655, NominalVal: 1073741824, MeanVal: 1145044991},
   386  	/*32*/ {RangeLow: 1526726656, RangeHigh: 3053453311, NominalVal: 2147483648, MeanVal: 2290089983},
   387  	/*33*/ {RangeLow: 3053453312, RangeHigh: 6106906623, NominalVal: 4294967296, MeanVal: 4580179967},
   388  	/*34*/ {RangeLow: 6106906624, RangeHigh: 12213813247, NominalVal: 8589934592, MeanVal: 9160359935},
   389  	/*35*/ {RangeLow: 12213813248, RangeHigh: 24427626495, NominalVal: 17179869184, MeanVal: 18320719871},
   390  	/*36*/ {RangeLow: 24427626496, RangeHigh: 48855252991, NominalVal: 34359738368, MeanVal: 36641439743},
   391  	/*37*/ {RangeLow: 48855252992, RangeHigh: 97710505983, NominalVal: 68719476736, MeanVal: 73282879487},
   392  	/*38*/ {RangeLow: 97710505984, RangeHigh: 195421011967, NominalVal: 137438953472, MeanVal: 146565758975},
   393  	/*39*/ {RangeLow: 195421011968, RangeHigh: 390842023935, NominalVal: 274877906944, MeanVal: 293131517951},
   394  	/*40*/ {RangeLow: 390842023936, RangeHigh: 781684047871, NominalVal: 549755813888, MeanVal: 586263035903},
   395  	/*41*/ {RangeLow: 781684047872, RangeHigh: 1563368095743,
   396  		NominalVal: 1099511627776, MeanVal: 1172526071807},
   397  	/*42*/ {RangeLow: 1563368095744, RangeHigh: 3126736191487,
   398  		NominalVal: 2199023255552, MeanVal: 2345052143615},
   399  	/*43*/ {RangeLow: 3126736191488, RangeHigh: 6253472382975,
   400  		NominalVal: 4398046511104, MeanVal: 4690104287231},
   401  	/*44*/ {RangeLow: 6253472382976, RangeHigh: 12506944765951,
   402  		NominalVal: 8796093022208, MeanVal: 9380208574463},
   403  	/*45*/ {RangeLow: 12506944765952, RangeHigh: 25013889531903,
   404  		NominalVal: 17592186044416, MeanVal: 18760417148927},
   405  	/*46*/ {RangeLow: 25013889531904, RangeHigh: 50027779063807,
   406  		NominalVal: 35184372088832, MeanVal: 37520834297855},
   407  	/*47*/ {RangeLow: 50027779063808, RangeHigh: 100055558127615,
   408  		NominalVal: 70368744177664, MeanVal: 75041668595711},
   409  	/*48*/ {RangeLow: 100055558127616, RangeHigh: 200111116255231,
   410  		NominalVal: 140737488355328, MeanVal: 150083337191423},
   411  	/*49*/ {RangeLow: 200111116255232, RangeHigh: 400222232510463,
   412  		NominalVal: 281474976710656, MeanVal: 300166674382847},
   413  	/*50*/ {RangeLow: 400222232510464, RangeHigh: 800444465020927,
   414  		NominalVal: 562949953421312, MeanVal: 600333348765695},
   415  	/*51*/ {RangeLow: 800444465020928, RangeHigh: 1600888930041855,
   416  		NominalVal: 1125899906842624, MeanVal: 1200666697531391},
   417  	/*52*/ {RangeLow: 1600888930041856, RangeHigh: 3201777860083711,
   418  		NominalVal: 2251799813685248, MeanVal: 2401333395062783},
   419  	/*53*/ {RangeLow: 3201777860083712, RangeHigh: 6403555720167423,
   420  		NominalVal: 4503599627370496, MeanVal: 4802666790125567},
   421  	/*54*/ {RangeLow: 6403555720167424, RangeHigh: 12807111440334847,
   422  		NominalVal: 9007199254740992, MeanVal: 9605333580251135},
   423  	/*55*/ {RangeLow: 12807111440334848, RangeHigh: 25614222880669695,
   424  		NominalVal: 18014398509481984, MeanVal: 19210667160502271},
   425  	/*56*/ {RangeLow: 25614222880669696, RangeHigh: 51228445761339391,
   426  		NominalVal: 36028797018963968, MeanVal: 38421334321004543},
   427  	/*57*/ {RangeLow: 51228445761339392, RangeHigh: 102456891522678783,
   428  		NominalVal: 72057594037927936, MeanVal: 76842668642009087},
   429  	/*58*/ {RangeLow: 102456891522678784, RangeHigh: 204913783045357567,
   430  		NominalVal: 144115188075855872, MeanVal: 153685337284018175},
   431  	/*59*/ {RangeLow: 204913783045357568, RangeHigh: 409827566090715135,
   432  		NominalVal: 288230376151711744, MeanVal: 307370674568036351},
   433  	/*60*/ {RangeLow: 409827566090715136, RangeHigh: 819655132181430271,
   434  		NominalVal: 576460752303423488, MeanVal: 614741349136072703},
   435  	/*61*/ {RangeLow: 819655132181430272, RangeHigh: 1639310264362860543,
   436  		NominalVal: 1152921504606846976, MeanVal: 1229482698272145407},
   437  	/*62*/ {RangeLow: 1639310264362860544, RangeHigh: 3278620528725721087,
   438  		NominalVal: 2305843009213693952, MeanVal: 2458965396544290815},
   439  	/*63*/ {RangeLow: 3278620528725721088, RangeHigh: 6557241057451442175,
   440  		NominalVal: 4611686018427387904, MeanVal: 4917930793088581631},
   441  	/*64*/ {RangeLow: 6557241057451442176, RangeHigh: 18446744073709551615,
   442  		NominalVal: 9223372036854775808, MeanVal: 12501992565580496895},
   443  }
   444  
   445  var logRoot2RoundIdxTable = [256]uint8{
   446  	//    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
   447  	// -Inf  0.0  2.0  3.2  4.0  4.6  5.2  5.6  6.0  6.3  6.6  6.9  7.2  7.4  7.6  7.8
   448  	0, 1, 2, 3, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8,
   449  
   450  	//   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31
   451  	//  8.0  8.2  8.3  8.5  8.6  8.8  8.9  9.0  9.2  9.3  9.4  9.5  9.6  9.7  9.8  9.9
   452  	8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10,
   453  
   454  	//   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47
   455  	// 10.0 10.1 10.2 10.3 10.3 10.4 10.5 10.6 10.6 10.7 10.8 10.9 10.9 11.0 11.0 11.1
   456  	10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11,
   457  
   458  	//   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63
   459  	// 11.2 11.2 11.3 11.3 11.4 11.5 11.5 11.6 11.6 11.7 11.7 11.8 11.8 11.9 11.9 12.0
   460  	11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
   461  
   462  	//   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79
   463  	// 12.0 12.0 12.1 12.1 12.2 12.2 12.3 12.3 12.3 12.4 12.4 12.5 12.5 12.5 12.6 12.6
   464  	12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13,
   465  
   466  	//   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95
   467  	// 12.6 12.7 12.7 12.8 12.8 12.8 12.9 12.9 12.9 13.0 13.0 13.0 13.0 13.1 13.1 13.1
   468  	13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
   469  
   470  	//   96   97   98   99  100  101  102  103  104  105  106  107  108  109  110  111
   471  	// 13.2 13.2 13.2 13.3 13.3 13.3 13.3 13.4 13.4 13.4 13.5 13.5 13.5 13.5 13.6 13.6
   472  	13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14,
   473  
   474  	//  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
   475  	// 13.6 13.6 13.7 13.7 13.7 13.7 13.8 13.8 13.8 13.8 13.9 13.9 13.9 13.9 14.0 14.0
   476  	14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
   477  
   478  	//  128  129  130  131  132  133  134  135  136  137  138  139  140  141  142  143
   479  	// 14.0 14.0 14.0 14.1 14.1 14.1 14.1 14.2 14.2 14.2 14.2 14.2 14.3 14.3 14.3 14.3
   480  	14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
   481  
   482  	//  144  145  146  147  148  149  150  151  152  153  154  155  156  157  158  159
   483  	// 14.3 14.4 14.4 14.4 14.4 14.4 14.5 14.5 14.5 14.5 14.5 14.6 14.6 14.6 14.6 14.6
   484  	14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15,
   485  
   486  	//  160  161  162  163  164  165  166  167  168  169  170  171  172  173  174  175
   487  	// 14.6 14.7 14.7 14.7 14.7 14.7 14.8 14.8 14.8 14.8 14.8 14.8 14.9 14.9 14.9 14.9
   488  	15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
   489  
   490  	//  176  177  178  179  180  181  182  183  184  185  186  187  188  189  190  191
   491  	// 14.9 14.9 15.0 15.0 15.0 15.0 15.0 15.0 15.0 15.1 15.1 15.1 15.1 15.1 15.1 15.2
   492  	15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
   493  
   494  	//  192  193  194  195  196  197  198  199  200  201  202  203  204  205  206  207
   495  	// 15.2 15.2 15.2 15.2 15.2 15.2 15.3 15.3 15.3 15.3 15.3 15.3 15.3 15.4 15.4 15.4
   496  	15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
   497  
   498  	//  208  209  210  211  212  213  214  215  216  217  218  219  220  221  222  223
   499  	// 15.4 15.4 15.4 15.4 15.5 15.5 15.5 15.5 15.5 15.5 15.5 15.5 15.6 15.6 15.6 15.6
   500  	15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
   501  
   502  	//  224  225  226  227  228  229  230  231  232  233  234  235  236  237  238  239
   503  	// 15.6 15.6 15.6 15.7 15.7 15.7 15.7 15.7 15.7 15.7 15.7 15.8 15.8 15.8 15.8 15.8
   504  	16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
   505  
   506  	//  240  241  242  243  244  245  246  247  248  249  250  251  252  253  254  255
   507  	// 15.8 15.8 15.8 15.8 15.9 15.9 15.9 15.9 15.9 15.9 15.9 15.9 16.0 16.0 16.0 16.0
   508  	16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
   509  }
   510  
   511  var logRoot2RoundBucketTable = [128]BucketInfo{
   512  	/*0*/ {RangeLow: 0, RangeHigh: 0, NominalVal: 0, MeanVal: 0},
   513  	/*1*/ {RangeLow: 1, RangeHigh: 1, NominalVal: 1, MeanVal: 1},
   514  	/*2*/ {RangeLow: 2, RangeHigh: 2, NominalVal: 2, MeanVal: 2},
   515  	/*3*/ {RangeLow: 3, RangeHigh: 3, NominalVal: 3, MeanVal: 3},
   516  	/*4*/ {RangeLow: 4, RangeHigh: 4, NominalVal: 4, MeanVal: 4},
   517  	/*5*/ {RangeLow: 5, RangeHigh: 6, NominalVal: 6, MeanVal: 5},
   518  	/*6*/ {RangeLow: 7, RangeHigh: 9, NominalVal: 8, MeanVal: 8},
   519  	/*7*/ {RangeLow: 10, RangeHigh: 13, NominalVal: 11, MeanVal: 11},
   520  	/*8*/ {RangeLow: 14, RangeHigh: 19, NominalVal: 16, MeanVal: 16},
   521  	/*9*/ {RangeLow: 20, RangeHigh: 26, NominalVal: 23, MeanVal: 23},
   522  	/*10*/ {RangeLow: 27, RangeHigh: 38, NominalVal: 32, MeanVal: 32},
   523  	/*11*/ {RangeLow: 39, RangeHigh: 53, NominalVal: 45, MeanVal: 46},
   524  	/*12*/ {RangeLow: 54, RangeHigh: 76, NominalVal: 64, MeanVal: 65},
   525  	/*13*/ {RangeLow: 77, RangeHigh: 107, NominalVal: 91, MeanVal: 92},
   526  	/*14*/ {RangeLow: 108, RangeHigh: 152, NominalVal: 128, MeanVal: 130},
   527  	/*15*/ {RangeLow: 153, RangeHigh: 215, NominalVal: 181, MeanVal: 184},
   528  	/*16*/ {RangeLow: 216, RangeHigh: 305, NominalVal: 256, MeanVal: 260},
   529  	/*17*/ {RangeLow: 306, RangeHigh: 431, NominalVal: 362, MeanVal: 368},
   530  	/*18*/ {RangeLow: 432, RangeHigh: 611, NominalVal: 512, MeanVal: 521},
   531  	/*19*/ {RangeLow: 612, RangeHigh: 863, NominalVal: 724, MeanVal: 737},
   532  	/*20*/ {RangeLow: 864, RangeHigh: 1223, NominalVal: 1024, MeanVal: 1043},
   533  	/*21*/ {RangeLow: 1224, RangeHigh: 1727, NominalVal: 1448, MeanVal: 1475},
   534  	/*22*/ {RangeLow: 1728, RangeHigh: 2447, NominalVal: 2048, MeanVal: 2087},
   535  	/*23*/ {RangeLow: 2448, RangeHigh: 3455, NominalVal: 2896, MeanVal: 2951},
   536  	/*24*/ {RangeLow: 3456, RangeHigh: 4895, NominalVal: 4096, MeanVal: 4175},
   537  	/*25*/ {RangeLow: 4896, RangeHigh: 6911, NominalVal: 5793, MeanVal: 5903},
   538  	/*26*/ {RangeLow: 6912, RangeHigh: 9791, NominalVal: 8192, MeanVal: 8351},
   539  	/*27*/ {RangeLow: 9792, RangeHigh: 13823, NominalVal: 11585, MeanVal: 11807},
   540  	/*28*/ {RangeLow: 13824, RangeHigh: 19583, NominalVal: 16384, MeanVal: 16703},
   541  	/*29*/ {RangeLow: 19584, RangeHigh: 27647, NominalVal: 23170, MeanVal: 23615},
   542  	/*30*/ {RangeLow: 27648, RangeHigh: 39167, NominalVal: 32768, MeanVal: 33407},
   543  	/*31*/ {RangeLow: 39168, RangeHigh: 55295, NominalVal: 46341, MeanVal: 47231},
   544  	/*32*/ {RangeLow: 55296, RangeHigh: 78335, NominalVal: 65536, MeanVal: 66815},
   545  	/*33*/ {RangeLow: 78336, RangeHigh: 110591, NominalVal: 92682, MeanVal: 94463},
   546  	/*34*/ {RangeLow: 110592, RangeHigh: 156671, NominalVal: 131072, MeanVal: 133631},
   547  	/*35*/ {RangeLow: 156672, RangeHigh: 221183, NominalVal: 185364, MeanVal: 188927},
   548  	/*36*/ {RangeLow: 221184, RangeHigh: 313343, NominalVal: 262144, MeanVal: 267263},
   549  	/*37*/ {RangeLow: 313344, RangeHigh: 442367, NominalVal: 370728, MeanVal: 377855},
   550  	/*38*/ {RangeLow: 442368, RangeHigh: 626687, NominalVal: 524288, MeanVal: 534527},
   551  	/*39*/ {RangeLow: 626688, RangeHigh: 884735, NominalVal: 741455, MeanVal: 755711},
   552  	/*40*/ {RangeLow: 884736, RangeHigh: 1253375, NominalVal: 1048576, MeanVal: 1069055},
   553  	/*41*/ {RangeLow: 1253376, RangeHigh: 1769471, NominalVal: 1482910, MeanVal: 1511423},
   554  	/*42*/ {RangeLow: 1769472, RangeHigh: 2506751, NominalVal: 2097152, MeanVal: 2138111},
   555  	/*43*/ {RangeLow: 2506752, RangeHigh: 3538943, NominalVal: 2965821, MeanVal: 3022847},
   556  	/*44*/ {RangeLow: 3538944, RangeHigh: 5013503, NominalVal: 4194304, MeanVal: 4276223},
   557  	/*45*/ {RangeLow: 5013504, RangeHigh: 7077887, NominalVal: 5931642, MeanVal: 6045695},
   558  	/*46*/ {RangeLow: 7077888, RangeHigh: 10027007, NominalVal: 8388608, MeanVal: 8552447},
   559  	/*47*/ {RangeLow: 10027008, RangeHigh: 14155775, NominalVal: 11863283, MeanVal: 12091391},
   560  	/*48*/ {RangeLow: 14155776, RangeHigh: 20054015, NominalVal: 16777216, MeanVal: 17104895},
   561  	/*49*/ {RangeLow: 20054016, RangeHigh: 28311551, NominalVal: 23726566, MeanVal: 24182783},
   562  	/*50*/ {RangeLow: 28311552, RangeHigh: 40108031, NominalVal: 33554432, MeanVal: 34209791},
   563  	/*51*/ {RangeLow: 40108032, RangeHigh: 56623103, NominalVal: 47453133, MeanVal: 48365567},
   564  	/*52*/ {RangeLow: 56623104, RangeHigh: 80216063, NominalVal: 67108864, MeanVal: 68419583},
   565  	/*53*/ {RangeLow: 80216064, RangeHigh: 113246207, NominalVal: 94906266, MeanVal: 96731135},
   566  	/*54*/ {RangeLow: 113246208, RangeHigh: 160432127, NominalVal: 134217728, MeanVal: 136839167},
   567  	/*55*/ {RangeLow: 160432128, RangeHigh: 226492415, NominalVal: 189812531, MeanVal: 193462271},
   568  	/*56*/ {RangeLow: 226492416, RangeHigh: 320864255, NominalVal: 268435456, MeanVal: 273678335},
   569  	/*57*/ {RangeLow: 320864256, RangeHigh: 452984831, NominalVal: 379625062, MeanVal: 386924543},
   570  	/*58*/ {RangeLow: 452984832, RangeHigh: 641728511, NominalVal: 536870912, MeanVal: 547356671},
   571  	/*59*/ {RangeLow: 641728512, RangeHigh: 905969663, NominalVal: 759250125, MeanVal: 773849087},
   572  	/*60*/ {RangeLow: 905969664, RangeHigh: 1283457023, NominalVal: 1073741824, MeanVal: 1094713343},
   573  	/*61*/ {RangeLow: 1283457024, RangeHigh: 1811939327, NominalVal: 1518500250, MeanVal: 1547698175},
   574  	/*62*/ {RangeLow: 1811939328, RangeHigh: 2566914047, NominalVal: 2147483648, MeanVal: 2189426687},
   575  	/*63*/ {RangeLow: 2566914048, RangeHigh: 3623878655, NominalVal: 3037000500, MeanVal: 3095396351},
   576  	/*64*/ {RangeLow: 3623878656, RangeHigh: 5133828095, NominalVal: 4294967296, MeanVal: 4378853375},
   577  	/*65*/ {RangeLow: 5133828096, RangeHigh: 7247757311, NominalVal: 6074001000, MeanVal: 6190792703},
   578  	/*66*/ {RangeLow: 7247757312, RangeHigh: 10267656191, NominalVal: 8589934592, MeanVal: 8757706751},
   579  	/*67*/ {RangeLow: 10267656192, RangeHigh: 14495514623, NominalVal: 12148002000, MeanVal: 12381585407},
   580  	/*68*/ {RangeLow: 14495514624, RangeHigh: 20535312383, NominalVal: 17179869184, MeanVal: 17515413503},
   581  	/*69*/ {RangeLow: 20535312384, RangeHigh: 28991029247, NominalVal: 24296004000, MeanVal: 24763170815},
   582  	/*70*/ {RangeLow: 28991029248, RangeHigh: 41070624767, NominalVal: 34359738368, MeanVal: 35030827007},
   583  	/*71*/ {RangeLow: 41070624768, RangeHigh: 57982058495, NominalVal: 48592008000, MeanVal: 49526341631},
   584  	/*72*/ {RangeLow: 57982058496, RangeHigh: 82141249535, NominalVal: 68719476736, MeanVal: 70061654015},
   585  	/*73*/ {RangeLow: 82141249536, RangeHigh: 115964116991, NominalVal: 97184015999, MeanVal: 99052683263},
   586  	/*74*/ {RangeLow: 115964116992, RangeHigh: 164282499071, NominalVal: 137438953472, MeanVal: 140123308031},
   587  	/*75*/ {RangeLow: 164282499072, RangeHigh: 231928233983, NominalVal: 194368031998, MeanVal: 198105366527},
   588  	/*76*/ {RangeLow: 231928233984, RangeHigh: 328564998143, NominalVal: 274877906944, MeanVal: 280246616063},
   589  	/*77*/ {RangeLow: 328564998144, RangeHigh: 463856467967, NominalVal: 388736063997, MeanVal: 396210733055},
   590  	/*78*/ {RangeLow: 463856467968, RangeHigh: 657129996287, NominalVal: 549755813888, MeanVal: 560493232127},
   591  	/*79*/ {RangeLow: 657129996288, RangeHigh: 927712935935, NominalVal: 777472127994, MeanVal: 792421466111},
   592  	/*80*/ {RangeLow: 927712935936, RangeHigh: 1314259992575,
   593  		NominalVal: 1099511627776, MeanVal: 1120986464255},
   594  	/*81*/ {RangeLow: 1314259992576, RangeHigh: 1855425871871,
   595  		NominalVal: 1554944255988, MeanVal: 1584842932223},
   596  	/*82*/ {RangeLow: 1855425871872, RangeHigh: 2628519985151,
   597  		NominalVal: 2199023255552, MeanVal: 2241972928511},
   598  	/*83*/ {RangeLow: 2628519985152, RangeHigh: 3710851743743,
   599  		NominalVal: 3109888511975, MeanVal: 3169685864447},
   600  	/*84*/ {RangeLow: 3710851743744, RangeHigh: 5257039970303,
   601  		NominalVal: 4398046511104, MeanVal: 4483945857023},
   602  	/*85*/ {RangeLow: 5257039970304, RangeHigh: 7421703487487,
   603  		NominalVal: 6219777023951, MeanVal: 6339371728895},
   604  	/*86*/ {RangeLow: 7421703487488, RangeHigh: 10514079940607,
   605  		NominalVal: 8796093022208, MeanVal: 8967891714047},
   606  	/*87*/ {RangeLow: 10514079940608, RangeHigh: 14843406974975,
   607  		NominalVal: 12439554047902, MeanVal: 12678743457791},
   608  	/*88*/ {RangeLow: 14843406974976, RangeHigh: 21028159881215,
   609  		NominalVal: 17592186044416, MeanVal: 17935783428095},
   610  	/*89*/ {RangeLow: 21028159881216, RangeHigh: 29686813949951,
   611  		NominalVal: 24879108095804, MeanVal: 25357486915583},
   612  	/*90*/ {RangeLow: 29686813949952, RangeHigh: 42056319762431,
   613  		NominalVal: 35184372088832, MeanVal: 35871566856191},
   614  	/*91*/ {RangeLow: 42056319762432, RangeHigh: 59373627899903,
   615  		NominalVal: 49758216191608, MeanVal: 50714973831167},
   616  	/*92*/ {RangeLow: 59373627899904, RangeHigh: 84112639524863,
   617  		NominalVal: 70368744177664, MeanVal: 71743133712383},
   618  	/*93*/ {RangeLow: 84112639524864, RangeHigh: 118747255799807,
   619  		NominalVal: 99516432383215, MeanVal: 101429947662335},
   620  	/*94*/ {RangeLow: 118747255799808, RangeHigh: 168225279049727,
   621  		NominalVal: 140737488355328, MeanVal: 143486267424767},
   622  	/*95*/ {RangeLow: 168225279049728, RangeHigh: 237494511599615,
   623  		NominalVal: 199032864766430, MeanVal: 202859895324671},
   624  	/*96*/ {RangeLow: 237494511599616, RangeHigh: 336450558099455,
   625  		NominalVal: 281474976710656, MeanVal: 286972534849535},
   626  	/*97*/ {RangeLow: 336450558099456, RangeHigh: 474989023199231,
   627  		NominalVal: 398065729532861, MeanVal: 405719790649343},
   628  	/*98*/ {RangeLow: 474989023199232, RangeHigh: 672901116198911,
   629  		NominalVal: 562949953421312, MeanVal: 573945069699071},
   630  	/*99*/ {RangeLow: 672901116198912, RangeHigh: 949978046398463,
   631  		NominalVal: 796131459065722, MeanVal: 811439581298687},
   632  	/*100*/ {RangeLow: 949978046398464, RangeHigh: 1345802232397823,
   633  		NominalVal: 1125899906842624, MeanVal: 1147890139398143},
   634  	/*101*/ {RangeLow: 1345802232397824, RangeHigh: 1899956092796927,
   635  		NominalVal: 1592262918131443, MeanVal: 1622879162597375},
   636  	/*102*/ {RangeLow: 1899956092796928, RangeHigh: 2691604464795647,
   637  		NominalVal: 2251799813685248, MeanVal: 2295780278796287},
   638  	/*103*/ {RangeLow: 2691604464795648, RangeHigh: 3799912185593855,
   639  		NominalVal: 3184525836262886, MeanVal: 3245758325194751},
   640  	/*104*/ {RangeLow: 3799912185593856, RangeHigh: 5383208929591295,
   641  		NominalVal: 4503599627370496, MeanVal: 4591560557592575},
   642  	/*105*/ {RangeLow: 5383208929591296, RangeHigh: 7599824371187711,
   643  		NominalVal: 6369051672525773, MeanVal: 6491516650389503},
   644  	/*106*/ {RangeLow: 7599824371187712, RangeHigh: 10766417859182591,
   645  		NominalVal: 9007199254740992, MeanVal: 9183121115185151},
   646  	/*107*/ {RangeLow: 10766417859182592, RangeHigh: 15199648742375423,
   647  		NominalVal: 12738103345051545, MeanVal: 12983033300779007},
   648  	/*108*/ {RangeLow: 15199648742375424, RangeHigh: 21532835718365183,
   649  		NominalVal: 18014398509481984, MeanVal: 18366242230370303},
   650  	/*109*/ {RangeLow: 21532835718365184, RangeHigh: 30399297484750847,
   651  		NominalVal: 25476206690103090, MeanVal: 25966066601558015},
   652  	/*110*/ {RangeLow: 30399297484750848, RangeHigh: 43065671436730367,
   653  		NominalVal: 36028797018963968, MeanVal: 36732484460740607},
   654  	/*111*/ {RangeLow: 43065671436730368, RangeHigh: 60798594969501695,
   655  		NominalVal: 50952413380206181, MeanVal: 51932133203116031},
   656  	/*112*/ {RangeLow: 60798594969501696, RangeHigh: 86131342873460735,
   657  		NominalVal: 72057594037927936, MeanVal: 73464968921481215},
   658  	/*113*/ {RangeLow: 86131342873460736, RangeHigh: 121597189939003391,
   659  		NominalVal: 101904826760412361, MeanVal: 103864266406232063},
   660  	/*114*/ {RangeLow: 121597189939003392, RangeHigh: 172262685746921471,
   661  		NominalVal: 144115188075855872, MeanVal: 146929937842962431},
   662  	/*115*/ {RangeLow: 172262685746921472, RangeHigh: 243194379878006783,
   663  		NominalVal: 203809653520824722, MeanVal: 207728532812464127},
   664  	/*116*/ {RangeLow: 243194379878006784, RangeHigh: 344525371493842943,
   665  		NominalVal: 288230376151711744, MeanVal: 293859875685924863},
   666  	/*117*/ {RangeLow: 344525371493842944, RangeHigh: 486388759756013567,
   667  		NominalVal: 407619307041649444, MeanVal: 415457065624928255},
   668  	/*118*/ {RangeLow: 486388759756013568, RangeHigh: 689050742987685887,
   669  		NominalVal: 576460752303423488, MeanVal: 587719751371849727},
   670  	/*119*/ {RangeLow: 689050742987685888, RangeHigh: 972777519512027135,
   671  		NominalVal: 815238614083298888, MeanVal: 830914131249856511},
   672  	/*120*/ {RangeLow: 972777519512027136, RangeHigh: 1378101485975371775,
   673  		NominalVal: 1152921504606846976, MeanVal: 1175439502743699455},
   674  	/*121*/ {RangeLow: 1378101485975371776, RangeHigh: 1945555039024054271,
   675  		NominalVal: 1630477228166597777, MeanVal: 1661828262499713023},
   676  	/*122*/ {RangeLow: 1945555039024054272, RangeHigh: 2756202971950743551,
   677  		NominalVal: 2305843009213693952, MeanVal: 2350879005487398911},
   678  	/*123*/ {RangeLow: 2756202971950743552, RangeHigh: 3891110078048108543,
   679  		NominalVal: 3260954456333195553, MeanVal: 3323656524999426047},
   680  	/*124*/ {RangeLow: 3891110078048108544, RangeHigh: 5512405943901487103,
   681  		NominalVal: 4611686018427387904, MeanVal: 4701758010974797823},
   682  	/*125*/ {RangeLow: 5512405943901487104, RangeHigh: 7782220156096217087,
   683  		NominalVal: 6521908912666391106, MeanVal: 6647313049998852095},
   684  	/*126*/ {RangeLow: 7782220156096217088, RangeHigh: 11024811887802974207,
   685  		NominalVal: 9223372036854775808, MeanVal: 9403516021949595647},
   686  	/*127*/ {RangeLow: 11024811887802974208, RangeHigh: 18446744073709551615,
   687  		NominalVal: 13043817825332782212, MeanVal: 14735777980756262911},
   688  }