380 constexpr int kCachedPowersMinDecExp = -300;
381 constexpr int kCachedPowersDecStep = 8;
383 static constexpr std::array<cached_power, 79> kCachedPowers =
386 { 0xAB70FE17C79AC6CA, -1060, -300 },
387 { 0xFF77B1FCBEBCDC4F, -1034, -292 },
388 { 0xBE5691EF416BD60C, -1007, -284 },
389 { 0x8DD01FAD907FFC3C, -980, -276 },
390 { 0xD3515C2831559A83, -954, -268 },
391 { 0x9D71AC8FADA6C9B5, -927, -260 },
392 { 0xEA9C227723EE8BCB, -901, -252 },
393 { 0xAECC49914078536D, -874, -244 },
394 { 0x823C12795DB6CE57, -847, -236 },
395 { 0xC21094364DFB5637, -821, -228 },
396 { 0x9096EA6F3848984F, -794, -220 },
397 { 0xD77485CB25823AC7, -768, -212 },
398 { 0xA086CFCD97BF97F4, -741, -204 },
399 { 0xEF340A98172AACE5, -715, -196 },
400 { 0xB23867FB2A35B28E, -688, -188 },
401 { 0x84C8D4DFD2C63F3B, -661, -180 },
402 { 0xC5DD44271AD3CDBA, -635, -172 },
403 { 0x936B9FCEBB25C996, -608, -164 },
404 { 0xDBAC6C247D62A584, -582, -156 },
405 { 0xA3AB66580D5FDAF6, -555, -148 },
406 { 0xF3E2F893DEC3F126, -529, -140 },
407 { 0xB5B5ADA8AAFF80B8, -502, -132 },
408 { 0x87625F056C7C4A8B, -475, -124 },
409 { 0xC9BCFF6034C13053, -449, -116 },
410 { 0x964E858C91BA2655, -422, -108 },
411 { 0xDFF9772470297EBD, -396, -100 },
412 { 0xA6DFBD9FB8E5B88F, -369, -92 },
413 { 0xF8A95FCF88747D94, -343, -84 },
414 { 0xB94470938FA89BCF, -316, -76 },
415 { 0x8A08F0F8BF0F156B, -289, -68 },
416 { 0xCDB02555653131B6, -263, -60 },
417 { 0x993FE2C6D07B7FAC, -236, -52 },
418 { 0xE45C10C42A2B3B06, -210, -44 },
419 { 0xAA242499697392D3, -183, -36 },
420 { 0xFD87B5F28300CA0E, -157, -28 },
421 { 0xBCE5086492111AEB, -130, -20 },
422 { 0x8CBCCC096F5088CC, -103, -12 },
423 { 0xD1B71758E219652C, -77, -4 },
424 { 0x9C40000000000000, -50, 4 },
425 { 0xE8D4A51000000000, -24, 12 },
426 { 0xAD78EBC5AC620000, 3, 20 },
427 { 0x813F3978F8940984, 30, 28 },
428 { 0xC097CE7BC90715B3, 56, 36 },
429 { 0x8F7E32CE7BEA5C70, 83, 44 },
430 { 0xD5D238A4ABE98068, 109, 52 },
431 { 0x9F4F2726179A2245, 136, 60 },
432 { 0xED63A231D4C4FB27, 162, 68 },
433 { 0xB0DE65388CC8ADA8, 189, 76 },
434 { 0x83C7088E1AAB65DB, 216, 84 },
435 { 0xC45D1DF942711D9A, 242, 92 },
436 { 0x924D692CA61BE758, 269, 100 },
437 { 0xDA01EE641A708DEA, 295, 108 },
438 { 0xA26DA3999AEF774A, 322, 116 },
439 { 0xF209787BB47D6B85, 348, 124 },
440 { 0xB454E4A179DD1877, 375, 132 },
441 { 0x865B86925B9BC5C2, 402, 140 },
442 { 0xC83553C5C8965D3D, 428, 148 },
443 { 0x952AB45CFA97A0B3, 455, 156 },
444 { 0xDE469FBD99A05FE3, 481, 164 },
445 { 0xA59BC234DB398C25, 508, 172 },
446 { 0xF6C69A72A3989F5C, 534, 180 },
447 { 0xB7DCBF5354E9BECE, 561, 188 },
448 { 0x88FCF317F22241E2, 588, 196 },
449 { 0xCC20CE9BD35C78A5, 614, 204 },
450 { 0x98165AF37B2153DF, 641, 212 },
451 { 0xE2A0B5DC971F303A, 667, 220 },
452 { 0xA8D9D1535CE3B396, 694, 228 },
453 { 0xFB9B7CD9A4A7443C, 720, 236 },
454 { 0xBB764C4CA7A44410, 747, 244 },
455 { 0x8BAB8EEFB6409C1A, 774, 252 },
456 { 0xD01FEF10A657842C, 800, 260 },
457 { 0x9B10A4E5E9913129, 827, 268 },
458 { 0xE7109BFBA19C0C9D, 853, 276 },
459 { 0xAC2820D9623BF429, 880, 284 },
460 { 0x80444B5E7AA7CF85, 907, 292 },
461 { 0xBF21E44003ACDD2D, 933, 300 },
462 { 0x8E679C2F5E44FF8F, 960, 308 },
463 { 0xD433179D9C8CB841, 986, 316 },
464 { 0x9E19DB92B4E31BA9, 1013, 324 },
474 const int f =
kAlpha - e - 1;
475 const int k = (f * 78913) / (1 << 18) +
static_cast<int>(f > 0);
477 const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep;