From 27608aa646760a85d108d651814485ba66424a9b Mon Sep 17 00:00:00 2001 From: Kostya Shishkov Date: Sat, 2 Apr 2022 12:03:31 +0200 Subject: [PATCH] aac: use lookup table for coefficient quantisation --- nihav-mpeg/src/codecs/aac/coeff_read.rs | 34 +- nihav-mpeg/src/codecs/aac/mod.rs | 10 +- nihav-mpeg/src/codecs/aac/tables.rs | 515 ++++++++++++++++++++++++ 3 files changed, 549 insertions(+), 10 deletions(-) diff --git a/nihav-mpeg/src/codecs/aac/coeff_read.rs b/nihav-mpeg/src/codecs/aac/coeff_read.rs index 4a92f0a..63a86aa 100644 --- a/nihav-mpeg/src/codecs/aac/coeff_read.rs +++ b/nihav-mpeg/src/codecs/aac/coeff_read.rs @@ -5,6 +5,7 @@ use nihav_core::io::intcode::*; use std::mem; use std::ptr; use super::{INTENSITY_SCALE_MIN, MAX_WINDOWS, MAX_SFBS, GASubbandInfo, ICSInfo}; +use super::tables::CBRT_TAB; pub const ZERO_HCB: u8 = 0; pub const FIRST_PAIR_HCB: u8 = 5; @@ -41,11 +42,18 @@ impl Codebooks { pub fn get_scale(scale: u8) -> f32 { 2.0f32.powf(0.25 * (f32::from(scale) - 100.0 - 56.0)) } -pub fn iquant(val: f32) -> f32 { - if val < 0.0 { - -((-val).powf(4.0 / 3.0)) +fn iquant(val: i16) -> f32 { + let idx = val.abs() as usize; + if idx < CBRT_TAB.len() { + if val < 0 { + -CBRT_TAB[idx] + } else { + CBRT_TAB[idx] + } + } else if val < 0 { + -((-f32::from(val)).powf(4.0 / 3.0)) } else { - val.powf(4.0 / 3.0) + f32::from(val).powf(4.0 / 3.0) } } pub fn requant(val: f32, scale: f32) -> f32 { @@ -65,15 +73,20 @@ fn decode_quads(br: &mut BitReader, cb: &Codebook, unsigned: bool, scale: f let val = AAC_QUADS[cw][i]; if val != 0 { if br.read_bool()? { - out[i] = iquant(-f32::from(val)) * scale; + out[i] = -CBRT_TAB[val as usize] * scale; } else { - out[i] = iquant( f32::from(val)) * scale; + out[i] = CBRT_TAB[val as usize] * scale; } } } } else { for i in 0..4 { - out[i] = iquant(f32::from(AAC_QUADS[cw][i] - 1)) * scale; + let val = AAC_QUADS[cw][i] - 1; + if val < 0 { + out[i] = -CBRT_TAB[val.abs() as usize] * scale; + } else { + out[i] = CBRT_TAB[val.abs() as usize] * scale; + } } } } @@ -102,9 +115,12 @@ fn decode_pairs(br: &mut BitReader, cb: &Codebook, unsigned: bool, escape: if (y == 16) || (y == -16) { y = read_escape(br, y > 0)?; } + out[0] = iquant(x) * scale; + out[1] = iquant(y) * scale; + } else { + out[0] = scale * if x < 0 { -CBRT_TAB[x.abs() as usize] } else { CBRT_TAB[x as usize] }; + out[1] = scale * if y < 0 { -CBRT_TAB[y.abs() as usize] } else { CBRT_TAB[y as usize] }; } - out[0] = iquant(f32::from(x)) * scale; - out[1] = iquant(f32::from(y)) * scale; } Ok(()) } diff --git a/nihav-mpeg/src/codecs/aac/mod.rs b/nihav-mpeg/src/codecs/aac/mod.rs index 7233f52..795464b 100644 --- a/nihav-mpeg/src/codecs/aac/mod.rs +++ b/nihav-mpeg/src/codecs/aac/mod.rs @@ -11,6 +11,7 @@ mod coeff_read; use coeff_read::*; mod info; use info::*; +#[allow(clippy::excessive_precision)] mod tables; use tables::*; mod tools; @@ -201,6 +202,13 @@ impl ICS { self.coeffs = [0.0; 1024]; decode_spectrum(br, &mut self.coeffs, &self.scales, &self.info, &self.sbinfo, &self.sfb_cb, codebooks) } + fn iquant(val: f32) -> f32 { + if val < 0.0 { + -((-val).powf(4.0 / 3.0)) + } else { + val.powf(4.0 / 3.0) + } + } fn place_pulses(&mut self) { if let Some(ref pdata) = self.pulse_data { if pdata.pulse_start_sfb >= self.sbinfo.long_bands.len() - 1 { return; } @@ -220,7 +228,7 @@ impl ICS { } else { base -= f32::from(pdata.pulse_amp[pno]); } - self.coeffs[k] = iquant(base) * scale; + self.coeffs[k] = Self::iquant(base) * scale; } } } diff --git a/nihav-mpeg/src/codecs/aac/tables.rs b/nihav-mpeg/src/codecs/aac/tables.rs index bff9130..1536127 100644 --- a/nihav-mpeg/src/codecs/aac/tables.rs +++ b/nihav-mpeg/src/codecs/aac/tables.rs @@ -112,3 +112,518 @@ pub const AAC_SUBBAND_INFO: [GASubbandInfo; 12] = [ GASubbandInfo { min_srate: 9391, long_bands: &SWB_OFFSET_16K_LONG, short_bands: &SWB_OFFSET_16K_SHORT }, //11.025K GASubbandInfo { min_srate: 0, long_bands: &SWB_OFFSET_8K_LONG, short_bands: &SWB_OFFSET_8K_SHORT }, //8K ]; + +pub const CBRT_TAB: [f32; 1024] = [ + 0.00000000000000000000, 1.00000000000000000000, + 2.51984209978974632951, 4.32674871092222514692, + 6.34960420787279789894, 8.54987973338348494669, + 10.90272355699283795323, 13.39051827940672370829, + 16.00000000000000000000, 18.72075440746713703075, + 21.54434690031883721721, 24.46378099626247073259, + 27.47314182127996482685, 30.56735094036984736325, + 33.74199169845321980556, 36.99318111495705152207, + 40.31747359663594127180, 43.71178704119000104200, + 47.17334509576013892806, 50.69963132571695247884, + 54.28835233189813142998, 57.93740770400353405834, + 61.64486527441851665347, 65.40894053658600598618, + 69.22797937475560235079, 73.10044345532165163727, + 77.02489777859163322491, 81.00000000000000000000, + 85.02449121251855054238, 89.09718794488957150508, + 93.21697517861576600561, 97.38280022413318313809, + 101.59366732596476638327, 105.84863288986227408821, + 110.14680124343443505670, 114.48732085660064048617, + 118.86938096020656061830, 123.29220851090027062178, + 127.75506545836060596244, 132.25724627755250371381, + 136.79807573413575914734, 141.37690685569194574577, + 145.99311908523089104057, 150.64611659662913933484, + 155.33532675434677209529, 160.06019870205282626894, + 164.82020206673353832582, 169.61482576651865039408, + 174.44357691188540725200, 179.30597979112560434389, + 184.20157493201933028622, 189.12991823257566310337, + 194.09058015449690863083, 199.08314497371681634792, + 204.10721008296945269011, 209.16238534187653901861, + 214.24829247050757933085, 219.36456448277788891331, + 224.51084515641221133822, 229.68678853652237223860, + 234.89205847013181572378, 240.12632816923256494511, + 245.38927980018513969113, 250.68060409747268715691, + 256.00000000000000000000, 261.34717430828876844414, + 266.72184136106455787047, 272.12372272986054586756, + 277.55254693037966879699, 283.00804914946197900670, + 288.48997098659897735513, 293.99806020902258074661, + 299.53207051947419248945, 305.09176133582992811722, + 310.67689758182217143506, 316.28724948815596606218, + 321.92259240337188045261, 327.58270661385544475227, + 333.26737717243751234639, 338.97639373507036181617, + 344.70955040510139547588, 350.46664558470023690369, + 356.24748183302617593933, 362.05186573075151786620, + 367.87960775058269831798, 373.73052213344523844239, + 379.60442677002092443080, 385.50114308734617184858, + 391.42049594019953172189, 397.36231350702384937148, + 403.32642719014482378002, 409.31267152006274646544, + 415.32088406360812690827, 421.35090533576482825936, + 427.40257871497632601129, 433.47575036176183911002, + 439.57026914047943723453, 445.68598654408286118715, + 451.82275662172776382183, 457.98043590909143751160, + 464.15888336127788923421, 470.35796028818739866912, + 476.57753029223648782021, 482.81745920832057938659, + 489.07761504591755781262, 495.35786793323600251610, + 501.65809006331706535811, 507.97815564200383854506, + 514.31794083769662981941, 520.67732373281684917378, + 527.05618427690623677486, 533.45440424129194197023, + 539.87186717525151688967, 546.30845836361522948115, + 552.76406478574624458604, 559.23857507584218167368, + 565.73187948450434582522, 572.24386984152355579202, + 578.77443951983397081167, 585.32348340058865499255, + 591.89089783931282434796, 598.47658063309280506205, + 605.08043098876069996084, 611.70234949203662112128, + 618.34223807759210601741, 625.00000000000000000000, + 631.67553980553766357232, 638.36876330481185599386, + 645.07957754617506035597, 651.80789078990435598324, + 658.55361248311521501881, 665.31665323538380544696, + 672.09692479505252760063, 678.89434002619459701705, + 685.70881288621451907474, 692.54025840406228068201, + 699.38859265904001667978, 706.25373276018079478853, + 713.13559682618000593854, 720.03410396586064910582, + 726.94917425915456366424, 733.88072873858238939593, + 740.82868937121572754752, 747.79297904110563613885, + 754.77352153216222284228, 761.77024151147069871214, + 768.78306451302982865267, 775.81191692189926159948, + 782.85672595874274425816, 789.91741966475472119892, + 796.99392688695829953156, 804.08617726386301105625, + 811.19410121147123967046, 818.31762990962259694715, + 825.45669528866592656295, 832.61123001644899795861, + 839.78116748561631393306, 846.96644180120580445741, + 854.16698776853551318295, 861.38274088137170167004, + 868.61363731037010287198, 875.85961389178234827331, + 883.12060811641987421145, 890.39655811886788240221, + 897.68740266694218788475, 904.99308115138203573017, + 912.31353357577220569881, 919.64870054668795194525, + 926.99852326405654493458, 934.36294351172939189390, + 941.74190364825891581901, 949.13534659787456579093, + 956.54321584165251919905, 963.96545540887381510030, + 971.40200986856583079545, 978.85282432122217951383, + 986.31784439069626646659, 993.79701621626389429314, + 1001.29028644485045643113, 1008.79760222341839923538, + 1016.31891119151077035601, 1023.85416147394680285920, + 1031.40330167366561163045, 1038.96628086471420034155, + 1046.54304858537609578013, 1054.13355483143703939331, + 1061.73775004958427555737, 1069.35558513093608150558, + 1076.98701140469828584568, 1084.63198063194462037109, + 1092.29044499951784480280, 1099.96235711404867558273, + 1107.64766999608963760287, 1115.34633707436104324401, + 1123.05831218010638496227, 1130.78354954155450739684, + 1138.52200377848600103792, 1146.27362989690133392041, + 1154.03838328378830932881, 1161.81621970198650622225, + 1169.60709528514642619770, 1177.41096653278113548740, + 1185.22779030540825227308, 1193.05752381978019055519, + 1200.90012464420063014857, 1208.75555069392523822539, + 1216.62376022664472328393, 1224.50471183804835456776, + 1232.39836445746613159991, 1240.30467734358783752798, + 1248.22361008025725843679, 1256.15512257233989682593, + 1264.09917504166255217108, 1272.05572802302318588953, + 1280.02474236026952900065, 1288.00617920244493252267, + 1296.00000000000000000000, 1304.00616650106857938578, + 1312.02464074780672969490, 1320.05538507279331269587, + 1328.09836209549089589253, 1336.15353471876568627698, + 1344.22086612546524725007, 1352.30031977505278348508, + 1360.39185940029680869324, 1368.49544900401504159392, + 1376.61105285587140485715, 1384.73863548922502932755, + 1392.87816169803019348869, 1401.02959653378615546822, + 1409.19290530253585926207, 1417.36805356191252347223, + 1425.55500711823314408286, 1433.75373202363796717790, + 1441.96419457327500999135, 1450.18636130252873140401, + 1458.42019898429197439581, 1466.66567462628032426218, + 1474.92275546838804685322, 1483.19140898008479051460, + 1491.47160285785225609146, 1499.76330502266005625343, + 1508.06648361748000563721, 1516.38110700483809947476, + 1524.70714376440345704507, 1533.04456269061352195578, + 1541.39333279033482841517, 1549.75342328055865850746, + 1558.12480358613093022677, 1566.50744333751567235576, + 1574.90131236859145593904, 1583.30638071448016673656, + 1591.72261860940751701829, 1600.14999648459470852119, + 1608.58848496618067173372, 1617.03805487317431896934, + 1625.49867721543626211788, 1633.97032319168945711235, + 1642.45296418755824970353, 1650.94657177363530877346, + 1659.45111770357594371603, 1667.96657391221931470762, + 1676.49291251373605427623, 1685.03010579980182968210, + 1693.57812623779638539637, 1702.13694646902761503054, + 1710.70653930698022150790, 1719.28687773558853417906, + 1727.87793490753306001649, 1736.47968414256035553342, + 1745.09209892582581461053, 1753.71515290625897572481, + 1762.34881989495096090911, 1770.99307386356366605273, + 1779.64788894276033072739, 1788.31323942065712335581, + 1796.98909974129538437048, 1805.67544450313417848685, + 1814.37224845756281313162, 1823.07948650743298813106, + 1831.79713370561024778071, 1840.52516525354441361073, + 1849.26355649985868223639, 1858.01228293895707941129, + 1866.77132020964996733055, 1875.54064409379730829778, + 1884.32023051496939389886, 1893.11005553712475456384, + 1901.91009536330496989490, 1910.72032633434610589043, + 1919.54072492760651020272, 1928.37126775571070221481, + 1937.21193156530909970921, 1946.06269323585332867860, + 1954.92352977838686823377, 1963.79441833435078658320, + 1972.67533617440432995075, 1981.56626069726012933804, + 1990.46716942853379578240, 1999.37804001960767870357, + 2008.29885024650856563799, 2017.22957800879910723013, + 2026.17020132848275375266, 2035.12069834892199446178, + 2044.08104733376969540137, 2053.05122666591333334706, + 2062.03121484643192958368, 2071.02099049356548902559, + 2080.02053234169675459475, 2089.02981924034509042325, + 2098.04883015317231039884, 2107.07754415700027205791, + 2116.11594044084005944439, 2125.16399830493258112277, + 2134.22169715980041368706, 2143.28901652531072254494, + 2152.36593602974909707389, 2161.45243540890413759114, + 2170.54849450516263667159, 2179.65409326661519891827, + 2188.76921174617214635986, 2197.89383010068955948111, + 2207.02792859010530656136, 2216.17148757658491620189, + 2225.32448752367715099525, 2234.48690899547914244191, + 2243.65873265581094990134, 2252.83993926739940822900, + 2262.03050969107113193485, 2271.23042488495454521456, + 2280.43966590369080978218, 2289.65821389765352475883, + 2298.88605011217707485783, 2308.12315588679350497977, + 2317.36951265447780206959, 2326.62510194090146635951, + 2335.88990536369425665173, 2345.16390463171399625936, + 2354.44708154432432710568, 2363.73941799068030339571, + 2373.04089594902171590868, 2382.35149748597404119111, + 2391.67120475585691100925, 2401.00000000000000000000, + 2410.33786554606622936004, 2419.68478380738218880719, + 2429.04073728227567767649, 2438.40570855342027001293, + 2447.77968028718680898823, 2457.16263523300173722970, + 2466.55455622271217223446, 2475.95542616995763639656, + 2485.36522806954835350253, 2494.78394499685002421155, + 2504.21156010717499516846, 2513.64805663517973736423, + 2523.09341789426855039372, 2532.54762727600341175530, + 2542.01066824951988970990, 2551.48252436094904179178, + 2560.96317923284522030583, 2570.45261656361970836095, + 2579.95082012698011153459, 2589.45777377137543011521, + 2598.97346141944673962837, 2608.49786706748340700482, + 2618.03097478488477244764, 2627.57276871362722634970, + 2637.12323306773661321603, 2646.68235213276589484101, + 2656.25011026527800629933, 2665.82649189233383886000, + 2675.41148151098528600189, 2685.00506368777328803208, + 2694.60722305823081375417, 2704.21794432639071681693, + 2713.83721226429840630831, 2723.46501171152927180431, + 2733.10132757471080422102, 2742.74614482704935401302, + 2752.39944850786146976073, 2762.06122372210976129745, + 2771.73145563994323122640, 2781.41012949624202083838, + 2791.09723059016651603505, 2800.79274428471076089283, + 2810.49665600626012615697, 2820.20895124415318114955, + 2829.92961555024771902502, 2839.65863453849088445739, + 2849.39599388449335539114, 2859.14167932510752976443, + 2868.89567665800966950546, 2878.65797174128595490861, + 2888.42855049302240274501, 2898.20739889089860213409, + 2907.99450297178522342112, 2917.78984883134525549784, + 2927.59342262363892738373, 2937.40521056073227132648, + 2947.22519891230928461227, 2957.05337400528764764422, + 2966.88972222343795795776, 2976.73423000700643820062, + 2986.58688385234107848682, 2996.44767031152117328537, + 3006.31657599199021347845, 3016.19358755619209563972, + 3026.07869172121060962696, 3035.97187525841216786546, + 3045.87312499309173830491, 3055.78242780412194573689, + 3065.69977062360530431151, 3075.62514043652954696498, + 3085.55852428042601551033, 3095.49990924503107792656, + 3105.44928247195053809670, 3115.40663115432700493820, + 3125.37194253651018711372, 3135.34520391373008166446, + 3145.32640263177302305956, 3155.31552608666056211642, + 3165.31256172433114230614, 3175.31749704032454349396, + 3185.33031957946906157026, 3195.35101693557139501636, + 3205.37957675110920726017, 3215.41598671692633695265, + 3225.46023457193062612391, 3235.51230810279433813198, + 3245.57219514365713714379, 3255.63988357583160145749, + 3265.71536132751124304541, 3275.79861637348100614534, + 3285.88963673483021850807, 3295.98841047866796875294, + 3306.09492571784088369122, 3316.20917061065327974332, + 3326.33113336058966400132, 3336.46080221603955851080, + 3346.59816547002462430149, 3356.74321145992806000841, + 3366.89592856722625133717, 3377.05630521722264744393, + 3387.22432987878384105568, 3397.39999106407782850466, + 3407.58327732831442777872, 3417.77417726948783081903, + 3427.97267952812126929741, 3438.17877278701376998757, + 3448.39244577098897963983, 3458.61368724664603711446, + 3468.84248602211247151468, 3479.07883094679910570283, + 3489.32271091115694452744, 3499.57411484643602694966, + 3509.83303172444622261685, 3520.09945055731995207868, + 3530.37336039727681180980, 3540.65475033639008443415, + 3550.94360950635511419560, 3561.23992707825953026111, + 3571.54369226235529746609, 3581.85489430783257756550, + 3592.17352250259538137946, 3602.49956617303899469964, + 3612.83301468382916011676, 3623.17385743768299671973, + 3633.52208387515164043012, 3643.87768347440458818515, + 3654.24064575101572849320, 3664.61096025775104210727, + 3674.98861658435795582168, 3685.37360435735633314170, + 3695.76591323983108607973, 3706.16553293122639147692, + 3716.57245316714149657125, 3726.98666371912809803252, + 3737.40815439448927900602, 3747.83691503607998890009, + 3758.27293552210905158456, 3768.71620576594268574038, + 3779.16671571590952406431, 3789.62445535510711613307, + 3800.08941470120990058954, 3810.56158380627863273143, + 3821.04095275657125316944, 3831.52751167235518402572, + 3842.02125070772103908753, 3852.52216005039773354970, + 3863.03022992156898112320, 3873.54545057569116485685, + 3884.06781230031256788788, 3894.59730541589395251890, + 3905.13392027563047362763, 3915.67764726527491511764, + 3926.22847680296223506229, 3936.78639933903540953137, + 3947.35140535587256080042, 3957.92348536771535935521, + 3968.50262992049868683036, 3979.08882959168154890793, + 3989.68207499007922574244, 4000.28235675569664914646, + 4010.88966555956299447478, 4021.50399210356747655837, + 4032.12532712029633791399, 4042.75366137287101918383, + 4053.38898565478749960955, 4064.03129078975679807556, + 4074.68056763154662330038, 4085.33680706382416263069, + 4096.00000000000000000000, 4106.67013738307315078222, + 4117.34721018547720623528, 4128.03120940892757431586, + 4138.72212608426980951926, 4149.41995127132902020943, + 4160.12467605876034467899, 4170.83629156390048577850, + 4181.55478893262029506899, 4192.28015933917839616801, + 4203.01239398607583929801, 4213.75148410391177646350, + 4224.49742095124014948910, 4235.25019581442738064250, + 4246.00980000751105750209, 4256.77622487205960371218, + 4267.54946177703292593209, 4278.32950211864402879055, + 4289.11633732022158978791, 4299.90995883207348494138, + 4310.71035813135125700262, 4321.51752672191551845492, + 4332.33145613420228011936, 4343.15213792509019866919, + 4353.97956367776873388570, 4364.81372500160720769251, + 4375.65461353202475838577, 4386.50222093036118091515, + 4397.35653888374864582436, 4408.21755910498429043578, + 4419.08527333240367268619, 4429.95967332975508245848, + 4440.84075088607470071224, 4451.72849781556260149140, + 4462.62290595745958760268, 4473.52396717592485378736, + 4484.43167335991447074703, 4495.34601642306068195203, + 4506.26698830355200656809, 4517.19458096401414299031, + 4528.12878639139166406679, 4539.06959659683049913613, + 4550.01700361556119502535, 4560.97099950678295016481, + 4571.93157635354841514175, 4582.89872626264925288657, + 4593.87244136450245283440, 4604.85271381303739213234, + 4615.83953578558363764099, 4626.83289948275948335408, + 4637.83279712836121605897, 4648.83922096925310379868, + 4659.85216327525810113911, 4670.87161633904926523501, + 4681.89757247604187653725, 4692.93002402428625872167, + 4703.96896334436129199791, 4715.01438281926861376317, + 4726.06627485432750178902, 4737.12463187707043306490, + 4748.18944633713931411373, 4759.26071070618237639862, + 4770.33841747775173168417, 4781.42255916720158215385, + 4792.51312831158707983646, 4803.61011746956382960024, + 4814.71351922128803175051, 4825.82332616831725755390, + 4836.93953093351185357207, 4848.06212616093696991768, + 4859.19110451576520574858, 4870.32645868417987021484, + 4881.46818137327884988080, 4892.61626531097908148277, + 4903.77070324592162282226, 4914.93148794737731830133, + 4926.09861220515305304894, 4937.27206882949859286685, + 4948.45185065101400370761, 4959.63795052055764637908, + 4970.83036130915474296638, 4982.02907590790650920278, + 4993.23408722789984897689, 5004.44538820011760647470, + 5015.66297177534937157352, 5026.88683092410283414352, + 5038.11695863651568266957, 5049.35334792226804374128, + 5060.59599181049545700030, 5071.84488334970238307574, + 5083.10001560767623794548, 5094.36138167140195238055, + 5105.62897464697705021443, 5116.90278765952724278460, + 5128.18281385312253464555, 5139.46904639069383739266, + 5150.76147845395008724735, 5162.06010324329586226046, + 5173.36491397774949620901, 5184.67590389486168473015, + 5195.99306625063457946696, 5207.31639431944136777275, + 5218.64588139394633349310, 5229.98152078502539476210, + 5241.32330582168711604207, 5252.67122985099419082825, + 5264.02528623798539017136, 5275.38546836559797512686, + 5286.75176963459056894345, 5298.12418346346648492902, + 5309.50270328839750768337, 5320.88732256314812363853, + 5332.27803475900019749466, 5343.67483336467809167120, + 5355.07771188627422464538, 5366.48666384717506608493, + 5377.90168278798756453909, 5389.32276226646600480462, + 5400.74989585743929171310, 5412.18307715273865739103, + 5423.62229976112578906462, 5435.06755730822137274201, + 5446.51884343643405268681, 5457.97615180488980016543, + 5469.43947608936169134078, 5480.90880998220008944137, + 5492.38414719226322928148, 5503.86548144484820056943, + 5515.35280648162232767522, 5526.84611606055494206099, + 5538.34540395584954594062, 5549.85066395787636263065, + 5561.36188987310527215822, 5572.87907552403912848766, + 5584.40221474914745648420, 5595.93130140280052425440, + 5607.46632935520379040912, 5619.00729249233272160991, + 5630.55418471586797863175, 5642.10699994313096796533, + 5653.66573210701975733484, 5665.23037515594535039405, + 5676.80092305376832011338, 5688.37736977973579808574, + 5699.95970932841881497846, 5711.54793570964999330223, + 5723.14204294846158631490, 5734.74202508502386342409, + 5746.34787617458383784274, 5757.95959028740433508500, + 5769.57716150870339937682, 5781.20058393859403575522, + 5792.82985169202428586548, 5804.46495889871763400807, + 5816.10589970311374244488, 5827.75266826430951326733, + 5839.40525875600047331188, 5851.06366536642248232785, + 5862.72788229829375934747, 5874.39790376875722747797, + 5886.07372400932317303513, 5897.75533726581221821409, + 5909.44273779829860414349, 5921.13591988105378255449, + 5932.83487780249031468554, 5944.53960586510607315938, + 5956.25009838542874748271, 5967.96634969396064926063, + 5979.68835413512381508465, 5991.41610606720540610287, + 6003.14959986230340175701, 6014.88882990627258469111, + 6026.63379059867081659247, 6038.38447635270560190282, + 6050.14088159518093714526, 6061.90300076644444515159, + 6073.67082832033479083862, 6085.44435872412937778478, + 6097.22358645849232292250, 6109.00850601742270810388, + 6120.79911190820310563222, 6132.59539865134837750251, + 6144.39736078055474512803, 6156.20499284264912773514, + 6168.01828939753874964564, 6179.83724501816101087963, + 6191.66185429043362385814, 6203.49211181320501021897, + 6215.32801219820495899381, 6227.16955006999554278829, + 6239.01672006592229121176, 6250.86951683606561894385, + 6262.72793504319250755710, 6274.59196936270843845418, + 6286.46161448260957694235, 6298.33686510343520349244, + 6310.21771593822039276018, 6322.10416171244893688591, + 6333.99619716400651305005, 6345.89381704313409249180, + 6357.79701611238158988695, 6369.70578914656175197088, + 6381.62013093270428235943, 6393.54003627001020304581, + 6405.46549996980644951853, 6417.39651685550069817135, + 6429.33308176253642558822, 6441.27518953834819653438, + 6453.22283504231718055181, 6465.17601314572689473778, + 6477.13471873171917212961, 6489.09894669525035361295, + 6501.06869194304770142251, 6513.04394939356603447102, + 6525.02471397694458232645, 6537.01098063496405738785, + 6549.00274432100394351959, 6561.00000000000000000000, + 6573.00274264840197907197, 6585.01096725413155631842, + 6597.02466881654047148971, 6609.04384234636887939973, + 6621.06848286570390962714, 6633.09858540793843229335, + 6645.13414501773003047301, 6657.17515675096017665240, + 6669.22161567469361224125, 6681.27351686713792941814, + 6693.33085541760335312165, 6705.39362642646272231859, + 6717.46182500511166973889, 6729.53544627592899810861, + 6741.61448537223725215708, 6753.69893743826348483974, + 6765.78879762910021658207, 6777.88406111066658705365, + 6789.98472305966969690639, 6802.09077866356613942311, + 6814.20222312052372075341, 6826.31905163938336666512, + 6838.44125943962121618801, 6850.56884175131089945917, + 6862.70179381508599938037, 6874.84011088210269634835, + 6886.98378821400259399540, 6899.13282108287572501106, + 6911.28720477122373691708, 6923.44693457192325563853, + 6935.61200578818942583722, 6947.78241373353962741599, + 6959.95815373175736693294, 6972.13922111685634302592, + 6984.32561123304468356362, 6996.51731943468935607670, + 7008.71434108628074710341, 7020.91667156239741249389, + 7033.12430624767099576007, 7045.33724053675131321109, + 7057.55546983427160692410, 7069.77898955481396265025, + 7082.00779512287489161680, 7094.24188197283107686025, + 7106.48124554890528130421, 7118.72588130513241758149, + 7130.97578470532577893077, 7143.23095122304342902888, + 7155.49137634155475034353, 7167.75705555380715104744, + 7180.02798436239292783509, 7192.30415827951628499159, + 7204.58557282696050807078, 7216.87222353605529190470, + 7229.16410594764422115706, 7241.46121561205240328318, + 7253.76354808905425274642, 7266.07109894784142525374, + 7278.38386376699090206390, 7290.70183813443322186472, + 7303.02501764742086110393, 7315.35339791249676095048, + 7327.68697454546300019352, 7340.02574317134961247545, + 7352.36969942438354907735, 7364.71883894795778397085, + 7377.07315739460056168550, 7389.43265042594478740465, + 7401.79731371269755702865, 7414.16714293460982776414, + 7426.54213378044622775532, 7438.92228194795500484219, + 7451.30758314383811142479, 7463.69803308372142754257, + 7476.09362749212511916383, 7488.49436210243413217391, + 7500.90023265686882001713, 7513.31123490645570638402, + 7525.72736461099837871413, 7538.14861753904851599415, + 7550.57498946787704637205, 7563.00647618344543624577, + 7575.44307348037710802987, 7587.88477716192898884021, + 7600.33158303996318558849, 7612.78348693491878936343, + 7625.24048467578380513161, 7637.70257210006720890322, + 7650.16974505377112961555, 7662.64199939136315583508, + 7675.11933097574876712015, 7687.60173567824388692928, + 7700.08920937854756073745, 7712.58174796471475346778, + 7725.07934733312927027112, 7737.58200338847679579618, + 7750.08971204371805550856, 7762.60246922006209438555, + 7775.12027084693967473241, 7787.64311286197679203067, + 7800.17099121096830812588, 7812.70390184785169990017, + 7825.24184073468092493210, 7837.78480384160040191734, + 7850.33278714681910501999, 7862.88578663658477368105, + 7875.44379830515823408240, 7888.00681815478783417799, + 7900.57484219568399051786, 7913.14786644599384617545, + 7925.72588693177604026621, 7938.30889968697558637233, + 7950.89690075339886199671, 7963.48988618068870553391, + 7976.08785202629962245361, 7988.69079435547309920497, + 8001.29870924121302363592, 8013.91159276426121269163, + 8026.52944101307304565823, 8039.15225008379320278156, + 8051.78001608023150890370, 8064.41273511383888132599, + 8077.05040330368338082659, 8089.69301677642636665882, + 8102.34057166629875317403, 8114.99306411507736889548, + 8127.65049027206141672979, 8140.31284629404903582077, + 8152.98012834531396217282, 8165.65233259758229072790, + 8178.32945523000933527156, 8191.01149242915658802209, + 8203.69844038896877663000, 8216.39029531075101944113, + 8229.08705340314607703717, 8241.78871088211170136849, + 8254.49526397089807995722, 8267.20670890002537611481, + 8279.92304190726136400070, 8292.64425923759915859953, + 8305.37035714323503855602, 8318.10133188354636412492, + 8330.83717972506958670621, 8343.57789694147835174732, + 8356.32347981356169273434, 8369.07392462920231766098, + 8381.82922768335498620538, 8394.58938527802497683936, + 8407.35439372224664477349, 8420.12424933206206896317, + 8432.89894843049978849116, 8445.67848734755362729685, + 8458.46286242016160747911, 8471.25206999218494970727, + 8484.04610641438716120590, 8496.84496804441321059084, + 8509.64865124676878864997, 8522.45715239279965516631, + 8535.27046786067107144753, 8548.08859403534731718578, + 8560.91152730857129187036, 8573.73926407884420113728, + 8586.57180075140532568189, 8599.40913373821187349859, + 8612.25125945791891603130, 8625.09817433585940440776, + 8637.94987480402427015764, 8650.80635730104260524297, + 8663.66761827216192428881, 8676.53365416922850688004, + 8689.40446145066782060646, 8702.28003658146502360539, + 8715.16037603314554565620, 8728.04547628375574998272, + 8740.93533381784367170779, 8753.82994512643983591489, + 8766.72930670703815266216, 8779.63341506357688956440, + 8792.54226670641972103486, 8805.45585815233685463950, + 8818.37418592448623295485, 8831.29724655239481182245, + 8844.22503657193991329768, 8857.15755252533065409682, + 8870.09479096108944853748, 8883.03674843403358526677, + 8895.98342150525687870682, 8908.93480674211139299288, + 8921.89090071818923967331, 8934.85170001330444790407, + 8947.81720121347490669911, 8960.78740091090438026442, + 8973.76229570396459291488, 8986.74188219717738752686, + 8999.72615700119695318995, 9012.71511673279212446349, + 9025.70875801482875019123, 9038.70707747625213191330, + 9051.71007175206953312281, 9064.71773748333275594355, + 9077.73007131712078715054, 9090.74706990652251368607, + 9103.76872991061950484766, 9116.79504799446886251108, + 9129.82602082908613942191, 9142.86164509142832424162, + 9155.90191746437689268222, 9168.94683463672092627827, + 9181.99639330314029606730, 9195.05059016418891276019, + 9208.10942192627804188897, 9221.17288530165968454069, + 9234.24097700841002200150, 9247.31369377041292633080, + 9260.39103231734353299664, 9273.47298938465187946356, + 9286.55956171354660560232, 9299.65074605097871845192, + 9312.74653914962541915552, 9325.84693776787399248864, + 9338.95193866980575913278, 9352.06153862518008973572, + 9365.17573440941847989094, 9378.29452280358868760422, + 9391.41790059438893098935, 9404.54586457413214701816, + 9417.67841154073031065777, 9430.81553829767881457275, + 9443.95724165404090730863, 9457.10351842443219324286, + 9470.25436542900518957756, 9483.40977949343394413155, + 9496.56975744889871041871, 9509.73429613207068207016, + 9522.90339238509678525100, 9536.07704305558452818162, + 9549.25524499658690982059, 9562.43799506658738376092, + 9575.62529012948488100320, 9588.81712705457888830451, + 9602.01350271655458365615, 9615.21441399546802737649, + 9628.41985777673141016949, 9641.62983095109835478100, + 9654.84433041464927614229, 9668.06335306877679352549, + 9681.28689582017119948074, 9694.51495558080598280444, + 9707.74752926792340594895, 9720.98461380402013630368, + 9734.22620611683293173133, 9747.47230313932437868574, + 9760.72290180966868520666, 9773.97799907123752523169, + 9787.23759187258593795101, 9800.50167716743827644733, + 9813.77025191467421224699, 9827.04331307831478939152, + 9840.32085762750853119418, 9853.60288253651759901763, + 9866.88938478470400149335, 9880.18036135651585503519, + 9893.47580924147369628929, 9906.77572543415684308519, + 9920.08010693418980803143, 9933.38895074622876047662, + 9946.70225387994803934974, 9960.02001335002671561073, + 9973.34222617613520310298, 9986.66888938292192045504, + 10000.00000000000000000000, 10013.33555506193404666240, + 10026.67555160822694520477, 10040.01998668330671538322, + 10053.36885733651341520795, 10066.72216062208609227387, + 10080.07989359914978294520, 10093.44205333170255827926, + 10106.80863688860261716795, 10120.17964134355542735065, + 10133.55506377510091249443, 10146.93490126660068500663, + 10160.31915090622532695087, 10173.70780978694171573050, + 10187.10087500650039581928, 10200.49834366742299677666, + 10213.90021287698969591272, 10227.30647974722672687969, + 10240.71714139489393278014, 10254.13219494147236458541, + 10267.55163751315192418952, 10280.97546624081905065854, + 10294.40367826004445332739, 10307.83627071107088560176 +]; -- 2.39.5