xref: /openbsd-src/regress/lib/libm/cephes/monotl.c (revision 2ed28c9ac500d01fe927ef9d88c1559f40a1750d)
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