1 /* $OpenBSD: monotll.c,v 1.2 2011/07/08 16:49:05 martynas Exp $ */
2
3 /*
4 * Copyright (c) 2008 Stephen L. Moshier <steve@moshier.net>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 /* monotll.c
20 Floating point function test vectors.
21 128-bit long double version.
22
23 Arguments and function values are synthesized for NPTS points in
24 the vicinity of each given tabulated test point. The points are
25 chosen to be near and on either side of the likely function algorithm
26 domain boundaries. Since the function programs change their methods
27 at these points, major coding errors or monotonicity failures might be
28 detected.
29
30 August, 1998
31 S. L. Moshier */
32
33 #include <float.h>
34
35 #if LDBL_MANT_DIG == 113
36 /* Unit of error tolerance in test[i].thresh. */
37 static long double MACHEPL = 1.9259299443872358530559779425849273185381E-34L;
38 /* How many times the above error to allow before printing a complaint.
39 If TOL < 0, consider absolute error instead of relative error. */
40 #define TOL 4
41 /* Number of test points to generate on each side of tabulated point. */
42 #define NPTS 100
43
44
45
46 #include <stdio.h>
47 #include <string.h>
48
49 /* Avoid including math.h. */
50 long double frexpl (long double, int *);
51 long double ldexpl (long double, int);
52
53 /* Functions of one variable. */
54 long double expl (long double);
55 long double expm1l (long double);
56 long double logl (long double);
57 long double log1pl (long double);
58 long double sinl (long double);
59 long double cosl (long double);
60 long double tanl (long double);
61 long double atanl (long double);
62 long double asinl (long double);
63 long double acosl (long double);
64 long double sinhl (long double);
65 long double coshl (long double);
66 long double tanhl (long double);
67 long double asinhl (long double);
68 long double acoshl (long double);
69 long double atanhl (long double);
70 long double lgammal (long double);
71 long double tgammal (long double);
72 long double fabsl (long double);
73 long double floorl (long double);
74 long double j0l (long double);
75 long double y0l (long double);
76 long double j1l (long double);
77 long double y1l (long double);
78 long double jnl (int, long double);
79 long double ynl (int, long double);
80
81 /* Data structure of the test. */
82 struct oneargument
83 {
84 char *name; /* Name of the function. */
85 long double (*func) (long double); /* Function call. */
86 long double arg1; /* Function argument, assumed exact. */
87 long double answer1; /* Exact number, close to function value. */
88 long double answer2; /* answer1 + answer2 has extended precision. */
89 long double derivative; /* dy/dx evaluated at x = arg1. */
90 /* Error report threshold. 2 => 1 ulp approximately
91 if thresh < 0 then consider absolute error instead of relative error. */
92 int thresh;
93
94 };
95
96
97
98 static struct oneargument test1[] =
99 {
100 {"exp", expl, 1.0L, 2.7182769775390625L,
101 4.85091998273536028747135266249775725E-6L,
102 2.71828182845904523536028747135266250E0L, TOL},
103 {"exp", expl, -1.0L, 3.678741455078125e-1L,
104 5.29566362982159552377016146086744581E-6L,
105 3.67879441171442321595523770161460867E-1L, TOL},
106 {"exp", expl, 0.5L, 1.648712158203125L,
107 9.11249700314684865078781416357165378E-6L,
108 1.64872127070012814684865078781416357L, TOL},
109 {"exp", expl, -0.5L, 6.065216064453125e-1L,
110 9.05326732092360379953499118045344192E-6L,
111 6.06530659712633423603799534991180453E-1L, TOL},
112 {"exp", expl, 2.0L, 7.3890533447265625L,
113 2.75420408772723042746057500781318032E-6L,
114 7.38905609893065022723042746057500781E0L, TOL},
115 {"exp", expl, -2.0L, 1.353302001953125e-1L,
116 5.08304130019189399949497248440340763E-6L,
117 1.35335283236612691893999494972484403E-1L, TOL},
118 {"expm1", expm1l, 1.0L, 1.7182769775390625L,
119 4.85091998273536028747135266249775725E-6L,
120 2.71828182845904523536028747135266250E0L, TOL},
121 {"expm1", expm1l, 0.5L, 0.648712158203125L,
122 9.11249700314684865078781416357165378E-6L,
123 1.64872127070012814684865078781416357L, TOL},
124 {"expm1", expm1l, 2.0L, 6.3890533447265625L,
125 2.75420408772723042746057500781318032E-6L,
126 7.38905609893065022723042746057500781E0L, TOL},
127 {"log", logl, 1.41421356237309504880168872420969798L,
128 3.465728759765625E-1L,
129 7.14303410154708616060729088217412434E-7L,
130 7.07106781186547524400844362104849086E-1L, TOL},
131 {"log", logl, 7.07106781186547524400844362104848992E-1L,
132 -3.46588134765625E-1L,
133 1.45444856523452913839392709116493369E-5L,
134 1.41421356237309504880168872420969817E0L, TOL},
135 {"log1p", log1pl, 0.41421356237309504880168872420969798L,
136 3.465728759765625E-1L,
137 7.14303410154708616060729088217412434E-7L,
138 7.07106781186547524400844362104849086E-1L, TOL},
139 {"sin", sinl, 7.85398163397448309615660845819875699E-1L,
140 7.0709228515625E-1L,
141 1.44960302975244008443621048490239551E-5L,
142 7.07106781186547524400844362104849055E-1, TOL},
143 {"sin", sinl, -7.85398163397448309615660845819875699E-1L,
144 -7.071075439453125E-1L,
145 7.62758764975599155637895150976044903E-7L,
146 7.07106781186547524400844362104849055E-1L, TOL},
147 {"sin", sinl, 1.57079632679489661923132169163975140E0L,
148 9.999847412109375E-1L,
149 1.52587890625E-5L,
150 0.0L, TOL},
151 {"sin", sinl, -1.57079632679489661923132169163975140E0L,
152 -1.0L,
153 0.0L,
154 0.0L, TOL},
155 {"sin", sinl, 4.71238898038468985769396507491925433E0L,
156 -1.0L,
157 0.0L,
158 0.0L, TOL},
159 {"sin", sinl, -4.71238898038468985769396507491925420E0L,
160 1.0L,
161 0.0L,
162 0.0L, TOL},
163 {"cos", cosl, 3.92699081698724154807830422909937850E-1L,
164 9.238739013671875E-1L,
165 5.63114409925612818318939678829097061E-6L,
166 -3.82683432365089771728459984030398857E-1L, TOL},
167 {"cos", cosl, 7.85398163397448309615660845819875699E-1L,
168 7.0709228515625E-1L,
169 1.44960302975244008443621048490546146E-5L,
170 -7.07106781186547524400844362104849024E-1L, TOL},
171 {"cos", cosl, 1.17809724509617246442349126872981355E0L,
172 3.826751708984375E-1L,
173 8.26146665227172845998403039889680525E-6L,
174 -9.23879532511286756128183189396788274E-1L, TOL},
175 {"cos", cosl, 1.96349540849362077403915211454968925E0L,
176 -3.826904296875E-1L,
177 6.99732241022827154001596960118331183E-6L,
178 -9.23879532511286756128183189396788308E-1L, TOL},
179 {"cos", cosl, 2.35619449019234492884698253745962710E0L,
180 -7.071075439453125E-1L,
181 7.62758764975599155637895151006704382E-7L,
182 -7.07106781186547524400844362104849085E-1L, TOL},
183 {"cos", cosl, 2.74889357189106908365481296036956495E0L,
184 -9.2388916015625E-1L,
185 9.62764496324387181681060321174221497E-6L,
186 -3.82683432365089771728459984030398937E-1L, TOL},
187 {"cos", cosl, 3.14159265358979323846264338327950280E0L,
188 -1.0L,
189 0.0L,
190 0.0L, TOL},
191 {"tan", tanl, 7.8539816339744830961566084581987569936977E-1L,
192 9.999847412109375E-1L,
193 1.5258789062499999999999999999956640949349E-5L,
194 2.0L, TOL},
195 {"tan", tanl, 1.1780972450961724644234912687298135490547E0L,
196 2.4141998291015625L,
197 1.3733271532548801688724209697856514083701E-5L,
198 6.8284271247461900976033774484193950849601E0L, TOL},
199 {"tan", tanl, 1.96349540849362077403915211454968925E0L,
200 -2.414215087890625L,
201 1.52551752995119831127579030155133768E-6L,
202 6.82842712474619009760337744841939794E0L, TOL},
203 {"tan", tanl, 2.35619449019234492884698253745962710E0L,
204 -1.0000152587890625L,
205 1.52587890624999999999999999998699228E-5L,
206 2.0L, TOL},
207 {"tan", tanl, 2.74889357189106908365481296036956495E0L,
208 -4.14215087890625E-1L,
209 1.52551752995119831127579030183253332E-6L,
210 1.17157287525380990239662255158060392E0L, TOL},
211 {"atan", atanl, 4.14213562373095048801688724209698081E-1L,
212 3.926849365234375E-1L,
213 1.41451752866548078304229099378622950E-5L,
214 8.53553390593273762200422181052424518E-1L, TOL},
215 {"atan", atanl, 1.0L,
216 7.853851318359375E-1L,
217 1.30315615108096156608458198757210493E-5L,
218 0.5L, TOL},
219 {"atan", atanl, 2.41421356237309504880168872420969818E0L,
220 1.1780853271484375L,
221 1.19179477349644234912687298135959800E-5L,
222 1.46446609406726237799577818947575470E-1L, TOL},
223 {"atan", atanl, -2.41421356237309504880168872420969818E0L,
224 -1.1781005859375L,
225 3.34084132753557650873127018640402003E-6L,
226 1.46446609406726237799577818947575470E-1L, TOL},
227 {"atan", atanl, -1.0L,
228 -7.85400390625E-1L,
229 2.22722755169038433915418012427895071E-6L,
230 0.5L, TOL},
231 {"atan", atanl, -4.14213562373095048801688724209698081E-1L,
232 -3.927001953125E-1L,
233 1.11361377584519216957709006213770502E-6L,
234 8.53553390593273762200422181052424518E-1L, TOL},
235 {"asin", asinl, 3.82683432365089771728459984030398880E-1L,
236 3.926849365234375E-1L,
237 1.41451752866548078304229099378750938E-5L,
238 1.08239220029239396879944641073277885E0L, TOL},
239 {"asin", asinl, 0.5L,
240 5.23590087890625E-1L,
241 8.68770767387307710723054658381403286E-6L,
242 1.15470053837925152901829756100391491E0L, TOL},
243 {"asin", asinl, 7.07106781186547524400844362104848992E-1L,
244 7.853851318359375E-1L,
245 1.30315615108096156608458198756544240E-5L,
246 1.41421356237309504880168872420969798E0L, TOL},
247 {"asin", asinl, 9.23879532511286756128183189396788310E-1L,
248 1.1780853271484375L,
249 1.19179477349644234912687298136415266E-5L,
250 2.61312592975275305571328634685437469E0L, TOL},
251 {"asin", asinl, -0.5L,
252 -5.236053466796875E-1L,
253 6.57108138862692289276945341618596714E-6L,
254 1.15470053837925152901829756100391491E0L, TOL},
255 {"asin", asinl, 1.16415321826934814453125E-10L,
256 1.16415321826934814453125E-10L,
257 2.62953635073670601805513180586984061E-31L,
258 1.00000000000000000000677626357803440E0L, TOL},
259 {"asin", asinl, 0.625L,
260 6.751251220703125E-1L,
261 6.41086671914720905626529438801420419E-6L,
262 1.28102523044069706786602935814149630E0L, TOL},
263 {"asin", asinl, 9.74999999999999999999999999999999981E-1L,
264 1.346710205078125L,
265 1.08364149523595315129076204973231659E-5L,
266 4.50035160370409562029946413944745541E0L, TOL},
267 {"acos", acosl, 1.95090322016128267848284868477022248E-1L,
268 1.3744354248046875L,
269 1.13611408470418274064801847825042255E-5L,
270 -1.01959115820831833788387960797568783E0L, TOL},
271 {"acos", acosl, 3.82683432365089771728459984030398880E-1L,
272 1.1780853271484375L,
273 1.19179477349644234912687298135670048E-5L,
274 -1.08239220029239396879944641073277885E0L, TOL},
275 {"acos", acosl, 0.5L,
276 1.0471954345703125L,
277 2.11662628524615421446109316762806572E-6L,
278 -1.15470053837925152901829756100391491E0L, TOL},
279 {"acos", acosl, 7.07106781186547524400844362104848992E-1L,
280 7.853851318359375E-1L,
281 1.30315615108096156608458198757876746E-5L,
282 -1.41421356237309504880168872420969798E0L, TOL},
283 {"acos", acosl, 9.23879532511286756128183189396788310E-1L,
284 3.926849365234375E-1L,
285 1.41451752866548078304229099378005720E-5L,
286 -2.61312592975275305571328634685437469E0L, TOL},
287 {"acos", acosl, 9.80785280403230449126182236134239047E-1L,
288 1.963348388671875E-1L,
289 1.47019821745774039152114549688769794E-5L,
290 -5.12583089548301235759217259235540119E0L, TOL},
291 {"acos", acosl, -0.5L,
292 2.094390869140625L,
293 4.23325257049230842892218633525613145E-6L,
294 -1.15470053837925152901829756100391491E0L, TOL},
295 {"sinh", sinhl, 1.0L,
296 1.1751861572265625L,
297 1.50364172389568823818505956008151557E-5L,
298 1.54308063481524377847790562075706168E0L, TOL},
299 {"sinh", sinhl, 11355.5L,
300 2.13776152623792146713900550884909252E4931L,
301 9.07106102767577900425552629248457689E4896L,
302 2.13776152623792146713900550884909261E4931L, TOL},
303 {"sinh", sinhl, 2.22044604925031308084726333618164062E-16L,
304 2.22044604925031308084726333618164062E-16L,
305 1.82460737542293889443193956157541613E-48L,
306 1.00000000000000000000000000000002465E0L, TOL},
307 {"sinh", sinhl, 40.0L,
308 1.17692633418509992E17L, 7.039499553745174001302586809814832360E-1L,
309 1.176926334185099927039499553745174044E17L, TOL},
310 {"sinh", sinhl, 6.938893903907228377647697925567626953E-18L, /* 2^-57 */
311 6.938893903907228377647697925567626953E-18L,
312 5.568259812692074262792784306565587261E-53L, 1.0L, TOL},
313 {"sinh", sinhl, 11356.375L,
314 5.1282233096855457613267954696602303826729E4931L,
315 6.8582733554584347269625352341976754246942E4896L,
316 5.1282233096855457613267954696602304512556E4931L, TOL},
317 {"cosh", coshl, 40.0L,
318 1.176926334185099927039499553745174054E17L,
319 -1.036733679609227143506056540471143597E-18L,
320 1.176926334185099927039499553745174001E17L, TOL},
321 {"cosh", coshl, 6.938893903907228377647697925567626953E-18L,
322 1.0L, 2.407412430484044816319972428231159158E-35L,
323 6.938893903907228377647697925567627009E-18L, TOL},
324 {"cosh", coshl, 11356.375L,
325 5.128223309685545761326795469660230383E4931L,
326 6.858273355458434726962535234197675425E4896L,
327 5.128223309685545761326795469660230451E4931L, TOL},
328 {"cosh", coshl, 11355.5L,
329 2.13776152623792146713900550884909252E4931L,
330 9.07106102767577900425552629248457689E4896L,
331 2.13776152623792146713900550884909261E4931L, TOL},
332 {"cosh", coshl, 1.0L,
333 1.5430755615234375L,
334 5.07329180627847790562075706168260153E-6L,
335 1.17520119364380145688238185059560082E0L, TOL},
336 {"cosh", coshl, 0.5L,
337 1.12762451171875L,
338 1.45348763078522622516140267201254785E-6L,
339 5.21095305493747361622425626411491559E-1L, TOL},
340 {"tanh", tanhl, 0.5L,
341 4.621124267578125E-1L,
342 4.73050219725850231848364367254873029E-6L,
343 7.86447732965927410149698934343636102E-1L, TOL},
344 {"tanh", tanhl, 5.49306144334054845697622618461262805E-1L,
345 4.999847412109375E-1L,
346 1.52587890624999999999999999999648170E-5L,
347 7.50000000000000000000000000000000035E-1L, TOL},
348 {"tanh", tanhl, 0.625L,
349 5.54595947265625E-1L,
350 3.77508375729399903909532308359605810E-6L,
351 6.92419147969988069630753311573341685E-1L, TOL},
352 {"tanh", tanhl, 40.0L,
353 1.0L,
354 -3.609702775690830344624256714700054777E-35L,
355 7.219405551381660689248513429400109424E-35L, TOL},
356 {"tanh", tanhl, 6.9388939039072283776476979255676269531250E-18L, /* 2^-57 */
357 6.9388939039072283776476979255676269531250E-18L,
358 -1.1136519625384148525585568613131174280582E-52L,
359 9.9999999999999999999999999999999995185175E-1L, TOL},
360 {"tanh", tanhl, 2.775557561562891351059079170227050781E-17L, /* 2^-55 */
361 2.775557561562891351059079170227050781E-17L,
362 -7.127372560245855056374763912403949481E-51L,
363 9.999999999999999999999999999999992296E-1L, TOL},
364 {"tanh", tanhl, 1.0L,
365 7.615814208984375e-1L,
366 1.273505732738811945828260479359041277E-5L,
367 4.199743416140260693944967390417014449E-1L, TOL},
368 {"asinh", asinhl, 0.5L,
369 4.81201171875E-1L,
370 1.06531846034474977589134243684231352E-5L,
371 8.94427190999915878563669467492510494E-1L, TOL},
372 {"asinh", asinhl, 1.0L,
373 8.813629150390625E-1L,
374 1.06719804805252326093249797923090282E-5L,
375 7.07106781186547524400844362104849039E-1L, TOL},
376 {"asinh", asinhl, 2.0L,
377 1.443634033203125L,
378 1.44197568534249327674027310526940555E-6L,
379 4.47213595499957939281834733746255247E-1L, TOL},
380 {"asinh", asinhl, 1.3877787807814456755295395851135253906250E-17L, /*2^-56*/
381 1.3877787807814456755295395851135253906250E-17L,
382 -4.4546078501536594102342274452524694119585E-52L,
383 9.9999999999999999999999999999999990370350E-1L, TOL},
384 {"asinh", asinhl, 1.8014398509481984E16L,
385 38.1230926513671875L,
386 2.2794298045179477666801997120145244851447E-6L,
387 5.5511151231257827021181583404540930096529E-17L, TOL},
388 {"acosh", acoshl, 2.0L,
389 1.31695556640625L,
390 2.33051856670862504634730796844402698E-6L,
391 5.77350269189625764509148780501957456E-1L, TOL},
392 {"acosh", acoshl, 1.5L,
393 9.624176025390625E-1L,
394 6.04758014439499551782684873684627037E-6L,
395 8.94427190999915878563669467492510494E-1L, TOL},
396 {"acosh", acoshl, 1.03125L,
397 2.493438720703125E-1L,
398 9.62177257298785143907541001884302707E-6L,
399 3.96911150685467059808817882107262579E0L, TOL},
400 {"acosh", acoshl, 2.68435456e8L, /* 2 ^ 28 */
401 20.10125732421875L,
402 1.091201966396963028457033350626731006E-5L,
403 3.725290298461914088349394142282115109E-9L, TOL},
404 {"acosh", acoshl, 1.8014398509481984e16L, /* 2 ^ 54 */
405 38.1230926513671875L,
406 2.279429804517947766680199710473780530E-6L,
407 5.551115123125782702118158340454110115E-17L, TOL},
408 {"acosh", acoshl, 1.073741824e9L, /* 2^30 */
409 21.487548828125L,
410 1.376923330459171735533070637272346848E-5L,
411 9.313225746154785160288967834731580446E-10L, TOL},
412 {"atanh", atanhl, 0.5L,
413 5.493011474609375E-1L,
414 4.99687311734569762261846126285232375E-6L,
415 1.33333333333333333333333333333333333E0L, TOL},
416 {"atanh", atanhl, 6.938893903907228377647697925567626953125E-18,
417 6.938893903907228377647697925567626953125E-18, /* 2^-57 */
418 1.1136519625384148525585568613131174816786E-52, 1.0, TOL},
419 #if 0
420 {"j0", j0l, 16.0L, -1.749114990234375e-1L,
421 1.24250398083151715974822741805925455E-5L,
422 -9.03971756613041862386833024580760244E-2L, -2},
423 {"j0", j0l, 8.0L, 1.716461181640625E-1L,
424 4.68897349140609086940785197200106842E-6L,
425 -2.34636346853914624381276651590454612E-1L, -2},
426 {"j0", j0l, 5.33333333333333333333333333333333333E0L,
427 -6.427001953125e-2L,
428 2.71515994768793872858212682917411767E-6L,
429 3.46125605116223455248039758589625114E-1L, -2},
430 {"j0", j0l, 4.0L, -3.9715576171875e-1L,
431 5.95185490262771340923154830195802438E-6L,
432 6.60433280235491361431854208032750287E-2L, -2},
433 {"j0", j0l, 3.2L, -3.201904296875e-1L,
434 2.26003037709271056745460231434000663E-6L,
435 -2.61343248780504837362986742359905319E-1L, -2},
436 {"j0", j0l, 2.66666666666666666666666666666666667E0L,
437 -1.275634765625e-1L,
438 2.48895584953746034929481550434723427E-6L,
439 -4.51651148392987785778929732830311060E-1L, -2},
440 {"j0", j0l, 2.28571428571428571428571428571428571E0L,
441 6.3262939453125e-2L,
442 7.41898014310740285267270594759284975E-6L,
443 -5.42395540605083481518545728422177515E-1L, -2},
444 {"j0", j0l, 2.0L,
445 2.23876953125e-1L,
446 1.38260162356680518274546499486258252E-5L,
447 -5.76724807756873387202448242269137087E-1L, -2},
448 {"y0", y0l, 16.0L,
449 9.58099365234375e-2L,
450 1.06055727490314207096590322941832776E-6L,
451 -1.77975168939416859630601904359871915E-1L, -2},
452 {"y0", y0l, 8.0L,
453 2.235107421875e-1L,
454 1.07472000662205273234004986203592748E-5L,
455 1.58060461731247494255555266187483550E-1L, -2},
456 {"y0", y0l, 5.33333333333333333333333333333333333E0L,
457 -3.387451171875e-1L,
458 1.48763307492243286439161163883136261E-5L,
459 -3.30338692743198039852173817311267913E-2L, -2},
460 {"y0", y0l, 4.0L,
461 -1.69525146484375E-2L,
462 1.17753233725080963648655528467817595E-5L,
463 -3.97925710557100005253979972450791852E-1L, -2},
464 {"y0", y0l, 3.2L,
465 3.070526123046875E-1L,
466 6.37827715583546999256417236405953385E-7L,
467 -3.70711338441274693924314235987044508E-1L, -2},
468 {"y0", y0l, 2.66666666666666666666666666666666667E0L,
469 4.67864990234375E-1L,
470 1.52461165366402773840048623192120982E-5L,
471 -2.14907152209457967672108494960545800E-1L, -2},
472 {"y0", y0l, 2.28571428571428571428571428571428571E0L,
473 5.18768310546875E-1L,
474 3.23404086137065314580351322765266943E-6L,
475 -4.51747395962233519705260050662299281E-2L, -2},
476 {"y0", y0l, 2.0L,
477 5.103607177734375E-1L,
478 1.49548763076195966065927271578732681E-5L,
479 1.07032431540937546888370772277476637E-1L, -2},
480 {"j1", j1l, 16.0L,
481 9.039306640625e-2L,
482 4.1092550541862386833024580760244495945291E-6L,
483 -1.8054889746246069646832022412944915898260E-1L, -2},
484 {"j1", j1l, 8.0L,
485 2.346343994140625e-1L,
486 1.9474398521243812766515904546115487521615E-6L,
487 1.4232126378081457804320982640316517462483E-1L, -2},
488 {"j1", j1l, 5.3333333333333333333333333333333330765427E0L,
489 -3.4613037109375e-1L,
490 4.7659775265447519602414103748858036315250E-6L,
491 6.3124658798958579773603686238379727242328E-4L, -2},
492 {"j1", j1l, 4.0L,
493 -6.60552978515625e-2L,
494 1.1969828013363856814579196724971272576580E-5L,
495 -3.8063897785796008825079441325087928479376E-1L, -2},
496 {"j1", j1l, 3.2000000000000000000000000000000001540744E0L,
497 2.613372802734375e-1L,
498 5.9685070673373629867423599052573498655055E-6L,
499 -4.0185793490103066896536590238515608924925E-1L, -2},
500 {"j1", j1l, 2.6666666666666666666666666666666665382713E0L,
501 4.516448974609375e-1L,
502 6.2509320502857789297328303110978154167062E-6L,
503 -2.9693016825402088220674935499586226461144E-1L, -2},
504 {"j1", j1l, 2.2857142857142857142857142857142856042326E0L,
505 5.42388916015625e-1L,
506 6.6245894584815185457284221775341820978577E-6L,
507 -1.7402769058145591576151108347875503008807E-1L, -2},
508 {"j1", j1l, 2.0L,
509 5.7672119140625e-1L,
510 3.6163506233872024482422691370869203026897E-6L,
511 -6.4471624737201025549396666484619917634997E-2L, -2},
512 {"y1", y1l, 16.0L,
513 1.779632568359375e-1L,
514 1.1912103479359630601904359871915459722520E-5L,
515 8.4687549021998849415158346880737423611524E-2L, -2},
516 {"y1", y1l, 8.0L,
517 -1.580657958984375e-1L,
518 5.3341671900057444447338125164496726559505E-6L,
519 2.4327904710397215730926780877205580306573E-1L, -2},
520 {"y1", y1l, 5.3333333333333333333333333333333330765427E0L,
521 3.302001953125e-2L,
522 1.3849743069803985217381731126879849266308E-5L,
523 -3.4492409134568573891858434295819796816112E-1L, -2},
524 {"y1", y1l, 4.0L,
525 3.97918701171875e-1L,
526 7.0093852250052539799724507918522711891816E-6L,
527 -1.1642216696433999321713012755985118130829E-1L, -2},
528 {"y1", y1l, 3.2000000000000000000000000000000001540744E0L,
529 3.70697021484375e-1L,
530 1.4316956899693924314235987044537888863453E-5L,
531 1.9120595686950474169565105767128493632383E-1L, -2},
532 {"y1", y1l, 2.6666666666666666666666666666666665382713E0L,
533 2.1490478515625e-1L,
534 2.3670532079676721084949605457501811641711E-6L,
535 3.8729005427236490240034331925211457949310E-1L, -2},
536 {"y1", y1l, 2.2857142857142857142857142857142856042326E0L,
537 4.5166015625e-2L,
538 8.7239712233519705260050662298731987015100E-6L,
539 4.9900759601438865416604067629675208716502E-1L, -2},
540 {"y1", y1l, 2.0L,
541 -1.070404052734375e-1L,
542 7.9737324999531116292277225233633125191018E-6L,
543 5.6389188842021389304079197886589619161188E-1L, -2},
544 {"jnl", NULL, 6.9388939039072283776476979255676269531250E-18L,
545 6.9602982143332406209530299018670212642178E-54L,
546 2.6551531852207537950481339962774251294400E-59L,
547 3.0092655e-36L, -2},
548 #endif
549 {"lgamma", lgammal, 8.0L, 8.525146484375L,
550 1.4876690414300165531036347125050759667737E-5L,
551 2.0156414779556099965363450527747404656959E0L, 4},
552 {"lgamma", lgammal, 0.125L, 2.0194091796875E0L,
553 9.1778662963453202905211670995899482809521E-6L,
554 -8.3884926632958548678027429230863429642684E0L, 4},
555 {"lgamma", lgammal, 0.375L, 8.63067626953125E-1L,
556 6.3553175224624050890941340154953324706293E-6L,
557 -2.7539990491451395757640192188045680759926E0L, 4},
558 {"lgamma", lgammal, 0.625L, 3.608245849609375E-1L,
559 4.9105280026811849576858227794878573691202E-6L,
560 -1.4527087645765665672107816120233772668729E0L, 4},
561 {"lgamma", lgammal, 0.875L, 8.5845947265625E-2L,
562 1.2759959709323502365583769487702269719126E-5L,
563 -8.0401707154769538232421854974614639758707E-1L, 4},
564 {"lgamma", lgammal, 1.0L, 0.0L,
565 0.0L, -5.7721566490153286060651209008240239144696E-1L, -4},
566 {"lgamma", lgammal, 1.125L, -6.0028076171875E-2L,
567 4.8920458354170685941567925698857217805491E-6L,
568 -3.8849266329585486780274292308634296426837E-1L, 4},
569 {"lgamma", lgammal, 1.375L, -1.17767333984375E-1L,
570 1.2063243296225548637966682011495753460784E-5L,
571 -8.7332382478472909097352552137901409325952E-2L, 4},
572 {"lgamma", lgammal, 1.625L, -1.091766357421875E-1L,
573 2.5019853921275340206546744374231564700714E-6L,
574 1.4729123542343343278921838797662273312715E-1L, 4},
575 {"lgamma", lgammal, 1.875L, -4.76837158203125E-2L,
576 1.1030421124200356021962838137727680303452E-5L,
577 3.3884007130944747481863859311099645955579E-1L, 4},
578 {"lgamma", lgammal, 2.375L, 2.0068359375E-1L,
579 1.4866627455841358885180272611091348667235E-5L,
580 6.3994034479425436362992017513482586340132E-1L, 4},
581 {"lgamma", lgammal, 2.75L, 4.752044677734375E-1L,
582 1.0199141499630313102466395428861742242065E-5L,
583 8.1890102497543259227787514194472409043081E-1L, 4},
584 {"lgamma", lgammal, 3.5L, 1.2009735107421875E0L,
585 9.1604886724816021881450712995770238915468E-8L,
586 1.1031566406452431872256903336679111259463E0L, 4},
587 {"lgamma", lgammal, 4.5L, 2.4537353515625E0L,
588 1.2192799422205041425034357161573318235107E-6L,
589 1.3888709263595289015114046193821968402320E0L, 4},
590 {"lgamma", lgammal, 5.5L, 3.9578094482421875E0L,
591 4.5193765287938774008558225909985513044920E-6L,
592 1.6110931485817511237336268416044190624542E0L, 4},
593 {"lgamma", lgammal, 6.5L, 5.6625518798828125E0L,
594 1.0179974329028522112312329543730297511212E-5L,
595 1.7929113303999329419154450234226008806361E0L, 4},
596 {"lgamma", lgammal, 7.5L, 7.53436279296875E0L,
597 1.4437899829551583676324366857670272790220E-6L,
598 1.9467574842460867880692911772687547267899E0L, 4},
599 {"lgamma", lgammal, 8.5L, 9.54925537109375E0L,
600 1.1886207247711737140081127222543124870800E-5L,
601 2.0800908175794201214026245106020880601232E0L, 4},
602 {"lgamma", lgammal, 9.5L, 1.16893310546875E1L,
603 2.3661097684825694425775421725106375736779E-6L,
604 2.1977378764029495331673303929550292365938E0L, 4},
605 {"lgamma", lgammal, 10.5L, 1.394061279296875E1L,
606 1.2426435013633161237887971849479799452805E-5L,
607 2.3030010342976863752725935508497660786991E0L, 4},
608 {"lgamma", lgammal, 11.5L, 1.62919921875E1L,
609 8.2890672413202446037468793783460085279579E-6L,
610 2.3982391295357816133678316460878613167943E0L, 4},
611 {"lgamma", lgammal, 12.5L, 1.8734344482421875E1L,
612 3.0295145707016341244572313978963754081384E-6L,
613 2.4851956512749120481504403417400352298378E0L, 4},
614 {"lgamma", lgammal, 13.5L, 2.126007080078125E1L,
615 5.3554634511414184110022255966073511107125E-6L,
616 2.5651956512749120481504403417400352298378E0, 4},
617 {"lgamma", lgammal, -0.5L, 1.2655029296875E0L,
618 9.1937971453964889457971347059238991475408E-6L,
619 3.6489973978576520559023667001244459279636E-2L, 4},
620 {"lgamma", lgammal, -1.5L, 8.6004638671875E-1L,
621 6.2865773101451093268167035678732715711736E-7L,
622 7.0315664064524318722569033366791112594630E-1L, 4},
623 {"lgamma", lgammal, -2.5L, -5.6243896484375E-2L,
624 1.7998670094932740546990234571587705589745E-7L,
625 1.1031566406452431872256903336679111259463E0L, -4},
626 {"lgamma", lgammal, -3.5L,-1.30902099609375E0L,
627 1.4311100707953639284847917342554315471302E-5L,
628 1.3888709263595289015114046193821968402320E0L, -4},
629 {"lgamma", lgammal, 1.0e18L, 4.0446531673037733888E19L,
630 8.5508840451951888057681732252156677289759E8L,
631 4.1446531673892822311823846184318555736736E1, 4},
632 {"tgamma", tgammal, 1.0L, 1.0L,
633 0.0L, -5.772156649015328606e-1L, 4},
634 {"tgamma", tgammal, 2.0L, 1.0L,
635 0.0L, 4.2278433509846713939e-1L, 4},
636 {"tgamma", tgammal, 3.0L, 2.0L,
637 0.0L, 1.845568670196934279L, 4},
638 {"tgamma", tgammal, 4.0L, 6.0L,
639 0.0L, 7.536706010590802836L, 4},
640 {NULL, NULL, 0.0L, 0.0L, 0.0L, 1},
641 };
642
643 /* These take care of extra-precise floating point register problems. */
644 static volatile long double volat1;
645 static volatile long double volat2;
646
647
648 /* Return the next nearest floating point value to X
649 in the direction of UPDOWN (+1 or -1).
650 (Might fail if X is denormalized.) */
651
652 static long double
nextval(x,updown)653 nextval (x, updown)
654 long double x;
655 int updown;
656 {
657 long double m;
658 int i;
659
660 volat1 = x;
661 m = 0.25L * MACHEPL * volat1 * updown;
662 volat2 = volat1 + m;
663 if (volat2 != volat1)
664 printf ("successor failed\n");
665
666 for (i = 2; i < 10; i++)
667 {
668 volat2 = volat1 + i * m;
669 if (volat1 != volat2)
670 return volat2;
671 }
672
673 printf ("nextval failed\n");
674 return volat1;
675 }
676
677
678
679
680 int
monotll()681 monotll ()
682 {
683 long double (*fun1) (long double);
684 int i, j, errs, tests, err_thresh;
685 long double x, x0, dy, err;
686
687 errs = 0;
688 tests = 0;
689 i = 0;
690
691 for (;;)
692 {
693 /* Function call reference. */
694 fun1 = test1[i].func;
695 if (test1[i].name == NULL)
696 break;
697 /*
698 if (fun1 == NULL)
699 break;
700 */
701 /* Function argument. */
702 volat1 = test1[i].arg1;
703 /* x0 is the given argument, x scans from slightly below to above x0. */
704 x0 = volat1;
705 x = volat1;
706 for (j = 0; j <= NPTS; j++)
707 {
708 /* delta x */
709 volat1 = x - x0;
710 /* delta y */
711 dy = volat1 * test1[i].derivative;
712 /* y + delta y */
713 dy = test1[i].answer2 + dy;
714 volat1 = test1[i].answer1 + dy;
715 /* Run the function under test. */
716 if (fun1 == NULL)
717 {
718 #if 0
719 if (! strcmp (test1[i].name, "jnl"))
720 volat2 = jnl (3, x);
721 else
722 #endif
723 break;
724 }
725 else
726 volat2 = (*(fun1)) (x);
727 if (volat2 != volat1)
728 {
729 /* Estimate difference between program result
730 and extended precision function value. */
731 err = volat2 - test1[i].answer1;
732 err = err - dy;
733 /* Compare difference with reporting threshold. */
734 err_thresh = test1[i].thresh;
735 if (err_thresh >= 0)
736 err = err / volat1; /* relative error */
737 else
738 {
739 err_thresh = -err_thresh; /* absolute error */
740 /* ...but relative error if function value > 1 */
741 if (fabsl(volat1) > 1.0L)
742 err = err / volat1;
743 }
744 if (fabsl (err) > (err_thresh * MACHEPL))
745 {
746 printf ("%d %s(%.36Le) = %.36Le, rel err = %.3Le\n",
747 j, test1[i].name, x, volat2, err);
748 errs += 1;
749 }
750 }
751 x = nextval (x, 1);
752 tests += 1;
753 }
754
755 x = x0;
756 x = nextval (x, -1);
757 for (j = 1; j < NPTS; j++)
758 {
759 volat1 = x - x0;
760 dy = volat1 * test1[i].derivative;
761 dy = test1[i].answer2 + dy;
762 volat1 = test1[i].answer1 + dy;
763 if (fun1 == NULL)
764 {
765 #if 0
766 if (! strcmp (test1[i].name, "jnl"))
767 volat2 = jnl (3, x);
768 else
769 #endif
770 break;
771 }
772 else
773 volat2 = (*(fun1)) (x);
774 if (volat2 != volat1)
775 {
776 err = volat2 - test1[i].answer1;
777 err = err - dy;
778 err_thresh = test1[i].thresh;
779 if (err_thresh >= 0)
780 err = err / volat1; /* relative error */
781 else
782 {
783 err_thresh = -err_thresh;
784 if (fabsl(volat1) > 1.0L)
785 err = err / volat1;
786 }
787 if (fabsl (err) > (err_thresh * MACHEPL))
788 {
789 printf ("%d %s(%.36Le) = %.36Le, rel err = %.3Le\n",
790 j, test1[i].name, x, volat2, err);
791 errs += 1;
792 }
793 }
794 x = nextval (x, -1);
795 tests += 1;
796 }
797 i += 1;
798 }
799 printf ("%d errors in %d tests\n", errs, tests);
800 return (errs);
801 }
802 #endif /* LDBL_MANT_DIG == 113 */
803