1*2ed28c9aSmartynas /* $OpenBSD: monotl.c,v 1.2 2011/07/08 16:49:05 martynas Exp $ */
2567a7532Smartynas
3567a7532Smartynas /*
4567a7532Smartynas * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5567a7532Smartynas *
6567a7532Smartynas * Permission to use, copy, modify, and distribute this software for any
7567a7532Smartynas * purpose with or without fee is hereby granted, provided that the above
8567a7532Smartynas * copyright notice and this permission notice appear in all copies.
9567a7532Smartynas *
10567a7532Smartynas * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11567a7532Smartynas * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12567a7532Smartynas * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13567a7532Smartynas * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14567a7532Smartynas * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15567a7532Smartynas * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16567a7532Smartynas * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17567a7532Smartynas */
18567a7532Smartynas
19567a7532Smartynas /* monotl.c
20567a7532Smartynas Floating point function test vectors.
21567a7532Smartynas
22567a7532Smartynas Arguments and function values are synthesized for NPTS points in
23567a7532Smartynas the vicinity of each given tabulated test point. The points are
24567a7532Smartynas chosen to be near and on either side of the likely function algorithm
25567a7532Smartynas domain boundaries. Since the function programs change their methods
26567a7532Smartynas at these points, major coding errors or monotonicity failures might be
27567a7532Smartynas detected.
28567a7532Smartynas
29567a7532Smartynas August, 1998
30567a7532Smartynas S. L. Moshier */
31567a7532Smartynas
32567a7532Smartynas #include <float.h>
33567a7532Smartynas
34567a7532Smartynas #if LDBL_MANT_DIG == 64
35567a7532Smartynas /* Unit of error tolerance in test[i].thresh. */
36567a7532Smartynas static long double MACHEPL =
37567a7532Smartynas 5.42101086242752217003726400434970855712890625E-20L;
38567a7532Smartynas /* How many times the above error to allow before printing a complaint.
39567a7532Smartynas If TOL < 0, consider absolute error instead of relative error. */
40567a7532Smartynas #define TOL 8
41567a7532Smartynas /* Number of test points to generate on each side of tabulated point. */
42567a7532Smartynas #define NPTS 100
43567a7532Smartynas
44567a7532Smartynas
45567a7532Smartynas
46567a7532Smartynas #include <stdio.h>
47567a7532Smartynas
48567a7532Smartynas
49567a7532Smartynas /* Avoid including math.h. */
50567a7532Smartynas long double frexpl (long double, int *);
51567a7532Smartynas long double ldexpl (long double, int);
52567a7532Smartynas
53567a7532Smartynas /* Functions of one variable. */
54567a7532Smartynas long double expl (long double);
55567a7532Smartynas long double logl (long double);
56567a7532Smartynas long double sinl (long double);
57567a7532Smartynas long double cosl (long double);
58567a7532Smartynas long double tanl (long double);
59567a7532Smartynas long double atanl (long double);
60567a7532Smartynas long double asinl (long double);
61567a7532Smartynas long double acosl (long double);
62567a7532Smartynas long double sinhl (long double);
63567a7532Smartynas long double coshl (long double);
64567a7532Smartynas long double tanhl (long double);
65567a7532Smartynas long double asinhl (long double);
66567a7532Smartynas long double acoshl (long double);
67567a7532Smartynas long double atanhl (long double);
68567a7532Smartynas long double lgammal (long double);
69567a7532Smartynas long double tgammal (long double);
70567a7532Smartynas long double fabsl (long double);
71567a7532Smartynas long double floorl (long double);
72567a7532Smartynas long double j0l (long double);
73567a7532Smartynas long double y0l (long double);
74567a7532Smartynas long double j1l (long double);
75567a7532Smartynas long double y1l (long double);
76567a7532Smartynas
77567a7532Smartynas /* Data structure of the test. */
78567a7532Smartynas struct oneargument
79567a7532Smartynas {
80567a7532Smartynas char *name; /* Name of the function. */
81567a7532Smartynas long double (*func) (long double); /* Function call. */
82567a7532Smartynas long double arg1; /* Function argument, assumed exact. */
83567a7532Smartynas long double answer1; /* Exact number, close to function value. */
84567a7532Smartynas long double answer2; /* answer1 + answer2 has extended precision. */
85567a7532Smartynas long double derivative; /* dy/dx evaluated at x = arg1. */
86567a7532Smartynas /* Error report threshold. 2 => 1 ulp approximately
87567a7532Smartynas if thresh < 0 then consider absolute error instead of relative error. */
88567a7532Smartynas int thresh;
89567a7532Smartynas
90567a7532Smartynas };
91567a7532Smartynas
92567a7532Smartynas
93567a7532Smartynas
94567a7532Smartynas static struct oneargument test1[] =
95567a7532Smartynas {
96567a7532Smartynas {"exp", expl, 1.0L, 2.7182769775390625L,
97567a7532Smartynas 4.85091998273536028747e-6L, 2.71828182845904523536L, TOL},
98567a7532Smartynas {"exp", expl, -1.0L, 3.678741455078125e-1L,
99567a7532Smartynas 5.29566362982159552377e-6L, 3.678794411714423215955e-1L, TOL},
100567a7532Smartynas {"exp", expl, 0.5L, 1.648712158203125L,
101567a7532Smartynas 9.1124970031468486507878e-6L, 1.64872127070012814684865L, TOL},
102567a7532Smartynas {"exp", expl, -0.5L, 6.065216064453125e-1L,
103567a7532Smartynas 9.0532673209236037995e-6L, 6.0653065971263342360e-1L, TOL},
104567a7532Smartynas {"exp", expl, 2.0L, 7.3890533447265625L,
105567a7532Smartynas 2.75420408772723042746e-6L, 7.38905609893065022723L, TOL},
106567a7532Smartynas {"exp", expl, -2.0L, 1.353302001953125e-1L,
107567a7532Smartynas 5.08304130019189399949e-6L, 1.3533528323661269189e-1L, TOL},
108567a7532Smartynas {"log", logl, 1.41421356237309492343L, 3.465728759765625e-1L,
109567a7532Smartynas 7.1430341006605745676897e-7L, 7.0710678118654758708668e-1L, TOL},
110567a7532Smartynas {"log", logl, 7.07106781186547461715e-1L, -3.46588134765625e-1L,
111567a7532Smartynas 1.45444856522566402246e-5L, 1.41421356237309517417L, TOL},
112567a7532Smartynas {"sin", sinl, 7.85398163397448278999e-1L, 7.0709228515625e-1L,
113567a7532Smartynas 1.4496030297502751942956e-5L, 7.071067811865475460497e-1L, TOL},
114567a7532Smartynas {"sin", sinl, -7.85398163397448501044e-1L, -7.071075439453125e-1L,
115567a7532Smartynas 7.62758764840238811175e-7L, 7.07106781186547389040e-1L, TOL},
116567a7532Smartynas {"sin", sinl, 1.570796326794896558L, 9.999847412109375e-1L,
117567a7532Smartynas 1.52587890625e-5L, 6.12323399573676588613e-17L, TOL},
118567a7532Smartynas {"sin", sinl, -1.57079632679489678004L, -1.0L,
119567a7532Smartynas 1.29302922820150306903e-32L, -1.60812264967663649223e-16L, TOL},
120567a7532Smartynas {"sin", sinl, 4.712388980384689674L, -1.0L,
121567a7532Smartynas 1.68722975549458979398e-32L, -1.83697019872102976584e-16L, TOL},
122567a7532Smartynas {"sin", sinl, -4.71238898038468989604L, 9.999847412109375e-1L,
123567a7532Smartynas 1.52587890625e-5L, 3.83475850529283315008e-17L, TOL},
124567a7532Smartynas {"cos", cosl, 3.92699081698724139500E-1L, 9.23873901367187500000E-1L,
125567a7532Smartynas 5.63114409926198633370E-6L, -3.82683432365089757586E-1L, TOL},
126567a7532Smartynas {"cos", cosl, 7.85398163397448278999E-1L, 7.07092285156250000000E-1L,
127567a7532Smartynas 1.44960302975460497458E-5L, -7.07106781186547502752E-1L, TOL},
128567a7532Smartynas {"cos", cosl, 1.17809724509617241850E0L, 3.82675170898437500000E-1L,
129567a7532Smartynas 8.26146665231415693919E-6L, -9.23879532511286738554E-1L, TOL},
130567a7532Smartynas {"cos", cosl, 1.96349540849362069750E0L, -3.82690429687500000000E-1L,
131567a7532Smartynas 6.99732241029898567203E-6L, -9.23879532511286785419E-1L, TOL},
132567a7532Smartynas {"cos", cosl, 2.35619449019234483700E0L, -7.07107543945312500000E-1L,
133567a7532Smartynas 7.62758765040545859856E-7L, -7.07106781186547589348E-1L, TOL},
134567a7532Smartynas {"cos", cosl, 2.74889357189106897650E0L, -9.23889160156250000000E-1L,
135567a7532Smartynas 9.62764496328487887036E-6L, -3.82683432365089870728E-1L, TOL},
136567a7532Smartynas {"cos", cosl, 3.14159265358979311600E0L, -1.00000000000000000000E0L,
137567a7532Smartynas 7.49879891330928797323E-33L, -1.22464679914735317723E-16L, TOL},
138567a7532Smartynas {"tan", tanl, 7.85398163397448278999E-1L, 9.999847412109375e-1L,
139567a7532Smartynas 1.52587890624387676600E-5L, 1.99999999999999987754E0L, TOL},
140567a7532Smartynas {"tan", tanl, 1.17809724509617241850E0L, 2.41419982910156250000E0L,
141567a7532Smartynas 1.37332715322352112604E-5L, 6.82842712474618858345E0L, TOL},
142567a7532Smartynas {"tan", tanl, 1.96349540849362069750E0L, -2.41421508789062500000E0L,
143567a7532Smartynas 1.52551752942854759743E-6L, 6.82842712474619262118E0L, TOL},
144567a7532Smartynas {"tan", tanl, 2.35619449019234483700E0L, -1.00001525878906250000E0L,
145567a7532Smartynas 1.52587890623163029801E-5L, 2.00000000000000036739E0L, TOL},
146567a7532Smartynas {"tan", tanl, 2.74889357189106897650E0L, -4.14215087890625000000E-1L,
147567a7532Smartynas 1.52551752982565655126E-6L, 1.17157287525381000640E0L, TOL},
148567a7532Smartynas {"atan", atanl, 4.14213562373094923430E-1L, 3.92684936523437500000E-1L,
149567a7532Smartynas 1.41451752865477964149E-5L, 8.53553390593273837869E-1L, TOL},
150567a7532Smartynas {"atan", atanl, 1.0L, 7.85385131835937500000E-1L,
151567a7532Smartynas 1.30315615108096156608E-5L, 0.5L, TOL},
152567a7532Smartynas {"atan", atanl, 2.41421356237309492343E0L, 1.17808532714843750000E0L,
153567a7532Smartynas 1.19179477349460632350E-5L, 1.46446609406726250782E-1L, TOL},
154567a7532Smartynas {"atan", atanl, -2.41421356237309514547E0L, -1.17810058593750000000E0L,
155567a7532Smartynas 3.34084132752141908545E-6L, 1.46446609406726227789E-1L, TOL},
156567a7532Smartynas {"atan", atanl, -1.0L, -7.85400390625000000000E-1L,
157567a7532Smartynas 2.22722755169038433915E-6L, 0.5L, TOL},
158567a7532Smartynas {"atan", atanl, -4.14213562373095145475E-1L, -3.92700195312500000000E-1L,
159567a7532Smartynas 1.11361377576267665972E-6L, 8.53553390593273703853E-1L, TOL},
160567a7532Smartynas {"asin", asinl, 3.82683432365089615246E-1L, 3.92684936523437500000E-1L,
161567a7532Smartynas 1.41451752864854321970E-5L, 1.08239220029239389286E0L, TOL},
162567a7532Smartynas {"asin", asinl, 0.5L, 5.23590087890625000000E-1L,
163567a7532Smartynas 8.68770767387307710723E-6L, 1.15470053837925152902E0L, TOL},
164567a7532Smartynas {"asin", asinl, 7.07106781186547461715E-1L, 7.85385131835937500000E-1L,
165567a7532Smartynas 1.30315615107209645016E-5L, 1.41421356237309492343E0L, TOL},
166567a7532Smartynas {"asin", asinl, 9.23879532511286738483E-1L, 1.17808532714843750000E0L,
167567a7532Smartynas 1.19179477349183147612E-5L, 2.61312592975275276483E0L, TOL},
168567a7532Smartynas {"asin", asinl, -0.5L, -5.23605346679687500000E-1L,
169567a7532Smartynas 6.57108138862692289277E-6L, 1.15470053837925152902E0L, TOL},
170567a7532Smartynas {"asin", asinl, 1.16415321826934814453125e-10L,
171567a7532Smartynas 1.16415321826934814453125e-10L, 2.629536350736706018055e-31L,
172567a7532Smartynas 1.0000000000000000000067762L, TOL},
173567a7532Smartynas {"asin", asinl, 1.0000000000000000000183779E-10L,
174567a7532Smartynas 9.9999999979890480394928431E-11L, 2.0109519607076028264987890E-20L,
175567a7532Smartynas 1.0L, TOL},
176567a7532Smartynas {"asin", asinl, 1.0000000000000000000007074E-8L,
177567a7532Smartynas 9.9999999999948220585910263E-9L, 5.1781080827147808155022014E-21L,
178567a7532Smartynas 1.0L, TOL},
179567a7532Smartynas {"asin", asinl, 0.97499847412109375L, 1.346710205078125L,
180567a7532Smartynas 3.969526822009922560999e-6L, 4.500216008585875735254L, TOL},
181567a7532Smartynas {"acos", acosl, 1.95090322016128192573E-1L, 1.37443542480468750000E0L,
182567a7532Smartynas 1.13611408471185777914E-5L, -1.01959115820831832232E0L, TOL},
183567a7532Smartynas {"acos", acosl, 3.82683432365089615246E-1L, 1.17808532714843750000E0L,
184567a7532Smartynas 1.19179477351337991247E-5L, -1.08239220029239389286E0L, TOL},
185567a7532Smartynas {"acos", acosl, 0.5L, 1.04719543457031250000E0L,
186567a7532Smartynas 2.11662628524615421446E-6L, -1.15470053837925152902E0L, TOL},
187567a7532Smartynas {"acos", acosl, 7.07106781186547461715E-1L, 7.85385131835937500000E-1L,
188567a7532Smartynas 1.30315615108982668201E-5L, -1.41421356237309492343E0L, TOL},
189567a7532Smartynas {"acos", acosl, 9.23879532511286738483E-1L, 3.92684936523437500000E-1L,
190567a7532Smartynas 1.41451752867009165605E-5L, -2.61312592975275276483E0L, TOL},
191567a7532Smartynas {"acos", acosl, 9.80785280403230430579E-1L, 1.96334838867187500000E-1L,
192567a7532Smartynas 1.47019821746724723933E-5L, -5.12583089548300990774E0L, TOL},
193567a7532Smartynas {"acos", acosl, -0.5L, 2.09439086914062500000E0L,
194567a7532Smartynas 4.23325257049230842892E-6L, -1.15470053837925152902E0L, TOL},
195567a7532Smartynas {"sinh", sinhl, 1.0L, 1.17518615722656250000E0L,
196567a7532Smartynas 1.50364172389568823819E-5L, 1.54308063481524377848E0L, TOL},
197567a7532Smartynas {"sinh", sinhl, 7.09089565712818057364E2L, 4.49423283712885057274E307L,
198567a7532Smartynas 1.70878916528708958045E289L, 4.49423283712885057274E307L, TOL},
199567a7532Smartynas {"sinh", sinhl, 2.22044604925031308085E-16L, 0.00000000000000000000E0L,
200567a7532Smartynas 2.22044604925031308085E-16L, 1.00000000000000000000E0L, TOL},
201567a7532Smartynas {"sinh", sinhl, 3.7252902984619140625e-9L, 3.7252902984619140625e-9L,
202567a7532Smartynas 8.616464714094038285889380656847999229E-27L,
203567a7532Smartynas 1.00000000000000000693889L, TOL},
204567a7532Smartynas {"sinh", sinhl, 2.3283064365386962890625e-10L, 2.3283064365386962890625e-10L,
205567a7532Smartynas 2.103629080589364814436978072135626630E-30,
206567a7532Smartynas 1.000000000000000000027105L, TOL},
207567a7532Smartynas {"cosh", coshl, 7.09089565712818057364E2L, 4.49423283712885057274E307L,
208567a7532Smartynas 1.70878916528708958045E289L, 4.49423283712885057274E307L, TOL},
209567a7532Smartynas {"cosh", coshl, 1.0L, 1.54307556152343750000E0L,
210567a7532Smartynas 5.07329180627847790562E-6L, 1.17520119364380145688E0L, TOL},
211567a7532Smartynas {"cosh", coshl, 0.5L, 1.12762451171875000000E0L,
212567a7532Smartynas 1.45348763078522622516E-6L, 5.21095305493747361622E-1L, TOL},
213567a7532Smartynas {"tanh", tanhl, 0.5L, 4.62112426757812500000E-1L,
214567a7532Smartynas 4.73050219725850231848E-6L, 7.86447732965927410150E-1L, TOL},
215567a7532Smartynas {"tanh", tanhl, 5.49306144334054780032E-1L, 4.99984741210937500000E-1L,
216567a7532Smartynas 1.52587890624507506378E-5L, 7.50000000000000049249E-1L, TOL},
217567a7532Smartynas {"tanh", tanhl, 0.625L, 5.54595947265625000000E-1L,
218567a7532Smartynas 3.77508375729399903910E-6L, 6.92419147969988069631E-1L, TOL},
219567a7532Smartynas {"asinh", asinhl, 0.5L, 4.81201171875000000000E-1L,
220567a7532Smartynas 1.06531846034474977589E-5L, 8.94427190999915878564E-1L, TOL},
221567a7532Smartynas {"asinh", asinhl, 1.0L, 8.81362915039062500000E-1L,
222567a7532Smartynas 1.06719804805252326093E-5L, 7.07106781186547524401E-1L, TOL},
223567a7532Smartynas {"asinh", asinhl, 2.0L, 1.44363403320312500000E0L,
224567a7532Smartynas 1.44197568534249327674E-6L, 4.47213595499957939282E-1L, TOL},
225567a7532Smartynas {"acosh", acoshl, 2.0L, 1.31695556640625000000E0L,
226567a7532Smartynas 2.33051856670862504635E-6L, 5.77350269189625764509E-1L, TOL},
227567a7532Smartynas {"acosh", acoshl, 1.5L, 9.62417602539062500000E-1L,
228567a7532Smartynas 6.04758014439499551783E-6L, 8.94427190999915878564E-1L, TOL},
229567a7532Smartynas {"acosh", acoshl, 1.03125L, 2.49343872070312500000E-1L,
230567a7532Smartynas 9.62177257298785143908E-6L, 3.96911150685467059809E0L, TOL},
231567a7532Smartynas {"atanh", atanhl, 0.5L, 5.49301147460937500000E-1L,
232567a7532Smartynas 4.99687311734569762262E-6L, 1.33333333333333333333E0L, TOL},
233567a7532Smartynas
234567a7532Smartynas #if 0
235567a7532Smartynas {"j0", j0l, 8.0L, 1.71646118164062500000E-1L,
236567a7532Smartynas 4.68897349140609086941E-6L, -2.34636346853914624381E-1, -4},
237567a7532Smartynas {"j0", j0l, 4.54541015625L, -3.09783935546875000000E-1L,
238567a7532Smartynas 7.07472668157686463367E-6L, 2.42993657373627558460E-1L, -4},
239567a7532Smartynas {"j0", j0l, 2.85711669921875L, -2.07901000976562500000E-1L,
240567a7532Smartynas 1.15237285263902751582E-5L, -3.90402225324501311651E-1L, -4},
241567a7532Smartynas {"j0", j0l, 2.0L, 2.23876953125000000000E-1L,
242567a7532Smartynas 1.38260162356680518275E-5L, -5.76724807756873387202E-1L, -4},
243567a7532Smartynas {"j0", j0l, 1.16415321826934814453125e-10L, 9.99984741210937500000E-1L,
244567a7532Smartynas 1.52587890624999966119E-5L, 9.99999999999999999997E-1L, -4},
245567a7532Smartynas {"j0", j0l, -2.0L, 2.23876953125000000000E-1L,
246567a7532Smartynas 1.38260162356680518275E-5L, 5.76724807756873387202E-1L, -4},
247567a7532Smartynas {"y0", y0l, 8.0L, 2.23510742187500000000E-1L,
248567a7532Smartynas 1.07472000662205273234E-5L, 1.58060461731247494256E-1L, -4},
249567a7532Smartynas {"y0", y0l, 4.54541015625L, -2.08114624023437500000E-1L,
250567a7532Smartynas 1.45018823856668874574E-5L, -2.88887645307401250876E-1L, -4},
251567a7532Smartynas {"y0", y0l, 2.85711669921875L, 4.20303344726562500000E-1L,
252567a7532Smartynas 1.32781607563122276008E-5L, -2.82488638474982469213E-1, -4},
253567a7532Smartynas {"y0", y0l, 2.0L, 5.10360717773437500000E-1L,
254567a7532Smartynas 1.49548763076195966066E-5L, 1.07032431540937546888E-1L, -4},
255567a7532Smartynas {"y0", y0l, 1.16415321826934814453125e-10L, -1.46357574462890625000E1L,
256567a7532Smartynas 3.54110537011061127637E-6L, 5.46852220461145271913E9L, -4},
257567a7532Smartynas {"j1", j1l, 8.0L, 2.34634399414062500000E-1L,
258567a7532Smartynas 1.94743985212438127665E-6L,1.42321263780814578043E-1, -4},
259567a7532Smartynas {"j1", j1l, 4.54541015625L, -2.42996215820312500000E-1L,
260567a7532Smartynas 2.55844668494153980076E-6L, -2.56317734136211337012E-1, -4},
261567a7532Smartynas {"j1", j1l, 2.85711669921875L, 3.90396118164062500000E-1L,
262567a7532Smartynas 6.10716043881165077013E-6L, -3.44531507106757980441E-1L, -4},
263567a7532Smartynas {"j1", j1l, 2.0L, 5.76721191406250000000E-1L,
264567a7532Smartynas 3.61635062338720244824E-6L, -6.44716247372010255494E-2L, -4},
265567a7532Smartynas {"j1", j1l, 1.16415321826934814453125e-10L,
266567a7532Smartynas 5.820677273504770710133016109466552734375e-11L,
267567a7532Smartynas 8.881784197001251337312921818461805735896e-16L,
268567a7532Smartynas 4.99999999999999999997E-1L, -4},
269567a7532Smartynas {"j1", j1l, -2.0L, -5.76721191406250000000E-1L,
270567a7532Smartynas -3.61635062338720244824E-6L, -6.44716247372010255494E-2L, -4},
271567a7532Smartynas {"y1", y1l, 8.0L, -1.58065795898437500000E-1L,
272567a7532Smartynas 5.33416719000574444473E-6L, 2.43279047103972157309E-1L, -4},
273567a7532Smartynas {"y1", y1l, 4.54541015625L, 2.88879394531250000000E-1L,
274567a7532Smartynas 8.25077615125087585195E-6L, -2.71656024771791736625E-1L, -4},
275567a7532Smartynas {"y1", y1l, 2.85711669921875L, 2.82485961914062500000E-1,
276567a7532Smartynas 2.67656091996921314433E-6L, 3.21444694221532719737E-1, -4},
277567a7532Smartynas {"y1", y1l, 2.0L, -1.07040405273437500000E-1L,
278567a7532Smartynas 7.97373249995311162923E-6L, 5.63891888420213893041E-1, -4},
279567a7532Smartynas {"y1", y1l, 1.16415321826934814453125e-10L, -5.46852220500000000000E9L,
280567a7532Smartynas 3.88547280871200700671E-1L, 4.69742480525120196168E19L, -4},
281567a7532Smartynas #endif
282567a7532Smartynas
283*2ed28c9aSmartynas {"tgamma", tgammal, 1.0L, 1.0L,
284567a7532Smartynas 0.0L, -5.772156649015328606e-1L, TOL},
285*2ed28c9aSmartynas {"tgamma", tgammal, 2.0L, 1.0L,
286567a7532Smartynas 0.0L, 4.2278433509846713939e-1L, TOL},
287*2ed28c9aSmartynas {"tgamma", tgammal, 3.0L, 2.0L,
288567a7532Smartynas 0.0L, 1.845568670196934279L, TOL},
289*2ed28c9aSmartynas {"tgamma", tgammal, 4.0L, 6.0L,
290567a7532Smartynas 0.0L, 7.536706010590802836L, TOL},
291567a7532Smartynas
292567a7532Smartynas {"lgamma", lgammal, 8.0L, 8.525146484375L,
293567a7532Smartynas 1.48766904143001655310E-5, 2.01564147795560999654E0L, TOL},
294567a7532Smartynas {"lgamma", lgammal, 8.99993896484375e-1L, 6.6375732421875e-2L,
295567a7532Smartynas 5.11505711292524166220E-6L, -7.54938684259372234258E-1, -TOL},
296567a7532Smartynas {"lgamma", lgammal, 7.31597900390625e-1L, 2.2369384765625e-1L,
297567a7532Smartynas 5.21506341809849792422E-6L,-1.13355566660398608343E0L, -TOL},
298567a7532Smartynas {"lgamma", lgammal, 2.31639862060546875e-1L, 1.3686676025390625L,
299567a7532Smartynas 1.12609441752996145670E-5L, -4.56670961813812679012E0, -TOL},
300567a7532Smartynas {"lgamma", lgammal, 1.73162841796875L, -8.88214111328125e-2L,
301567a7532Smartynas 3.36207740803753034508E-6L, 2.33339034686200586920E-1L, -TOL},
302567a7532Smartynas {"lgamma", lgammal, 1.23162841796875L,-9.3902587890625e-2L,
303567a7532Smartynas 1.28765089229009648104E-5L, -2.49677345775751390414E-1L, -TOL},
304567a7532Smartynas {"lgamma", lgammal, 7.3786976294838206464e19L, 3.301798506038663053312e21L,
305567a7532Smartynas -1.656137564136932662487046269677E5L, 4.57477139169563904215E1L, TOL},
306567a7532Smartynas {"lgamma", lgammal, 1.0L, 0.0L,
307567a7532Smartynas 0.0L, -5.77215664901532860607E-1L, -TOL},
308567a7532Smartynas {"lgamma", lgammal, 2.0L, 0.0L,
309567a7532Smartynas 0.0L, 4.22784335098467139393E-1L, -TOL},
310567a7532Smartynas {"lgamma", lgammal, 1.08420217248550443401E-19L,4.36682586669921875e1L,
311567a7532Smartynas 1.37082843669932230418E-5L, -9.22337203685477580858E18L, TOL},
312567a7532Smartynas {"lgamma", lgammal, -0.5L, 1.2655029296875L,
313567a7532Smartynas 9.19379714539648894580E-6L, 3.64899739785765205590E-2L, TOL},
314567a7532Smartynas {"lgamma", lgammal, -1.5L, 8.6004638671875e-1L,
315567a7532Smartynas 6.28657731014510932682E-7L, 7.03156640645243187226E-1L, TOL},
316567a7532Smartynas {"lgamma", lgammal, -2.5L, -5.6243896484375E-2L,
317567a7532Smartynas 1.79986700949327405470E-7, 1.10315664064524318723E0L, -TOL},
318567a7532Smartynas {"lgamma", lgammal, -3.5L, -1.30902099609375L,
319567a7532Smartynas 1.43111007079536392848E-5L, 1.38887092635952890151E0L, TOL},
320567a7532Smartynas
321567a7532Smartynas {"null", NULL, 0.0L, 0.0L, 0.0L, 1},
322567a7532Smartynas };
323567a7532Smartynas
324567a7532Smartynas /* These take care of extra-precise floating point register problems. */
325567a7532Smartynas static volatile long double volat1;
326567a7532Smartynas static volatile long double volat2;
327567a7532Smartynas
328567a7532Smartynas
329567a7532Smartynas /* Return the next nearest floating point value to X
330567a7532Smartynas in the direction of UPDOWN (+1 or -1).
331567a7532Smartynas (Might fail if X is denormalized.) */
332567a7532Smartynas
333567a7532Smartynas static long double
nextval(x,updown)334567a7532Smartynas nextval (x, updown)
335567a7532Smartynas long double x;
336567a7532Smartynas int updown;
337567a7532Smartynas {
338567a7532Smartynas long double m;
339567a7532Smartynas int i;
340567a7532Smartynas
341567a7532Smartynas volat1 = x;
342567a7532Smartynas m = 0.25L * MACHEPL * volat1 * updown;
343567a7532Smartynas volat2 = volat1 + m;
344567a7532Smartynas if (volat2 != volat1)
345567a7532Smartynas printf ("successor failed\n");
346567a7532Smartynas
347567a7532Smartynas for (i = 2; i < 10; i++)
348567a7532Smartynas {
349567a7532Smartynas volat2 = volat1 + i * m;
350567a7532Smartynas if (volat1 != volat2)
351567a7532Smartynas return volat2;
352567a7532Smartynas }
353567a7532Smartynas
354567a7532Smartynas printf ("nextval failed\n");
355567a7532Smartynas return volat1;
356567a7532Smartynas }
357567a7532Smartynas
358567a7532Smartynas
359567a7532Smartynas
360567a7532Smartynas
361567a7532Smartynas int
monotl()362567a7532Smartynas monotl ()
363567a7532Smartynas {
364567a7532Smartynas long double (*fun1) (long double);
365567a7532Smartynas int i, j, errs, tests, err_thresh;
366567a7532Smartynas long double x, x0, dy, err;
367567a7532Smartynas
368567a7532Smartynas errs = 0;
369567a7532Smartynas tests = 0;
370567a7532Smartynas i = 0;
371567a7532Smartynas
372567a7532Smartynas for (;;)
373567a7532Smartynas {
374567a7532Smartynas /* Function call reference. */
375567a7532Smartynas fun1 = test1[i].func;
376567a7532Smartynas if (fun1 == NULL)
377567a7532Smartynas break;
378567a7532Smartynas /* Function argument. */
379567a7532Smartynas volat1 = test1[i].arg1;
380567a7532Smartynas /* x0 is the given argument, x scans from slightly below to above x0. */
381567a7532Smartynas x0 = volat1;
382567a7532Smartynas x = volat1;
383567a7532Smartynas for (j = 0; j <= NPTS; j++)
384567a7532Smartynas {
385567a7532Smartynas /* delta x */
386567a7532Smartynas volat1 = x - x0;
387567a7532Smartynas /* delta y */
388567a7532Smartynas dy = volat1 * test1[i].derivative;
389567a7532Smartynas /* y + delta y */
390567a7532Smartynas dy = test1[i].answer2 + dy;
391567a7532Smartynas volat1 = test1[i].answer1 + dy;
392567a7532Smartynas /* Run the function under test. */
393567a7532Smartynas volat2 = (*(fun1)) (x);
394567a7532Smartynas if (volat2 != volat1)
395567a7532Smartynas {
396567a7532Smartynas /* Estimate difference between program result
397567a7532Smartynas and extended precision function value. */
398567a7532Smartynas err = volat2 - test1[i].answer1;
399567a7532Smartynas err = err - dy;
400567a7532Smartynas /* Compare difference with reporting threshold. */
401567a7532Smartynas err_thresh = test1[i].thresh;
402567a7532Smartynas if (err_thresh >= 0)
403567a7532Smartynas err = err / volat1; /* relative error */
404567a7532Smartynas else
405567a7532Smartynas {
406567a7532Smartynas err_thresh = -err_thresh; /* absolute error */
407567a7532Smartynas /* ...but relative error if function value > 1 */
408567a7532Smartynas if (fabsl(volat1) > 1.0L)
409567a7532Smartynas err = err / volat1;
410567a7532Smartynas }
411567a7532Smartynas if (fabsl (err) > (err_thresh * MACHEPL))
412567a7532Smartynas {
413567a7532Smartynas printf ("%d %s(%.19Le) = %.19Le, rel err = %.3Le\n",
414567a7532Smartynas j, test1[i].name, x, volat2, err);
415567a7532Smartynas errs += 1;
416567a7532Smartynas }
417567a7532Smartynas }
418567a7532Smartynas x = nextval (x, 1);
419567a7532Smartynas tests += 1;
420567a7532Smartynas }
421567a7532Smartynas
422567a7532Smartynas x = x0;
423567a7532Smartynas x = nextval (x, -1);
424567a7532Smartynas for (j = 1; j < NPTS; j++)
425567a7532Smartynas {
426567a7532Smartynas volat1 = x - x0;
427567a7532Smartynas dy = volat1 * test1[i].derivative;
428567a7532Smartynas dy = test1[i].answer2 + dy;
429567a7532Smartynas volat1 = test1[i].answer1 + dy;
430567a7532Smartynas volat2 = (*(fun1)) (x);
431567a7532Smartynas if (volat2 != volat1)
432567a7532Smartynas {
433567a7532Smartynas err = volat2 - test1[i].answer1;
434567a7532Smartynas err = err - dy;
435567a7532Smartynas err_thresh = test1[i].thresh;
436567a7532Smartynas if (err_thresh >= 0)
437567a7532Smartynas err = err / volat1; /* relative error */
438567a7532Smartynas else
439567a7532Smartynas {
440567a7532Smartynas err_thresh = -err_thresh;
441567a7532Smartynas if (fabsl(volat1) > 1.0L)
442567a7532Smartynas err = err / volat1;
443567a7532Smartynas }
444567a7532Smartynas if (fabsl (err) > (err_thresh * MACHEPL))
445567a7532Smartynas {
446567a7532Smartynas printf ("%d %s(%.19Le) = %.19Le, rel err = %.3Le\n",
447567a7532Smartynas j, test1[i].name, x, volat2, err);
448567a7532Smartynas errs += 1;
449567a7532Smartynas }
450567a7532Smartynas }
451567a7532Smartynas x = nextval (x, -1);
452567a7532Smartynas tests += 1;
453567a7532Smartynas }
454567a7532Smartynas i += 1;
455567a7532Smartynas }
456567a7532Smartynas printf ("%d errors in %d tests\n", errs, tests);
457567a7532Smartynas return (errs);
458567a7532Smartynas }
459567a7532Smartynas #endif /* LDBL_MANT_DIG == 64 */
460