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