xref: /netbsd-src/external/bsd/jemalloc/dist/test/unit/math.c (revision 7bdf38e5b7a28439665f2fdeff81e36913eef7dd)
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