aac: use lookup table for coefficient quantisation
authorKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 2 Apr 2022 10:03:31 +0000 (12:03 +0200)
committerKostya Shishkov <kostya.shishkov@gmail.com>
Sat, 2 Apr 2022 10:03:31 +0000 (12:03 +0200)
nihav-mpeg/src/codecs/aac/coeff_read.rs
nihav-mpeg/src/codecs/aac/mod.rs
nihav-mpeg/src/codecs/aac/tables.rs

index 4a92f0ace68cd9b3e10daa443e5190c4ff98e555..63a86aaebe33f601a056de99741c65b352df2a91 100644 (file)
@@ -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<u16>, 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<u16>, 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(())
 }
index 7233f52ebbb361b2305c23b14ee2d72267e526fd..795464b2582d4a796760844cb21c3ec843438035 100644 (file)
@@ -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;
             }
         }
     }
index bff913061f5dbc7b502b6907b66f184db3fc1813..1536127f723b7612c5ba77bc377098a3f9f7da8e 100644 (file)
@@ -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
+];