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 }