1a0698ed9Schristos #include "test/jemalloc_test.h" 2a0698ed9Schristos 3a0698ed9Schristos #define MAX_REL_ERR 1.0e-9 4a0698ed9Schristos #define MAX_ABS_ERR 1.0e-9 5a0698ed9Schristos 6a0698ed9Schristos #include <float.h> 7a0698ed9Schristos 8a0698ed9Schristos #ifdef __PGI 9a0698ed9Schristos #undef INFINITY 10a0698ed9Schristos #endif 11a0698ed9Schristos 12a0698ed9Schristos #ifndef INFINITY 13a0698ed9Schristos #define INFINITY (DBL_MAX + DBL_MAX) 14a0698ed9Schristos #endif 15a0698ed9Schristos 16a0698ed9Schristos static bool 17a0698ed9Schristos double_eq_rel(double a, double b, double max_rel_err, double max_abs_err) { 18a0698ed9Schristos double rel_err; 19a0698ed9Schristos 20a0698ed9Schristos if (fabs(a - b) < max_abs_err) { 21a0698ed9Schristos return true; 22a0698ed9Schristos } 23a0698ed9Schristos rel_err = (fabs(b) > fabs(a)) ? fabs((a-b)/b) : fabs((a-b)/a); 24a0698ed9Schristos return (rel_err < max_rel_err); 25a0698ed9Schristos } 26a0698ed9Schristos 27a0698ed9Schristos static uint64_t 28a0698ed9Schristos factorial(unsigned x) { 29a0698ed9Schristos uint64_t ret = 1; 30a0698ed9Schristos unsigned i; 31a0698ed9Schristos 32a0698ed9Schristos for (i = 2; i <= x; i++) { 33a0698ed9Schristos ret *= (uint64_t)i; 34a0698ed9Schristos } 35a0698ed9Schristos 36a0698ed9Schristos return ret; 37a0698ed9Schristos } 38a0698ed9Schristos 39a0698ed9Schristos TEST_BEGIN(test_ln_gamma_factorial) { 40a0698ed9Schristos unsigned x; 41a0698ed9Schristos 42a0698ed9Schristos /* exp(ln_gamma(x)) == (x-1)! for integer x. */ 43a0698ed9Schristos for (x = 1; x <= 21; x++) { 44*7bdf38e5Schristos expect_true(double_eq_rel(exp(ln_gamma(x)), 45a0698ed9Schristos (double)factorial(x-1), MAX_REL_ERR, MAX_ABS_ERR), 46a0698ed9Schristos "Incorrect factorial result for x=%u", x); 47a0698ed9Schristos } 48a0698ed9Schristos } 49a0698ed9Schristos TEST_END 50a0698ed9Schristos 51a0698ed9Schristos /* Expected ln_gamma([0.0..100.0] increment=0.25). */ 52a0698ed9Schristos static const double ln_gamma_misc_expected[] = { 53a0698ed9Schristos INFINITY, 54a0698ed9Schristos 1.28802252469807743, 0.57236494292470008, 0.20328095143129538, 55a0698ed9Schristos 0.00000000000000000, -0.09827183642181320, -0.12078223763524518, 56a0698ed9Schristos -0.08440112102048555, 0.00000000000000000, 0.12487171489239651, 57a0698ed9Schristos 0.28468287047291918, 0.47521466691493719, 0.69314718055994529, 58a0698ed9Schristos 0.93580193110872523, 1.20097360234707429, 1.48681557859341718, 59a0698ed9Schristos 1.79175946922805496, 2.11445692745037128, 2.45373657084244234, 60a0698ed9Schristos 2.80857141857573644, 3.17805383034794575, 3.56137591038669710, 61a0698ed9Schristos 3.95781396761871651, 4.36671603662228680, 4.78749174278204581, 62a0698ed9Schristos 5.21960398699022932, 5.66256205985714178, 6.11591589143154568, 63a0698ed9Schristos 6.57925121201010121, 7.05218545073853953, 7.53436423675873268, 64a0698ed9Schristos 8.02545839631598312, 8.52516136106541467, 9.03318691960512332, 65a0698ed9Schristos 9.54926725730099690, 10.07315123968123949, 10.60460290274525086, 66a0698ed9Schristos 11.14340011995171231, 11.68933342079726856, 12.24220494005076176, 67a0698ed9Schristos 12.80182748008146909, 13.36802367147604720, 13.94062521940376342, 68a0698ed9Schristos 14.51947222506051816, 15.10441257307551943, 15.69530137706046524, 69a0698ed9Schristos 16.29200047656724237, 16.89437797963419285, 17.50230784587389010, 70a0698ed9Schristos 18.11566950571089407, 18.73434751193644843, 19.35823122022435427, 71a0698ed9Schristos 19.98721449566188468, 20.62119544270163018, 21.26007615624470048, 72a0698ed9Schristos 21.90376249182879320, 22.55216385312342098, 23.20519299513386002, 73a0698ed9Schristos 23.86276584168908954, 24.52480131594137802, 25.19122118273868338, 74a0698ed9Schristos 25.86194990184851861, 26.53691449111561340, 27.21604439872720604, 75a0698ed9Schristos 27.89927138384089389, 28.58652940490193828, 29.27775451504081516, 76a0698ed9Schristos 29.97288476399884871, 30.67186010608067548, 31.37462231367769050, 77a0698ed9Schristos 32.08111489594735843, 32.79128302226991565, 33.50507345013689076, 78a0698ed9Schristos 34.22243445715505317, 34.94331577687681545, 35.66766853819134298, 79a0698ed9Schristos 36.39544520803305261, 37.12659953718355865, 37.86108650896109395, 80a0698ed9Schristos 38.59886229060776230, 39.33988418719949465, 40.08411059791735198, 81a0698ed9Schristos 40.83150097453079752, 41.58201578195490100, 42.33561646075348506, 82a0698ed9Schristos 43.09226539146988699, 43.85192586067515208, 44.61456202863158893, 83a0698ed9Schristos 45.38013889847690052, 46.14862228684032885, 46.91997879580877395, 84a0698ed9Schristos 47.69417578616628361, 48.47118135183522014, 49.25096429545256882, 85a0698ed9Schristos 50.03349410501914463, 50.81874093156324790, 51.60667556776436982, 86a0698ed9Schristos 52.39726942748592364, 53.19049452616926743, 53.98632346204390586, 87a0698ed9Schristos 54.78472939811231157, 55.58568604486942633, 56.38916764371992940, 88a0698ed9Schristos 57.19514895105859864, 58.00360522298051080, 58.81451220059079787, 89a0698ed9Schristos 59.62784609588432261, 60.44358357816834371, 61.26170176100199427, 90a0698ed9Schristos 62.08217818962842927, 62.90499082887649962, 63.73011805151035958, 91a0698ed9Schristos 64.55753862700632340, 65.38723171073768015, 66.21917683354901385, 92a0698ed9Schristos 67.05335389170279825, 67.88974313718154008, 68.72832516833013017, 93a0698ed9Schristos 69.56908092082363737, 70.41199165894616385, 71.25703896716800045, 94a0698ed9Schristos 72.10420474200799390, 72.95347118416940191, 73.80482079093779646, 95a0698ed9Schristos 74.65823634883015814, 75.51370092648485866, 76.37119786778275454, 96a0698ed9Schristos 77.23071078519033961, 78.09222355331530707, 78.95572030266725960, 97a0698ed9Schristos 79.82118541361435859, 80.68860351052903468, 81.55795945611502873, 98a0698ed9Schristos 82.42923834590904164, 83.30242550295004378, 84.17750647261028973, 99a0698ed9Schristos 85.05446701758152983, 85.93329311301090456, 86.81397094178107920, 100a0698ed9Schristos 87.69648688992882057, 88.58082754219766741, 89.46697967771913795, 101a0698ed9Schristos 90.35493026581838194, 91.24466646193963015, 92.13617560368709292, 102a0698ed9Schristos 93.02944520697742803, 93.92446296229978486, 94.82121673107967297, 103a0698ed9Schristos 95.71969454214321615, 96.61988458827809723, 97.52177522288820910, 104a0698ed9Schristos 98.42535495673848800, 99.33061245478741341, 100.23753653310367895, 105a0698ed9Schristos 101.14611615586458981, 102.05634043243354370, 102.96819861451382394, 106a0698ed9Schristos 103.88168009337621811, 104.79677439715833032, 105.71347118823287303, 107a0698ed9Schristos 106.63176026064346047, 107.55163153760463501, 108.47307506906540198, 108a0698ed9Schristos 109.39608102933323153, 110.32063971475740516, 111.24674154146920557, 109a0698ed9Schristos 112.17437704317786995, 113.10353686902013237, 114.03421178146170689, 110a0698ed9Schristos 114.96639265424990128, 115.90007047041454769, 116.83523632031698014, 111a0698ed9Schristos 117.77188139974506953, 118.70999700805310795, 119.64957454634490830, 112a0698ed9Schristos 120.59060551569974962, 121.53308151543865279, 122.47699424143097247, 113a0698ed9Schristos 123.42233548443955726, 124.36909712850338394, 125.31727114935689826, 114a0698ed9Schristos 126.26684961288492559, 127.21782467361175861, 128.17018857322420899, 115a0698ed9Schristos 129.12393363912724453, 130.07905228303084755, 131.03553699956862033, 116a0698ed9Schristos 131.99338036494577864, 132.95257503561629164, 133.91311374698926784, 117a0698ed9Schristos 134.87498931216194364, 135.83819462068046846, 136.80272263732638294, 118a0698ed9Schristos 137.76856640092901785, 138.73571902320256299, 139.70417368760718091, 119a0698ed9Schristos 140.67392364823425055, 141.64496222871400732, 142.61728282114600574, 120a0698ed9Schristos 143.59087888505104047, 144.56574394634486680, 145.54187159633210058, 121a0698ed9Schristos 146.51925549072063859, 147.49788934865566148, 148.47776695177302031, 122a0698ed9Schristos 149.45888214327129617, 150.44122882700193600, 151.42480096657754984, 123a0698ed9Schristos 152.40959258449737490, 153.39559776128982094, 154.38281063467164245, 124a0698ed9Schristos 155.37122539872302696, 156.36083630307879844, 157.35163765213474107, 125a0698ed9Schristos 158.34362380426921391, 159.33678917107920370, 160.33112821663092973, 126a0698ed9Schristos 161.32663545672428995, 162.32330545817117695, 163.32113283808695314, 127a0698ed9Schristos 164.32011226319519892, 165.32023844914485267, 166.32150615984036790, 128a0698ed9Schristos 167.32391020678358018, 168.32744544842768164, 169.33210678954270634, 129a0698ed9Schristos 170.33788918059275375, 171.34478761712384198, 172.35279713916281707, 130a0698ed9Schristos 173.36191283062726143, 174.37212981874515094, 175.38344327348534080, 131a0698ed9Schristos 176.39584840699734514, 177.40934047306160437, 178.42391476654847793, 132a0698ed9Schristos 179.43956662288721304, 180.45629141754378111, 181.47408456550741107, 133a0698ed9Schristos 182.49294152078630304, 183.51285777591152737, 184.53382886144947861, 134a0698ed9Schristos 185.55585034552262869, 186.57891783333786861, 187.60302696672312095, 135a0698ed9Schristos 188.62817342367162610, 189.65435291789341932, 190.68156119837468054, 136a0698ed9Schristos 191.70979404894376330, 192.73904728784492590, 193.76931676731820176, 137a0698ed9Schristos 194.80059837318714244, 195.83288802445184729, 196.86618167288995096, 138a0698ed9Schristos 197.90047530266301123, 198.93576492992946214, 199.97204660246373464, 139a0698ed9Schristos 201.00931639928148797, 202.04757043027063901, 203.08680483582807597, 140a0698ed9Schristos 204.12701578650228385, 205.16819948264117102, 206.21035215404597807, 141a0698ed9Schristos 207.25347005962987623, 208.29754948708190909, 209.34258675253678916, 142a0698ed9Schristos 210.38857820024875878, 211.43552020227099320, 212.48340915813977858, 143a0698ed9Schristos 213.53224149456323744, 214.58201366511514152, 215.63272214993284592, 144a0698ed9Schristos 216.68436345542014010, 217.73693411395422004, 218.79043068359703739, 145a0698ed9Schristos 219.84484974781133815, 220.90018791517996988, 221.95644181913033322, 146a0698ed9Schristos 223.01360811766215875, 224.07168349307951871, 225.13066465172661879, 147a0698ed9Schristos 226.19054832372759734, 227.25133126272962159, 228.31301024565024704, 148a0698ed9Schristos 229.37558207242807384, 230.43904356577689896, 231.50339157094342113, 149a0698ed9Schristos 232.56862295546847008, 233.63473460895144740, 234.70172344281823484, 150a0698ed9Schristos 235.76958639009222907, 236.83832040516844586, 237.90792246359117712, 151a0698ed9Schristos 238.97838956183431947, 240.04971871708477238, 241.12190696702904802, 152a0698ed9Schristos 242.19495136964280846, 243.26884900298270509, 244.34359696498191283, 153a0698ed9Schristos 245.41919237324782443, 246.49563236486270057, 247.57291409618682110, 154a0698ed9Schristos 248.65103474266476269, 249.72999149863338175, 250.80978157713354904, 155a0698ed9Schristos 251.89040220972316320, 252.97185064629374551, 254.05412415488834199, 156a0698ed9Schristos 255.13722002152300661, 256.22113555000953511, 257.30586806178126835, 157a0698ed9Schristos 258.39141489572085675, 259.47777340799029844, 260.56494097186322279, 158a0698ed9Schristos 261.65291497755913497, 262.74169283208021852, 263.83127195904967266, 159a0698ed9Schristos 264.92164979855277807, 266.01282380697938379, 267.10479145686849733, 160a0698ed9Schristos 268.19755023675537586, 269.29109765101975427, 270.38543121973674488, 161a0698ed9Schristos 271.48054847852881721, 272.57644697842033565, 273.67312428569374561, 162a0698ed9Schristos 274.77057798174683967, 275.86880566295326389, 276.96780494052313770, 163a0698ed9Schristos 278.06757344036617496, 279.16810880295668085, 280.26940868320008349, 164a0698ed9Schristos 281.37147075030043197, 282.47429268763045229, 283.57787219260217171, 165a0698ed9Schristos 284.68220697654078322, 285.78729476455760050, 286.89313329542699194, 166a0698ed9Schristos 287.99972032146268930, 289.10705360839756395, 290.21513093526289140, 167a0698ed9Schristos 291.32395009427028754, 292.43350889069523646, 293.54380514276073200, 168a0698ed9Schristos 294.65483668152336350, 295.76660135076059532, 296.87909700685889902, 169a0698ed9Schristos 297.99232151870342022, 299.10627276756946458, 300.22094864701409733, 170a0698ed9Schristos 301.33634706277030091, 302.45246593264130297, 303.56930318639643929, 171a0698ed9Schristos 304.68685676566872189, 305.80512462385280514, 306.92410472600477078, 172a0698ed9Schristos 308.04379504874236773, 309.16419358014690033, 310.28529831966631036, 173a0698ed9Schristos 311.40710727801865687, 312.52961847709792664, 313.65282994987899201, 174a0698ed9Schristos 314.77673974032603610, 315.90134590329950015, 317.02664650446632777, 175a0698ed9Schristos 318.15263962020929966, 319.27932333753892635, 320.40669575400545455, 176a0698ed9Schristos 321.53475497761127144, 322.66349912672620803, 323.79292633000159185, 177a0698ed9Schristos 324.92303472628691452, 326.05382246454587403, 327.18528770377525916, 178a0698ed9Schristos 328.31742861292224234, 329.45024337080525356, 330.58373016603343331, 179a0698ed9Schristos 331.71788719692847280, 332.85271267144611329, 333.98820480709991898, 180a0698ed9Schristos 335.12436183088397001, 336.26118197919845443, 337.39866349777429377, 181a0698ed9Schristos 338.53680464159958774, 339.67560367484657036, 340.81505887079896411, 182a0698ed9Schristos 341.95516851178109619, 343.09593088908627578, 344.23734430290727460, 183a0698ed9Schristos 345.37940706226686416, 346.52211748494903532, 347.66547389743118401, 184a0698ed9Schristos 348.80947463481720661, 349.95411804077025408, 351.09940246744753267, 185a0698ed9Schristos 352.24532627543504759, 353.39188783368263103, 354.53908551944078908, 186a0698ed9Schristos 355.68691771819692349, 356.83538282361303118, 357.98447923746385868, 187a0698ed9Schristos 359.13420536957539753 188a0698ed9Schristos }; 189a0698ed9Schristos 190a0698ed9Schristos TEST_BEGIN(test_ln_gamma_misc) { 191a0698ed9Schristos unsigned i; 192a0698ed9Schristos 193a0698ed9Schristos for (i = 1; i < sizeof(ln_gamma_misc_expected)/sizeof(double); i++) { 194a0698ed9Schristos double x = (double)i * 0.25; 195*7bdf38e5Schristos expect_true(double_eq_rel(ln_gamma(x), 196a0698ed9Schristos ln_gamma_misc_expected[i], MAX_REL_ERR, MAX_ABS_ERR), 197a0698ed9Schristos "Incorrect ln_gamma result for i=%u", i); 198a0698ed9Schristos } 199a0698ed9Schristos } 200a0698ed9Schristos TEST_END 201a0698ed9Schristos 202a0698ed9Schristos /* Expected pt_norm([0.01..0.99] increment=0.01). */ 203a0698ed9Schristos static const double pt_norm_expected[] = { 204a0698ed9Schristos -INFINITY, 205a0698ed9Schristos -2.32634787404084076, -2.05374891063182252, -1.88079360815125085, 206a0698ed9Schristos -1.75068607125216946, -1.64485362695147264, -1.55477359459685305, 207a0698ed9Schristos -1.47579102817917063, -1.40507156030963221, -1.34075503369021654, 208a0698ed9Schristos -1.28155156554460081, -1.22652812003661049, -1.17498679206608991, 209a0698ed9Schristos -1.12639112903880045, -1.08031934081495606, -1.03643338949378938, 210a0698ed9Schristos -0.99445788320975281, -0.95416525314619416, -0.91536508784281390, 211a0698ed9Schristos -0.87789629505122846, -0.84162123357291418, -0.80642124701824025, 212a0698ed9Schristos -0.77219321418868492, -0.73884684918521371, -0.70630256284008752, 213a0698ed9Schristos -0.67448975019608171, -0.64334540539291685, -0.61281299101662701, 214a0698ed9Schristos -0.58284150727121620, -0.55338471955567281, -0.52440051270804067, 215a0698ed9Schristos -0.49585034734745320, -0.46769879911450812, -0.43991316567323380, 216a0698ed9Schristos -0.41246312944140462, -0.38532046640756751, -0.35845879325119373, 217a0698ed9Schristos -0.33185334643681652, -0.30548078809939738, -0.27931903444745404, 218a0698ed9Schristos -0.25334710313579978, -0.22754497664114931, -0.20189347914185077, 219a0698ed9Schristos -0.17637416478086135, -0.15096921549677725, -0.12566134685507399, 220a0698ed9Schristos -0.10043372051146975, -0.07526986209982976, -0.05015358346473352, 221a0698ed9Schristos -0.02506890825871106, 0.00000000000000000, 0.02506890825871106, 222a0698ed9Schristos 0.05015358346473366, 0.07526986209982990, 0.10043372051146990, 223a0698ed9Schristos 0.12566134685507413, 0.15096921549677739, 0.17637416478086146, 224a0698ed9Schristos 0.20189347914185105, 0.22754497664114931, 0.25334710313579978, 225a0698ed9Schristos 0.27931903444745404, 0.30548078809939738, 0.33185334643681652, 226a0698ed9Schristos 0.35845879325119373, 0.38532046640756762, 0.41246312944140484, 227a0698ed9Schristos 0.43991316567323391, 0.46769879911450835, 0.49585034734745348, 228a0698ed9Schristos 0.52440051270804111, 0.55338471955567303, 0.58284150727121620, 229a0698ed9Schristos 0.61281299101662701, 0.64334540539291685, 0.67448975019608171, 230a0698ed9Schristos 0.70630256284008752, 0.73884684918521371, 0.77219321418868492, 231a0698ed9Schristos 0.80642124701824036, 0.84162123357291441, 0.87789629505122879, 232a0698ed9Schristos 0.91536508784281423, 0.95416525314619460, 0.99445788320975348, 233a0698ed9Schristos 1.03643338949378938, 1.08031934081495606, 1.12639112903880045, 234a0698ed9Schristos 1.17498679206608991, 1.22652812003661049, 1.28155156554460081, 235a0698ed9Schristos 1.34075503369021654, 1.40507156030963265, 1.47579102817917085, 236a0698ed9Schristos 1.55477359459685394, 1.64485362695147308, 1.75068607125217102, 237a0698ed9Schristos 1.88079360815125041, 2.05374891063182208, 2.32634787404084076 238a0698ed9Schristos }; 239a0698ed9Schristos 240a0698ed9Schristos TEST_BEGIN(test_pt_norm) { 241a0698ed9Schristos unsigned i; 242a0698ed9Schristos 243a0698ed9Schristos for (i = 1; i < sizeof(pt_norm_expected)/sizeof(double); i++) { 244a0698ed9Schristos double p = (double)i * 0.01; 245*7bdf38e5Schristos expect_true(double_eq_rel(pt_norm(p), pt_norm_expected[i], 246a0698ed9Schristos MAX_REL_ERR, MAX_ABS_ERR), 247a0698ed9Schristos "Incorrect pt_norm result for i=%u", i); 248a0698ed9Schristos } 249a0698ed9Schristos } 250a0698ed9Schristos TEST_END 251a0698ed9Schristos 252a0698ed9Schristos /* 253a0698ed9Schristos * Expected pt_chi2(p=[0.01..0.99] increment=0.07, 254a0698ed9Schristos * df={0.1, 1.1, 10.1, 100.1, 1000.1}). 255a0698ed9Schristos */ 256a0698ed9Schristos static const double pt_chi2_df[] = {0.1, 1.1, 10.1, 100.1, 1000.1}; 257a0698ed9Schristos static const double pt_chi2_expected[] = { 258a0698ed9Schristos 1.168926411457320e-40, 1.347680397072034e-22, 3.886980416666260e-17, 259a0698ed9Schristos 8.245951724356564e-14, 2.068936347497604e-11, 1.562561743309233e-09, 260a0698ed9Schristos 5.459543043426564e-08, 1.114775688149252e-06, 1.532101202364371e-05, 261a0698ed9Schristos 1.553884683726585e-04, 1.239396954915939e-03, 8.153872320255721e-03, 262a0698ed9Schristos 4.631183739647523e-02, 2.473187311701327e-01, 2.175254800183617e+00, 263a0698ed9Schristos 264a0698ed9Schristos 0.0003729887888876379, 0.0164409238228929513, 0.0521523015190650113, 265a0698ed9Schristos 0.1064701372271216612, 0.1800913735793082115, 0.2748704281195626931, 266a0698ed9Schristos 0.3939246282787986497, 0.5420727552260817816, 0.7267265822221973259, 267a0698ed9Schristos 0.9596554296000253670, 1.2607440376386165326, 1.6671185084541604304, 268a0698ed9Schristos 2.2604828984738705167, 3.2868613342148607082, 6.9298574921692139839, 269a0698ed9Schristos 270a0698ed9Schristos 2.606673548632508, 4.602913725294877, 5.646152813924212, 271a0698ed9Schristos 6.488971315540869, 7.249823275816285, 7.977314231410841, 272a0698ed9Schristos 8.700354939944047, 9.441728024225892, 10.224338321374127, 273a0698ed9Schristos 11.076435368801061, 12.039320937038386, 13.183878752697167, 274a0698ed9Schristos 14.657791935084575, 16.885728216339373, 23.361991680031817, 275a0698ed9Schristos 276a0698ed9Schristos 70.14844087392152, 80.92379498849355, 85.53325420085891, 277a0698ed9Schristos 88.94433120715347, 91.83732712857017, 94.46719943606301, 278a0698ed9Schristos 96.96896479994635, 99.43412843510363, 101.94074719829733, 279a0698ed9Schristos 104.57228644307247, 107.43900093448734, 110.71844673417287, 280a0698ed9Schristos 114.76616819871325, 120.57422505959563, 135.92318818757556, 281a0698ed9Schristos 282a0698ed9Schristos 899.0072447849649, 937.9271278858220, 953.8117189560207, 283a0698ed9Schristos 965.3079371501154, 974.8974061207954, 983.4936235182347, 284a0698ed9Schristos 991.5691170518946, 999.4334123954690, 1007.3391826856553, 285a0698ed9Schristos 1015.5445154999951, 1024.3777075619569, 1034.3538789836223, 286a0698ed9Schristos 1046.4872561869577, 1063.5717461999654, 1107.0741966053859 287a0698ed9Schristos }; 288a0698ed9Schristos 289a0698ed9Schristos TEST_BEGIN(test_pt_chi2) { 290a0698ed9Schristos unsigned i, j; 291a0698ed9Schristos unsigned e = 0; 292a0698ed9Schristos 293a0698ed9Schristos for (i = 0; i < sizeof(pt_chi2_df)/sizeof(double); i++) { 294a0698ed9Schristos double df = pt_chi2_df[i]; 295a0698ed9Schristos double ln_gamma_df = ln_gamma(df * 0.5); 296a0698ed9Schristos for (j = 1; j < 100; j += 7) { 297a0698ed9Schristos double p = (double)j * 0.01; 298*7bdf38e5Schristos expect_true(double_eq_rel(pt_chi2(p, df, ln_gamma_df), 299a0698ed9Schristos pt_chi2_expected[e], MAX_REL_ERR, MAX_ABS_ERR), 300a0698ed9Schristos "Incorrect pt_chi2 result for i=%u, j=%u", i, j); 301a0698ed9Schristos e++; 302a0698ed9Schristos } 303a0698ed9Schristos } 304a0698ed9Schristos } 305a0698ed9Schristos TEST_END 306a0698ed9Schristos 307a0698ed9Schristos /* 308a0698ed9Schristos * Expected pt_gamma(p=[0.1..0.99] increment=0.07, 309a0698ed9Schristos * shape=[0.5..3.0] increment=0.5). 310a0698ed9Schristos */ 311a0698ed9Schristos static const double pt_gamma_shape[] = {0.5, 1.0, 1.5, 2.0, 2.5, 3.0}; 312a0698ed9Schristos static const double pt_gamma_expected[] = { 313a0698ed9Schristos 7.854392895485103e-05, 5.043466107888016e-03, 1.788288957794883e-02, 314a0698ed9Schristos 3.900956150232906e-02, 6.913847560638034e-02, 1.093710833465766e-01, 315a0698ed9Schristos 1.613412523825817e-01, 2.274682115597864e-01, 3.114117323127083e-01, 316a0698ed9Schristos 4.189466220207417e-01, 5.598106789059246e-01, 7.521856146202706e-01, 317a0698ed9Schristos 1.036125427911119e+00, 1.532450860038180e+00, 3.317448300510606e+00, 318a0698ed9Schristos 319a0698ed9Schristos 0.01005033585350144, 0.08338160893905107, 0.16251892949777497, 320a0698ed9Schristos 0.24846135929849966, 0.34249030894677596, 0.44628710262841947, 321a0698ed9Schristos 0.56211891815354142, 0.69314718055994529, 0.84397007029452920, 322a0698ed9Schristos 1.02165124753198167, 1.23787435600161766, 1.51412773262977574, 323a0698ed9Schristos 1.89711998488588196, 2.52572864430825783, 4.60517018598809091, 324a0698ed9Schristos 325a0698ed9Schristos 0.05741590094955853, 0.24747378084860744, 0.39888572212236084, 326a0698ed9Schristos 0.54394139997444901, 0.69048812513915159, 0.84311389861296104, 327a0698ed9Schristos 1.00580622221479898, 1.18298694218766931, 1.38038096305861213, 328a0698ed9Schristos 1.60627736383027453, 1.87396970522337947, 2.20749220408081070, 329a0698ed9Schristos 2.65852391865854942, 3.37934630984842244, 5.67243336507218476, 330a0698ed9Schristos 331a0698ed9Schristos 0.1485547402532659, 0.4657458011640391, 0.6832386130709406, 332a0698ed9Schristos 0.8794297834672100, 1.0700752852474524, 1.2629614217350744, 333a0698ed9Schristos 1.4638400448580779, 1.6783469900166610, 1.9132338090606940, 334a0698ed9Schristos 2.1778589228618777, 2.4868823970010991, 2.8664695666264195, 335a0698ed9Schristos 3.3724415436062114, 4.1682658512758071, 6.6383520679938108, 336a0698ed9Schristos 337a0698ed9Schristos 0.2771490383641385, 0.7195001279643727, 0.9969081732265243, 338a0698ed9Schristos 1.2383497880608061, 1.4675206597269927, 1.6953064251816552, 339a0698ed9Schristos 1.9291243435606809, 2.1757300955477641, 2.4428032131216391, 340a0698ed9Schristos 2.7406534569230616, 3.0851445039665513, 3.5043101122033367, 341a0698ed9Schristos 4.0575997065264637, 4.9182956424675286, 7.5431362346944937, 342a0698ed9Schristos 343a0698ed9Schristos 0.4360451650782932, 0.9983600902486267, 1.3306365880734528, 344a0698ed9Schristos 1.6129750834753802, 1.8767241606994294, 2.1357032436097660, 345a0698ed9Schristos 2.3988853336865565, 2.6740603137235603, 2.9697561737517959, 346a0698ed9Schristos 3.2971457713883265, 3.6731795898504660, 4.1275751617770631, 347a0698ed9Schristos 4.7230515633946677, 5.6417477865306020, 8.4059469148854635 348a0698ed9Schristos }; 349a0698ed9Schristos 350a0698ed9Schristos TEST_BEGIN(test_pt_gamma_shape) { 351a0698ed9Schristos unsigned i, j; 352a0698ed9Schristos unsigned e = 0; 353a0698ed9Schristos 354a0698ed9Schristos for (i = 0; i < sizeof(pt_gamma_shape)/sizeof(double); i++) { 355a0698ed9Schristos double shape = pt_gamma_shape[i]; 356a0698ed9Schristos double ln_gamma_shape = ln_gamma(shape); 357a0698ed9Schristos for (j = 1; j < 100; j += 7) { 358a0698ed9Schristos double p = (double)j * 0.01; 359*7bdf38e5Schristos expect_true(double_eq_rel(pt_gamma(p, shape, 1.0, 360a0698ed9Schristos ln_gamma_shape), pt_gamma_expected[e], MAX_REL_ERR, 361a0698ed9Schristos MAX_ABS_ERR), 362a0698ed9Schristos "Incorrect pt_gamma result for i=%u, j=%u", i, j); 363a0698ed9Schristos e++; 364a0698ed9Schristos } 365a0698ed9Schristos } 366a0698ed9Schristos } 367a0698ed9Schristos TEST_END 368a0698ed9Schristos 369a0698ed9Schristos TEST_BEGIN(test_pt_gamma_scale) { 370a0698ed9Schristos double shape = 1.0; 371a0698ed9Schristos double ln_gamma_shape = ln_gamma(shape); 372a0698ed9Schristos 373*7bdf38e5Schristos expect_true(double_eq_rel( 374a0698ed9Schristos pt_gamma(0.5, shape, 1.0, ln_gamma_shape) * 10.0, 375a0698ed9Schristos pt_gamma(0.5, shape, 10.0, ln_gamma_shape), MAX_REL_ERR, 376a0698ed9Schristos MAX_ABS_ERR), 377a0698ed9Schristos "Scale should be trivially equivalent to external multiplication"); 378a0698ed9Schristos } 379a0698ed9Schristos TEST_END 380a0698ed9Schristos 381a0698ed9Schristos int 382a0698ed9Schristos main(void) { 383a0698ed9Schristos return test( 384a0698ed9Schristos test_ln_gamma_factorial, 385a0698ed9Schristos test_ln_gamma_misc, 386a0698ed9Schristos test_pt_norm, 387a0698ed9Schristos test_pt_chi2, 388a0698ed9Schristos test_pt_gamma_shape, 389a0698ed9Schristos test_pt_gamma_scale); 390a0698ed9Schristos } 391