Coverage Report

Created: 2025-12-27 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/wsutil/dtoa.c
Line
Count
Source
1
/****************************************************************
2
 *
3
 * The author of this software is David M. Gay.
4
 *
5
 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
6
 *
7
 * Permission to use, copy, modify, and distribute this software for any
8
 * purpose without fee is hereby granted, provided that this entire notice
9
 * is included in all copies of any software which is or includes a copy
10
 * or modification of this software and in all copies of the supporting
11
 * documentation for such software.
12
 *
13
 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
14
 * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
15
 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16
 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
17
 *
18
 ***************************************************************/
19
20
/* Please send bug reports to David M. Gay (dmg at acm dot org,
21
 * with " at " changed at "@" and " dot " changed to ".").  */
22
23
/* On a machine with IEEE extended-precision registers, it is
24
 * necessary to specify double-precision (53-bit) rounding precision
25
 * before invoking strtod or dtoa.  If the machine uses (the equivalent
26
 * of) Intel 80x87 arithmetic, the call
27
 *  _control87(PC_53, MCW_PC);
28
 * does this with many compilers.  Whether this or another call is
29
 * appropriate depends on the compiler; for this to work, it may be
30
 * necessary to #include "float.h" or another system-dependent header
31
 * file.  When needed, this call avoids double rounding, which can
32
 * cause one bit errors, e.g., with strtod on 8.3e26 or 6.3876e-16.
33
 */
34
35
/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
36
 * (Note that IEEE arithmetic is disabled by gcc's -ffast-math flag.)
37
 *
38
 * This strtod returns a nearest machine number to the input decimal
39
 * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
40
 * broken by the IEEE round-even rule.  Otherwise ties are broken by
41
 * biased rounding (add half and chop).
42
 *
43
 * Inspired loosely by William D. Clinger's paper "How to Read Floating
44
 * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
45
 *
46
 * Modifications:
47
 *
48
 *  1. We only require IEEE, IBM, or VAX double-precision
49
 *    arithmetic (not IEEE double-extended).
50
 *  2. We get by with floating-point arithmetic in a case that
51
 *    Clinger missed -- when we're computing d * 10^n
52
 *    for a small integer d and the integer n is not too
53
 *    much larger than 22 (the maximum integer k for which
54
 *    we can represent 10^k exactly), we may be able to
55
 *    compute (d*10^k) * 10^(e-k) with just one roundoff.
56
 *  3. Rather than a bit-at-a-time adjustment of the binary
57
 *    result in the hard case, we use floating-point
58
 *    arithmetic to determine the adjustment to within
59
 *    one bit; only in really hard cases do we need to
60
 *    compute a second residual.
61
 *  4. Because of 3., we don't need a large table of powers of 10
62
 *    for ten-to-e (just some small tables, e.g. of 10^k
63
 *    for 0 <= k <= 22).
64
 */
65
66
/*
67
 * #define IEEE_8087 for IEEE-arithmetic machines where the least
68
 *  significant byte has the lowest address.
69
 * #define IEEE_MC68k for IEEE-arithmetic machines where the most
70
 *  significant byte has the lowest address.
71
 * #define Long int on machines with 32-bit ints and 64-bit longs.
72
 * #define IBM for IBM mainframe-style floating-point arithmetic.
73
 * #define VAX for VAX-style floating-point arithmetic (D_floating).
74
 * #define No_leftright to omit left-right logic in fast floating-point
75
 *  computation of dtoa.  This will cause dtoa modes 4 and 5 to be
76
 *  treated the same as modes 2 and 3 for some inputs.
77
 * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
78
 *  and strtod and dtoa should round accordingly.  Unless Trust_FLT_ROUNDS
79
 *  is also #defined, fegetround() will be queried for the rounding mode.
80
 *  Note that both FLT_ROUNDS and fegetround() are specified by the C99
81
 *  standard (and are specified to be consistent, with fesetround()
82
 *  affecting the value of FLT_ROUNDS), but that some (Linux) systems
83
 *  do not work correctly in this regard, so using fegetround() is more
84
 *  portable than using FLT_ROUNDS directly.
85
 * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
86
 *  and Honor_FLT_ROUNDS is not #defined.
87
 * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
88
 *  that use extended-precision instructions to compute rounded
89
 *  products and quotients) with IBM.
90
 * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic
91
 *  that rounds toward +Infinity.
92
 * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased
93
 *  rounding when the underlying floating-point arithmetic uses
94
 *  unbiased rounding.  This prevent using ordinary floating-point
95
 *  arithmetic when the result could be computed with one rounding error.
96
 * #define Inaccurate_Divide for IEEE-format with correctly rounded
97
 *  products but inaccurate quotients, e.g., for Intel i860.
98
 * #define NO_LONG_LONG on machines that do not have a "long long"
99
 *  integer type (of >= 64 bits).  On such machines, you can
100
 *  #define Just_16 to store 16 bits per 32-bit Long when doing
101
 *  high-precision integer arithmetic.  Whether this speeds things
102
 *  up or slows things down depends on the machine and the number
103
 *  being converted.  If long long is available and the name is
104
 *  something other than "long long", #define Llong to be the name,
105
 *  and if "unsigned Llong" does not work as an unsigned version of
106
 *  Llong, #define #ULLong to be the corresponding unsigned type.
107
 * #define Bad_float_h if your system lacks a float.h or if it does not
108
 *  define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
109
 *  FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
110
 * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
111
 *  if memory is available and otherwise does something you deem
112
 *  appropriate.  If MALLOC is undefined, malloc will be invoked
113
 *  directly -- and assumed always to succeed.  Similarly, if you
114
 *  want something other than the system's free() to be called to
115
 *  recycle memory acquired from MALLOC, #define FREE to be the
116
 *  name of the alternate routine.  (FREE or free is only called in
117
 *  pathological cases, e.g., in a dtoa call after a dtoa return in
118
 *  mode 3 with thousands of digits requested.)
119
 * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
120
 *  memory allocations from a private pool of memory when possible.
121
 *  When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,
122
 *  unless #defined to be a different length.  This default length
123
 *  suffices to get rid of MALLOC calls except for unusual cases,
124
 *  such as decimal-to-binary conversion of a very long string of
125
 *  digits.  The longest string dtoa can return is about 751 bytes
126
 *  long.  For conversions by strtod of strings of 800 digits and
127
 *  all dtoa conversions in single-threaded executions with 8-byte
128
 *  pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte
129
 *  pointers, PRIVATE_MEM >= 7112 appears adequate.
130
 * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
131
 *  #defined automatically on IEEE systems.  On such systems,
132
 *  when INFNAN_CHECK is #defined, strtod checks
133
 *  for Infinity and NaN (case insensitively).  On some systems
134
 *  (e.g., some HP systems), it may be necessary to #define NAN_WORD0
135
 *  appropriately -- to the most significant word of a quiet NaN.
136
 *  (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
137
 *  When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
138
 *  strtod also accepts (case insensitively) strings of the form
139
 *  NaN(x), where x is a string of hexadecimal digits and spaces;
140
 *  if there is only one string of hexadecimal digits, it is taken
141
 *  for the 52 fraction bits of the resulting NaN; if there are two
142
 *  or more strings of hex digits, the first is for the high 20 bits,
143
 *  the second and subsequent for the low 32 bits, with intervening
144
 *  white space ignored; but if this results in none of the 52
145
 *  fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0
146
 *  and NAN_WORD1 are used instead.
147
 * #define MULTIPLE_THREADS if the system offers preemptively scheduled
148
 *  multiple threads.  In this case, you must provide (or suitably
149
 *  #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
150
 *  by FREE_DTOA_LOCK(n) for n = 0 or 1.  (The second lock, accessed
151
 *  in pow5mult, ensures lazy evaluation of only one copy of high
152
 *  powers of 5; omitting this lock would introduce a small
153
 *  probability of wasting memory, but would otherwise be harmless.)
154
 *  You must also invoke freedtoa(s) to free the value s returned by
155
 *  dtoa.  You may do so whether or not MULTIPLE_THREADS is #defined.
156
157
 *  When MULTIPLE_THREADS is #defined, this source file provides
158
 *    void set_max_dtoa_threads(unsigned int n);
159
 *  and expects
160
 *    unsigned int dtoa_get_threadno(void);
161
 *  to be available (possibly provided by
162
 *    #define dtoa_get_threadno omp_get_thread_num
163
 *  if OpenMP is in use or by
164
 *    #define dtoa_get_threadno pthread_self
165
 *  if Pthreads is in use), to return the current thread number.
166
 *  If set_max_dtoa_threads(n) was called and the current thread
167
 *  number is k with k < n, then calls on ACQUIRE_DTOA_LOCK(...) and
168
 *  FREE_DTOA_LOCK(...) are avoided; instead each thread with thread
169
 *  number < n has a separate copy of relevant data structures.
170
 *  After set_max_dtoa_threads(n), a call set_max_dtoa_threads(m)
171
 *  with m <= n has has no effect, but a call with m > n is honored.
172
 *  Such a call invokes REALLOC (assumed to be "realloc" if REALLOC
173
 *  is not #defined) to extend the size of the relevant array.
174
175
 * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that
176
 *  avoids underflows on inputs whose result does not underflow.
177
 *  If you #define NO_IEEE_Scale on a machine that uses IEEE-format
178
 *  floating-point numbers and flushes underflows to zero rather
179
 *  than implementing gradual underflow, then you must also #define
180
 *  Sudden_Underflow.
181
 * #define USE_LOCALE to use the current locale's decimal_point value.
182
 * #define SET_INEXACT if IEEE arithmetic is being used and extra
183
 *  computation should be done to set the inexact flag when the
184
 *  result is inexact and avoid setting inexact when the result
185
 *  is exact.  In this case, dtoa.c must be compiled in
186
 *  an environment, perhaps provided by #include "dtoa.c" in a
187
 *  suitable wrapper, that defines two functions,
188
 *    int get_inexact(void);
189
 *    void clear_inexact(void);
190
 *  such that get_inexact() returns a nonzero value if the
191
 *  inexact bit is already set, and clear_inexact() sets the
192
 *  inexact bit to 0.  When SET_INEXACT is #defined, strtod
193
 *  also does extra computations to set the underflow and overflow
194
 *  flags when appropriate (i.e., when the result is tiny and
195
 *  inexact or when it is a numeric value rounded to +-infinity).
196
 * #define NO_ERRNO if strtod should not assign errno = ERANGE when
197
 *  the result overflows to +-Infinity or underflows to 0.
198
 *  When errno should be assigned, under seemingly rare conditions
199
 *  it may be necessary to define Set_errno(x) suitably, e.g., in
200
 *  a local errno.h, such as
201
 *    #include <errno.h>
202
 *    #define Set_errno(x) _set_errno(x)
203
 * #define NO_HEX_FP to omit recognition of hexadecimal floating-point
204
 *  values by strtod.
205
 * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now)
206
 *  to disable logic for "fast" testing of very long input strings
207
 *  to strtod.  This testing proceeds by initially truncating the
208
 *  input string, then if necessary comparing the whole string with
209
 *  a decimal expansion to decide close cases. This logic is only
210
 *  used for input more than STRTOD_DIGLIM digits long (default 40).
211
 */
212
213
/* Begin Wireshark defines and includes */
214
#include <wireshark.h>
215
#include "dtoa.h"
216
217
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
218
#define IEEE_8087
219
#elif G_BYTE_ORDER == G_BIG_ENDIAN
220
#define IEEE_MC68k
221
#else
222
#error "Unsupported byte order"
223
#endif
224
225
0
#define MALLOC g_malloc
226
#define REALLOC g_realloc
227
0
#define FREE g_free
228
229
typedef int32_t Long;
230
typedef uint32_t ULong;
231
typedef uint64_t ULLong;
232
233
#define NO_HEX_FP
234
235
#ifdef _MSC_VER
236
/* disable: "warning C4146: unary minus operator applied to unsigned type, result still unsigned" */
237
#pragma warning(disable:4146)
238
#endif
239
240
/* End Wireshark defines and includes */
241
242
#ifndef Long
243
#define Long int
244
#endif
245
#ifndef ULong
246
typedef unsigned Long ULong;
247
#endif
248
249
#ifdef DEBUG
250
#include <assert.h>
251
#include "stdio.h"
252
#define Bug(x) {ws_error("%s", x);}
253
#define Debug(x) x
254
int dtoa_stats[7]; /* strtod_{64,96,bigcomp},dtoa_{exact,64,96,bigcomp} */
255
#else
256
#define assert(x) /*nothing*/
257
#define Debug(x) /*nothing*/
258
#endif
259
260
#include "stdlib.h"
261
#include "string.h"
262
263
#ifdef USE_LOCALE
264
#include "locale.h"
265
#endif
266
267
#ifdef Honor_FLT_ROUNDS
268
#ifndef Trust_FLT_ROUNDS
269
#include <fenv.h>
270
#endif
271
#endif
272
273
#ifndef Omit_Private_Memory
274
#ifndef PRIVATE_MEM
275
0
#define PRIVATE_MEM 2304
276
#endif
277
0
#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
278
static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
279
#endif
280
281
#undef IEEE_Arith
282
#undef Avoid_Underflow
283
#ifdef IEEE_MC68k
284
#define IEEE_Arith
285
#endif
286
#ifdef IEEE_8087
287
#define IEEE_Arith
288
#endif
289
290
#ifdef IEEE_Arith
291
#ifndef NO_INFNAN_CHECK
292
#undef INFNAN_CHECK
293
#define INFNAN_CHECK
294
#endif
295
#else
296
#undef INFNAN_CHECK
297
#define NO_STRTOD_BIGCOMP
298
#endif
299
300
#include "errno.h"
301
302
#ifdef NO_ERRNO /*{*/
303
#undef Set_errno
304
#define Set_errno(x)
305
#else
306
#ifndef Set_errno
307
#define Set_errno(x) errno = x
308
#endif
309
#endif /*}*/
310
311
#ifdef Bad_float_h
312
313
#ifdef IEEE_Arith
314
#define DBL_DIG 15
315
#define DBL_MAX_10_EXP 308
316
#define DBL_MAX_EXP 1024
317
#define FLT_RADIX 2
318
#endif /*IEEE_Arith*/
319
320
#ifdef IBM
321
#define DBL_DIG 16
322
#define DBL_MAX_10_EXP 75
323
#define DBL_MAX_EXP 63
324
#define FLT_RADIX 16
325
#define DBL_MAX 7.2370055773322621e+75
326
#endif
327
328
#ifdef VAX
329
#define DBL_DIG 16
330
#define DBL_MAX_10_EXP 38
331
#define DBL_MAX_EXP 127
332
#define FLT_RADIX 2
333
#define DBL_MAX 1.7014118346046923e+38
334
#endif
335
336
#ifndef LONG_MAX
337
#define LONG_MAX 2147483647
338
#endif
339
340
#else /* ifndef Bad_float_h */
341
#include "float.h"
342
#endif /* Bad_float_h */
343
344
#ifndef __MATH_H__
345
#include "math.h"
346
#endif
347
348
#ifdef __cplusplus
349
extern "C" {
350
#endif
351
352
#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
353
Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
354
#endif
355
356
#undef USE_BF96
357
358
#ifdef NO_LONG_LONG /*{{*/
359
#undef ULLong
360
#ifdef Just_16
361
#undef Pack_32
362
/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
363
 * This makes some inner loops simpler and sometimes saves work
364
 * during multiplications, but it often seems to make things slightly
365
 * slower.  Hence the default is now to store 32 bits per Long.
366
 */
367
#endif
368
#else /*}{ long long available */
369
#ifndef Llong
370
#define Llong long long
371
#endif
372
#ifndef ULLong
373
0
#define ULLong unsigned Llong
374
#endif
375
#ifndef NO_BF96 /*{*/
376
#define USE_BF96
377
378
#ifdef SET_INEXACT
379
#define dtoa_divmax 27
380
#else
381
static const int dtoa_divmax = 2;
382
      /* Permit experimenting: on some systems, 64-bit integer */
383
      /* division is slow enough that we may sometimes want to */
384
      /* avoid using it.   We assume (but do not check) that   */
385
      /* dtoa_divmax <= 27.*/
386
#endif
387
388
typedef struct BF96 {   /* Normalized 96-bit software floating point numbers */
389
  unsigned int b0,b1,b2;  /* b0 = most significant, binary point just to its left */
390
  int e;      /* number represented = b * 2^e, with .5 <= b < 1 */
391
  } BF96;
392
393
 static const BF96 pten[667] = {
394
  { 0xeef453d6, 0x923bd65a, 0x113faa29, -1136 },
395
  { 0x9558b466, 0x1b6565f8, 0x4ac7ca59, -1132 },
396
  { 0xbaaee17f, 0xa23ebf76, 0x5d79bcf0, -1129 },
397
  { 0xe95a99df, 0x8ace6f53, 0xf4d82c2c, -1126 },
398
  { 0x91d8a02b, 0xb6c10594, 0x79071b9b, -1122 },
399
  { 0xb64ec836, 0xa47146f9, 0x9748e282, -1119 },
400
  { 0xe3e27a44, 0x4d8d98b7, 0xfd1b1b23, -1116 },
401
  { 0x8e6d8c6a, 0xb0787f72, 0xfe30f0f5, -1112 },
402
  { 0xb208ef85, 0x5c969f4f, 0xbdbd2d33, -1109 },
403
  { 0xde8b2b66, 0xb3bc4723, 0xad2c7880, -1106 },
404
  { 0x8b16fb20, 0x3055ac76, 0x4c3bcb50, -1102 },
405
  { 0xaddcb9e8, 0x3c6b1793, 0xdf4abe24, -1099 },
406
  { 0xd953e862, 0x4b85dd78, 0xd71d6dad, -1096 },
407
  { 0x87d4713d, 0x6f33aa6b, 0x8672648c, -1092 },
408
  { 0xa9c98d8c, 0xcb009506, 0x680efdaf, -1089 },
409
  { 0xd43bf0ef, 0xfdc0ba48, 0x0212bd1b, -1086 },
410
  { 0x84a57695, 0xfe98746d, 0x014bb630, -1082 },
411
  { 0xa5ced43b, 0x7e3e9188, 0x419ea3bd, -1079 },
412
  { 0xcf42894a, 0x5dce35ea, 0x52064cac, -1076 },
413
  { 0x818995ce, 0x7aa0e1b2, 0x7343efeb, -1072 },
414
  { 0xa1ebfb42, 0x19491a1f, 0x1014ebe6, -1069 },
415
  { 0xca66fa12, 0x9f9b60a6, 0xd41a26e0, -1066 },
416
  { 0xfd00b897, 0x478238d0, 0x8920b098, -1063 },
417
  { 0x9e20735e, 0x8cb16382, 0x55b46e5f, -1059 },
418
  { 0xc5a89036, 0x2fddbc62, 0xeb2189f7, -1056 },
419
  { 0xf712b443, 0xbbd52b7b, 0xa5e9ec75, -1053 },
420
  { 0x9a6bb0aa, 0x55653b2d, 0x47b233c9, -1049 },
421
  { 0xc1069cd4, 0xeabe89f8, 0x999ec0bb, -1046 },
422
  { 0xf148440a, 0x256e2c76, 0xc00670ea, -1043 },
423
  { 0x96cd2a86, 0x5764dbca, 0x38040692, -1039 },
424
  { 0xbc807527, 0xed3e12bc, 0xc6050837, -1036 },
425
  { 0xeba09271, 0xe88d976b, 0xf7864a44, -1033 },
426
  { 0x93445b87, 0x31587ea3, 0x7ab3ee6a, -1029 },
427
  { 0xb8157268, 0xfdae9e4c, 0x5960ea05, -1026 },
428
  { 0xe61acf03, 0x3d1a45df, 0x6fb92487, -1023 },
429
  { 0x8fd0c162, 0x06306bab, 0xa5d3b6d4, -1019 },
430
  { 0xb3c4f1ba, 0x87bc8696, 0x8f48a489, -1016 },
431
  { 0xe0b62e29, 0x29aba83c, 0x331acdab, -1013 },
432
  { 0x8c71dcd9, 0xba0b4925, 0x9ff0c08b, -1009 },
433
  { 0xaf8e5410, 0x288e1b6f, 0x07ecf0ae, -1006 },
434
  { 0xdb71e914, 0x32b1a24a, 0xc9e82cd9, -1003 },
435
  { 0x892731ac, 0x9faf056e, 0xbe311c08,  -999 },
436
  { 0xab70fe17, 0xc79ac6ca, 0x6dbd630a,  -996 },
437
  { 0xd64d3d9d, 0xb981787d, 0x092cbbcc,  -993 },
438
  { 0x85f04682, 0x93f0eb4e, 0x25bbf560,  -989 },
439
  { 0xa76c5823, 0x38ed2621, 0xaf2af2b8,  -986 },
440
  { 0xd1476e2c, 0x07286faa, 0x1af5af66,  -983 },
441
  { 0x82cca4db, 0x847945ca, 0x50d98d9f,  -979 },
442
  { 0xa37fce12, 0x6597973c, 0xe50ff107,  -976 },
443
  { 0xcc5fc196, 0xfefd7d0c, 0x1e53ed49,  -973 },
444
  { 0xff77b1fc, 0xbebcdc4f, 0x25e8e89c,  -970 },
445
  { 0x9faacf3d, 0xf73609b1, 0x77b19161,  -966 },
446
  { 0xc795830d, 0x75038c1d, 0xd59df5b9,  -963 },
447
  { 0xf97ae3d0, 0xd2446f25, 0x4b057328,  -960 },
448
  { 0x9becce62, 0x836ac577, 0x4ee367f9,  -956 },
449
  { 0xc2e801fb, 0x244576d5, 0x229c41f7,  -953 },
450
  { 0xf3a20279, 0xed56d48a, 0x6b435275,  -950 },
451
  { 0x9845418c, 0x345644d6, 0x830a1389,  -946 },
452
  { 0xbe5691ef, 0x416bd60c, 0x23cc986b,  -943 },
453
  { 0xedec366b, 0x11c6cb8f, 0x2cbfbe86,  -940 },
454
  { 0x94b3a202, 0xeb1c3f39, 0x7bf7d714,  -936 },
455
  { 0xb9e08a83, 0xa5e34f07, 0xdaf5ccd9,  -933 },
456
  { 0xe858ad24, 0x8f5c22c9, 0xd1b3400f,  -930 },
457
  { 0x91376c36, 0xd99995be, 0x23100809,  -926 },
458
  { 0xb5854744, 0x8ffffb2d, 0xabd40a0c,  -923 },
459
  { 0xe2e69915, 0xb3fff9f9, 0x16c90c8f,  -920 },
460
  { 0x8dd01fad, 0x907ffc3b, 0xae3da7d9,  -916 },
461
  { 0xb1442798, 0xf49ffb4a, 0x99cd11cf,  -913 },
462
  { 0xdd95317f, 0x31c7fa1d, 0x40405643,  -910 },
463
  { 0x8a7d3eef, 0x7f1cfc52, 0x482835ea,  -906 },
464
  { 0xad1c8eab, 0x5ee43b66, 0xda324365,  -903 },
465
  { 0xd863b256, 0x369d4a40, 0x90bed43e,  -900 },
466
  { 0x873e4f75, 0xe2224e68, 0x5a7744a6,  -896 },
467
  { 0xa90de353, 0x5aaae202, 0x711515d0,  -893 },
468
  { 0xd3515c28, 0x31559a83, 0x0d5a5b44,  -890 },
469
  { 0x8412d999, 0x1ed58091, 0xe858790a,  -886 },
470
  { 0xa5178fff, 0x668ae0b6, 0x626e974d,  -883 },
471
  { 0xce5d73ff, 0x402d98e3, 0xfb0a3d21,  -880 },
472
  { 0x80fa687f, 0x881c7f8e, 0x7ce66634,  -876 },
473
  { 0xa139029f, 0x6a239f72, 0x1c1fffc1,  -873 },
474
  { 0xc9874347, 0x44ac874e, 0xa327ffb2,  -870 },
475
  { 0xfbe91419, 0x15d7a922, 0x4bf1ff9f,  -867 },
476
  { 0x9d71ac8f, 0xada6c9b5, 0x6f773fc3,  -863 },
477
  { 0xc4ce17b3, 0x99107c22, 0xcb550fb4,  -860 },
478
  { 0xf6019da0, 0x7f549b2b, 0x7e2a53a1,  -857 },
479
  { 0x99c10284, 0x4f94e0fb, 0x2eda7444,  -853 },
480
  { 0xc0314325, 0x637a1939, 0xfa911155,  -850 },
481
  { 0xf03d93ee, 0xbc589f88, 0x793555ab,  -847 },
482
  { 0x96267c75, 0x35b763b5, 0x4bc1558b,  -843 },
483
  { 0xbbb01b92, 0x83253ca2, 0x9eb1aaed,  -840 },
484
  { 0xea9c2277, 0x23ee8bcb, 0x465e15a9,  -837 },
485
  { 0x92a1958a, 0x7675175f, 0x0bfacd89,  -833 },
486
  { 0xb749faed, 0x14125d36, 0xcef980ec,  -830 },
487
  { 0xe51c79a8, 0x5916f484, 0x82b7e127,  -827 },
488
  { 0x8f31cc09, 0x37ae58d2, 0xd1b2ecb8,  -823 },
489
  { 0xb2fe3f0b, 0x8599ef07, 0x861fa7e6,  -820 },
490
  { 0xdfbdcece, 0x67006ac9, 0x67a791e0,  -817 },
491
  { 0x8bd6a141, 0x006042bd, 0xe0c8bb2c,  -813 },
492
  { 0xaecc4991, 0x4078536d, 0x58fae9f7,  -810 },
493
  { 0xda7f5bf5, 0x90966848, 0xaf39a475,  -807 },
494
  { 0x888f9979, 0x7a5e012d, 0x6d8406c9,  -803 },
495
  { 0xaab37fd7, 0xd8f58178, 0xc8e5087b,  -800 },
496
  { 0xd5605fcd, 0xcf32e1d6, 0xfb1e4a9a,  -797 },
497
  { 0x855c3be0, 0xa17fcd26, 0x5cf2eea0,  -793 },
498
  { 0xa6b34ad8, 0xc9dfc06f, 0xf42faa48,  -790 },
499
  { 0xd0601d8e, 0xfc57b08b, 0xf13b94da,  -787 },
500
  { 0x823c1279, 0x5db6ce57, 0x76c53d08,  -783 },
501
  { 0xa2cb1717, 0xb52481ed, 0x54768c4b,  -780 },
502
  { 0xcb7ddcdd, 0xa26da268, 0xa9942f5d,  -777 },
503
  { 0xfe5d5415, 0x0b090b02, 0xd3f93b35,  -774 },
504
  { 0x9efa548d, 0x26e5a6e1, 0xc47bc501,  -770 },
505
  { 0xc6b8e9b0, 0x709f109a, 0x359ab641,  -767 },
506
  { 0xf867241c, 0x8cc6d4c0, 0xc30163d2,  -764 },
507
  { 0x9b407691, 0xd7fc44f8, 0x79e0de63,  -760 },
508
  { 0xc2109436, 0x4dfb5636, 0x985915fc,  -757 },
509
  { 0xf294b943, 0xe17a2bc4, 0x3e6f5b7b,  -754 },
510
  { 0x979cf3ca, 0x6cec5b5a, 0xa705992c,  -750 },
511
  { 0xbd8430bd, 0x08277231, 0x50c6ff78,  -747 },
512
  { 0xece53cec, 0x4a314ebd, 0xa4f8bf56,  -744 },
513
  { 0x940f4613, 0xae5ed136, 0x871b7795,  -740 },
514
  { 0xb9131798, 0x99f68584, 0x28e2557b,  -737 },
515
  { 0xe757dd7e, 0xc07426e5, 0x331aeada,  -734 },
516
  { 0x9096ea6f, 0x3848984f, 0x3ff0d2c8,  -730 },
517
  { 0xb4bca50b, 0x065abe63, 0x0fed077a,  -727 },
518
  { 0xe1ebce4d, 0xc7f16dfb, 0xd3e84959,  -724 },
519
  { 0x8d3360f0, 0x9cf6e4bd, 0x64712dd7,  -720 },
520
  { 0xb080392c, 0xc4349dec, 0xbd8d794d,  -717 },
521
  { 0xdca04777, 0xf541c567, 0xecf0d7a0,  -714 },
522
  { 0x89e42caa, 0xf9491b60, 0xf41686c4,  -710 },
523
  { 0xac5d37d5, 0xb79b6239, 0x311c2875,  -707 },
524
  { 0xd77485cb, 0x25823ac7, 0x7d633293,  -704 },
525
  { 0x86a8d39e, 0xf77164bc, 0xae5dff9c,  -700 },
526
  { 0xa8530886, 0xb54dbdeb, 0xd9f57f83,  -697 },
527
  { 0xd267caa8, 0x62a12d66, 0xd072df63,  -694 },
528
  { 0x8380dea9, 0x3da4bc60, 0x4247cb9e,  -690 },
529
  { 0xa4611653, 0x8d0deb78, 0x52d9be85,  -687 },
530
  { 0xcd795be8, 0x70516656, 0x67902e27,  -684 },
531
  { 0x806bd971, 0x4632dff6, 0x00ba1cd8,  -680 },
532
  { 0xa086cfcd, 0x97bf97f3, 0x80e8a40e,  -677 },
533
  { 0xc8a883c0, 0xfdaf7df0, 0x6122cd12,  -674 },
534
  { 0xfad2a4b1, 0x3d1b5d6c, 0x796b8057,  -671 },
535
  { 0x9cc3a6ee, 0xc6311a63, 0xcbe33036,  -667 },
536
  { 0xc3f490aa, 0x77bd60fc, 0xbedbfc44,  -664 },
537
  { 0xf4f1b4d5, 0x15acb93b, 0xee92fb55,  -661 },
538
  { 0x99171105, 0x2d8bf3c5, 0x751bdd15,  -657 },
539
  { 0xbf5cd546, 0x78eef0b6, 0xd262d45a,  -654 },
540
  { 0xef340a98, 0x172aace4, 0x86fb8971,  -651 },
541
  { 0x9580869f, 0x0e7aac0e, 0xd45d35e6,  -647 },
542
  { 0xbae0a846, 0xd2195712, 0x89748360,  -644 },
543
  { 0xe998d258, 0x869facd7, 0x2bd1a438,  -641 },
544
  { 0x91ff8377, 0x5423cc06, 0x7b6306a3,  -637 },
545
  { 0xb67f6455, 0x292cbf08, 0x1a3bc84c,  -634 },
546
  { 0xe41f3d6a, 0x7377eeca, 0x20caba5f,  -631 },
547
  { 0x8e938662, 0x882af53e, 0x547eb47b,  -627 },
548
  { 0xb23867fb, 0x2a35b28d, 0xe99e619a,  -624 },
549
  { 0xdec681f9, 0xf4c31f31, 0x6405fa00,  -621 },
550
  { 0x8b3c113c, 0x38f9f37e, 0xde83bc40,  -617 },
551
  { 0xae0b158b, 0x4738705e, 0x9624ab50,  -614 },
552
  { 0xd98ddaee, 0x19068c76, 0x3badd624,  -611 },
553
  { 0x87f8a8d4, 0xcfa417c9, 0xe54ca5d7,  -607 },
554
  { 0xa9f6d30a, 0x038d1dbc, 0x5e9fcf4c,  -604 },
555
  { 0xd47487cc, 0x8470652b, 0x7647c320,  -601 },
556
  { 0x84c8d4df, 0xd2c63f3b, 0x29ecd9f4,  -597 },
557
  { 0xa5fb0a17, 0xc777cf09, 0xf4681071,  -594 },
558
  { 0xcf79cc9d, 0xb955c2cc, 0x7182148d,  -591 },
559
  { 0x81ac1fe2, 0x93d599bf, 0xc6f14cd8,  -587 },
560
  { 0xa21727db, 0x38cb002f, 0xb8ada00e,  -584 },
561
  { 0xca9cf1d2, 0x06fdc03b, 0xa6d90811,  -581 },
562
  { 0xfd442e46, 0x88bd304a, 0x908f4a16,  -578 },
563
  { 0x9e4a9cec, 0x15763e2e, 0x9a598e4e,  -574 },
564
  { 0xc5dd4427, 0x1ad3cdba, 0x40eff1e1,  -571 },
565
  { 0xf7549530, 0xe188c128, 0xd12bee59,  -568 },
566
  { 0x9a94dd3e, 0x8cf578b9, 0x82bb74f8,  -564 },
567
  { 0xc13a148e, 0x3032d6e7, 0xe36a5236,  -561 },
568
  { 0xf18899b1, 0xbc3f8ca1, 0xdc44e6c3,  -558 },
569
  { 0x96f5600f, 0x15a7b7e5, 0x29ab103a,  -554 },
570
  { 0xbcb2b812, 0xdb11a5de, 0x7415d448,  -551 },
571
  { 0xebdf6617, 0x91d60f56, 0x111b495b,  -548 },
572
  { 0x936b9fce, 0xbb25c995, 0xcab10dd9,  -544 },
573
  { 0xb84687c2, 0x69ef3bfb, 0x3d5d514f,  -541 },
574
  { 0xe65829b3, 0x046b0afa, 0x0cb4a5a3,  -538 },
575
  { 0x8ff71a0f, 0xe2c2e6dc, 0x47f0e785,  -534 },
576
  { 0xb3f4e093, 0xdb73a093, 0x59ed2167,  -531 },
577
  { 0xe0f218b8, 0xd25088b8, 0x306869c1,  -528 },
578
  { 0x8c974f73, 0x83725573, 0x1e414218,  -524 },
579
  { 0xafbd2350, 0x644eeacf, 0xe5d1929e,  -521 },
580
  { 0xdbac6c24, 0x7d62a583, 0xdf45f746,  -518 },
581
  { 0x894bc396, 0xce5da772, 0x6b8bba8c,  -514 },
582
  { 0xab9eb47c, 0x81f5114f, 0x066ea92f,  -511 },
583
  { 0xd686619b, 0xa27255a2, 0xc80a537b,  -508 },
584
  { 0x8613fd01, 0x45877585, 0xbd06742c,  -504 },
585
  { 0xa798fc41, 0x96e952e7, 0x2c481138,  -501 },
586
  { 0xd17f3b51, 0xfca3a7a0, 0xf75a1586,  -498 },
587
  { 0x82ef8513, 0x3de648c4, 0x9a984d73,  -494 },
588
  { 0xa3ab6658, 0x0d5fdaf5, 0xc13e60d0,  -491 },
589
  { 0xcc963fee, 0x10b7d1b3, 0x318df905,  -488 },
590
  { 0xffbbcfe9, 0x94e5c61f, 0xfdf17746,  -485 },
591
  { 0x9fd561f1, 0xfd0f9bd3, 0xfeb6ea8b,  -481 },
592
  { 0xc7caba6e, 0x7c5382c8, 0xfe64a52e,  -478 },
593
  { 0xf9bd690a, 0x1b68637b, 0x3dfdce7a,  -475 },
594
  { 0x9c1661a6, 0x51213e2d, 0x06bea10c,  -471 },
595
  { 0xc31bfa0f, 0xe5698db8, 0x486e494f,  -468 },
596
  { 0xf3e2f893, 0xdec3f126, 0x5a89dba3,  -465 },
597
  { 0x986ddb5c, 0x6b3a76b7, 0xf8962946,  -461 },
598
  { 0xbe895233, 0x86091465, 0xf6bbb397,  -458 },
599
  { 0xee2ba6c0, 0x678b597f, 0x746aa07d,  -455 },
600
  { 0x94db4838, 0x40b717ef, 0xa8c2a44e,  -451 },
601
  { 0xba121a46, 0x50e4ddeb, 0x92f34d62,  -448 },
602
  { 0xe896a0d7, 0xe51e1566, 0x77b020ba,  -445 },
603
  { 0x915e2486, 0xef32cd60, 0x0ace1474,  -441 },
604
  { 0xb5b5ada8, 0xaaff80b8, 0x0d819992,  -438 },
605
  { 0xe3231912, 0xd5bf60e6, 0x10e1fff6,  -435 },
606
  { 0x8df5efab, 0xc5979c8f, 0xca8d3ffa,  -431 },
607
  { 0xb1736b96, 0xb6fd83b3, 0xbd308ff8,  -428 },
608
  { 0xddd0467c, 0x64bce4a0, 0xac7cb3f6,  -425 },
609
  { 0x8aa22c0d, 0xbef60ee4, 0x6bcdf07a,  -421 },
610
  { 0xad4ab711, 0x2eb3929d, 0x86c16c98,  -418 },
611
  { 0xd89d64d5, 0x7a607744, 0xe871c7bf,  -415 },
612
  { 0x87625f05, 0x6c7c4a8b, 0x11471cd7,  -411 },
613
  { 0xa93af6c6, 0xc79b5d2d, 0xd598e40d,  -408 },
614
  { 0xd389b478, 0x79823479, 0x4aff1d10,  -405 },
615
  { 0x843610cb, 0x4bf160cb, 0xcedf722a,  -401 },
616
  { 0xa54394fe, 0x1eedb8fe, 0xc2974eb4,  -398 },
617
  { 0xce947a3d, 0xa6a9273e, 0x733d2262,  -395 },
618
  { 0x811ccc66, 0x8829b887, 0x0806357d,  -391 },
619
  { 0xa163ff80, 0x2a3426a8, 0xca07c2dc,  -388 },
620
  { 0xc9bcff60, 0x34c13052, 0xfc89b393,  -385 },
621
  { 0xfc2c3f38, 0x41f17c67, 0xbbac2078,  -382 },
622
  { 0x9d9ba783, 0x2936edc0, 0xd54b944b,  -378 },
623
  { 0xc5029163, 0xf384a931, 0x0a9e795e,  -375 },
624
  { 0xf64335bc, 0xf065d37d, 0x4d4617b5,  -372 },
625
  { 0x99ea0196, 0x163fa42e, 0x504bced1,  -368 },
626
  { 0xc06481fb, 0x9bcf8d39, 0xe45ec286,  -365 },
627
  { 0xf07da27a, 0x82c37088, 0x5d767327,  -362 },
628
  { 0x964e858c, 0x91ba2655, 0x3a6a07f8,  -358 },
629
  { 0xbbe226ef, 0xb628afea, 0x890489f7,  -355 },
630
  { 0xeadab0ab, 0xa3b2dbe5, 0x2b45ac74,  -352 },
631
  { 0x92c8ae6b, 0x464fc96f, 0x3b0b8bc9,  -348 },
632
  { 0xb77ada06, 0x17e3bbcb, 0x09ce6ebb,  -345 },
633
  { 0xe5599087, 0x9ddcaabd, 0xcc420a6a,  -342 },
634
  { 0x8f57fa54, 0xc2a9eab6, 0x9fa94682,  -338 },
635
  { 0xb32df8e9, 0xf3546564, 0x47939822,  -335 },
636
  { 0xdff97724, 0x70297ebd, 0x59787e2b,  -332 },
637
  { 0x8bfbea76, 0xc619ef36, 0x57eb4edb,  -328 },
638
  { 0xaefae514, 0x77a06b03, 0xede62292,  -325 },
639
  { 0xdab99e59, 0x958885c4, 0xe95fab36,  -322 },
640
  { 0x88b402f7, 0xfd75539b, 0x11dbcb02,  -318 },
641
  { 0xaae103b5, 0xfcd2a881, 0xd652bdc2,  -315 },
642
  { 0xd59944a3, 0x7c0752a2, 0x4be76d33,  -312 },
643
  { 0x857fcae6, 0x2d8493a5, 0x6f70a440,  -308 },
644
  { 0xa6dfbd9f, 0xb8e5b88e, 0xcb4ccd50,  -305 },
645
  { 0xd097ad07, 0xa71f26b2, 0x7e2000a4,  -302 },
646
  { 0x825ecc24, 0xc873782f, 0x8ed40066,  -298 },
647
  { 0xa2f67f2d, 0xfa90563b, 0x72890080,  -295 },
648
  { 0xcbb41ef9, 0x79346bca, 0x4f2b40a0,  -292 },
649
  { 0xfea126b7, 0xd78186bc, 0xe2f610c8,  -289 },
650
  { 0x9f24b832, 0xe6b0f436, 0x0dd9ca7d,  -285 },
651
  { 0xc6ede63f, 0xa05d3143, 0x91503d1c,  -282 },
652
  { 0xf8a95fcf, 0x88747d94, 0x75a44c63,  -279 },
653
  { 0x9b69dbe1, 0xb548ce7c, 0xc986afbe,  -275 },
654
  { 0xc24452da, 0x229b021b, 0xfbe85bad,  -272 },
655
  { 0xf2d56790, 0xab41c2a2, 0xfae27299,  -269 },
656
  { 0x97c560ba, 0x6b0919a5, 0xdccd879f,  -265 },
657
  { 0xbdb6b8e9, 0x05cb600f, 0x5400e987,  -262 },
658
  { 0xed246723, 0x473e3813, 0x290123e9,  -259 },
659
  { 0x9436c076, 0x0c86e30b, 0xf9a0b672,  -255 },
660
  { 0xb9447093, 0x8fa89bce, 0xf808e40e,  -252 },
661
  { 0xe7958cb8, 0x7392c2c2, 0xb60b1d12,  -249 },
662
  { 0x90bd77f3, 0x483bb9b9, 0xb1c6f22b,  -245 },
663
  { 0xb4ecd5f0, 0x1a4aa828, 0x1e38aeb6,  -242 },
664
  { 0xe2280b6c, 0x20dd5232, 0x25c6da63,  -239 },
665
  { 0x8d590723, 0x948a535f, 0x579c487e,  -235 },
666
  { 0xb0af48ec, 0x79ace837, 0x2d835a9d,  -232 },
667
  { 0xdcdb1b27, 0x98182244, 0xf8e43145,  -229 },
668
  { 0x8a08f0f8, 0xbf0f156b, 0x1b8e9ecb,  -225 },
669
  { 0xac8b2d36, 0xeed2dac5, 0xe272467e,  -222 },
670
  { 0xd7adf884, 0xaa879177, 0x5b0ed81d,  -219 },
671
  { 0x86ccbb52, 0xea94baea, 0x98e94712,  -215 },
672
  { 0xa87fea27, 0xa539e9a5, 0x3f2398d7,  -212 },
673
  { 0xd29fe4b1, 0x8e88640e, 0x8eec7f0d,  -209 },
674
  { 0x83a3eeee, 0xf9153e89, 0x1953cf68,  -205 },
675
  { 0xa48ceaaa, 0xb75a8e2b, 0x5fa8c342,  -202 },
676
  { 0xcdb02555, 0x653131b6, 0x3792f412,  -199 },
677
  { 0x808e1755, 0x5f3ebf11, 0xe2bbd88b,  -195 },
678
  { 0xa0b19d2a, 0xb70e6ed6, 0x5b6aceae,  -192 },
679
  { 0xc8de0475, 0x64d20a8b, 0xf245825a,  -189 },
680
  { 0xfb158592, 0xbe068d2e, 0xeed6e2f0,  -186 },
681
  { 0x9ced737b, 0xb6c4183d, 0x55464dd6,  -182 },
682
  { 0xc428d05a, 0xa4751e4c, 0xaa97e14c,  -179 },
683
  { 0xf5330471, 0x4d9265df, 0xd53dd99f,  -176 },
684
  { 0x993fe2c6, 0xd07b7fab, 0xe546a803,  -172 },
685
  { 0xbf8fdb78, 0x849a5f96, 0xde985204,  -169 },
686
  { 0xef73d256, 0xa5c0f77c, 0x963e6685,  -166 },
687
  { 0x95a86376, 0x27989aad, 0xdde70013,  -162 },
688
  { 0xbb127c53, 0xb17ec159, 0x5560c018,  -159 },
689
  { 0xe9d71b68, 0x9dde71af, 0xaab8f01e,  -156 },
690
  { 0x92267121, 0x62ab070d, 0xcab39613,  -152 },
691
  { 0xb6b00d69, 0xbb55c8d1, 0x3d607b97,  -149 },
692
  { 0xe45c10c4, 0x2a2b3b05, 0x8cb89a7d,  -146 },
693
  { 0x8eb98a7a, 0x9a5b04e3, 0x77f3608e,  -142 },
694
  { 0xb267ed19, 0x40f1c61c, 0x55f038b2,  -139 },
695
  { 0xdf01e85f, 0x912e37a3, 0x6b6c46de,  -136 },
696
  { 0x8b61313b, 0xbabce2c6, 0x2323ac4b,  -132 },
697
  { 0xae397d8a, 0xa96c1b77, 0xabec975e,  -129 },
698
  { 0xd9c7dced, 0x53c72255, 0x96e7bd35,  -126 },
699
  { 0x881cea14, 0x545c7575, 0x7e50d641,  -122 },
700
  { 0xaa242499, 0x697392d2, 0xdde50bd1,  -119 },
701
  { 0xd4ad2dbf, 0xc3d07787, 0x955e4ec6,  -116 },
702
  { 0x84ec3c97, 0xda624ab4, 0xbd5af13b,  -112 },
703
  { 0xa6274bbd, 0xd0fadd61, 0xecb1ad8a,  -109 },
704
  { 0xcfb11ead, 0x453994ba, 0x67de18ed,  -106 },
705
  { 0x81ceb32c, 0x4b43fcf4, 0x80eacf94,  -102 },
706
  { 0xa2425ff7, 0x5e14fc31, 0xa1258379,   -99 },
707
  { 0xcad2f7f5, 0x359a3b3e, 0x096ee458,   -96 },
708
  { 0xfd87b5f2, 0x8300ca0d, 0x8bca9d6e,   -93 },
709
  { 0x9e74d1b7, 0x91e07e48, 0x775ea264,   -89 },
710
  { 0xc6120625, 0x76589dda, 0x95364afe,   -86 },
711
  { 0xf79687ae, 0xd3eec551, 0x3a83ddbd,   -83 },
712
  { 0x9abe14cd, 0x44753b52, 0xc4926a96,   -79 },
713
  { 0xc16d9a00, 0x95928a27, 0x75b7053c,   -76 },
714
  { 0xf1c90080, 0xbaf72cb1, 0x5324c68b,   -73 },
715
  { 0x971da050, 0x74da7bee, 0xd3f6fc16,   -69 },
716
  { 0xbce50864, 0x92111aea, 0x88f4bb1c,   -66 },
717
  { 0xec1e4a7d, 0xb69561a5, 0x2b31e9e3,   -63 },
718
  { 0x9392ee8e, 0x921d5d07, 0x3aff322e,   -59 },
719
  { 0xb877aa32, 0x36a4b449, 0x09befeb9,   -56 },
720
  { 0xe69594be, 0xc44de15b, 0x4c2ebe68,   -53 },
721
  { 0x901d7cf7, 0x3ab0acd9, 0x0f9d3701,   -49 },
722
  { 0xb424dc35, 0x095cd80f, 0x538484c1,   -46 },
723
  { 0xe12e1342, 0x4bb40e13, 0x2865a5f2,   -43 },
724
  { 0x8cbccc09, 0x6f5088cb, 0xf93f87b7,   -39 },
725
  { 0xafebff0b, 0xcb24aafe, 0xf78f69a5,   -36 },
726
  { 0xdbe6fece, 0xbdedd5be, 0xb573440e,   -33 },
727
  { 0x89705f41, 0x36b4a597, 0x31680a88,   -29 },
728
  { 0xabcc7711, 0x8461cefc, 0xfdc20d2b,   -26 },
729
  { 0xd6bf94d5, 0xe57a42bc, 0x3d329076,   -23 },
730
  { 0x8637bd05, 0xaf6c69b5, 0xa63f9a49,   -19 },
731
  { 0xa7c5ac47, 0x1b478423, 0x0fcf80dc,   -16 },
732
  { 0xd1b71758, 0xe219652b, 0xd3c36113,   -13 },
733
  { 0x83126e97, 0x8d4fdf3b, 0x645a1cac,    -9 },
734
  { 0xa3d70a3d, 0x70a3d70a, 0x3d70a3d7,    -6 },
735
  { 0xcccccccc, 0xcccccccc, 0xcccccccc,    -3 },
736
  { 0x80000000, 0x00000000, 0x00000000,    1 },
737
  { 0xa0000000, 0x00000000, 0x00000000,    4 },
738
  { 0xc8000000, 0x00000000, 0x00000000,    7 },
739
  { 0xfa000000, 0x00000000, 0x00000000,   10 },
740
  { 0x9c400000, 0x00000000, 0x00000000,   14 },
741
  { 0xc3500000, 0x00000000, 0x00000000,   17 },
742
  { 0xf4240000, 0x00000000, 0x00000000,   20 },
743
  { 0x98968000, 0x00000000, 0x00000000,   24 },
744
  { 0xbebc2000, 0x00000000, 0x00000000,   27 },
745
  { 0xee6b2800, 0x00000000, 0x00000000,   30 },
746
  { 0x9502f900, 0x00000000, 0x00000000,   34 },
747
  { 0xba43b740, 0x00000000, 0x00000000,   37 },
748
  { 0xe8d4a510, 0x00000000, 0x00000000,   40 },
749
  { 0x9184e72a, 0x00000000, 0x00000000,   44 },
750
  { 0xb5e620f4, 0x80000000, 0x00000000,   47 },
751
  { 0xe35fa931, 0xa0000000, 0x00000000,   50 },
752
  { 0x8e1bc9bf, 0x04000000, 0x00000000,   54 },
753
  { 0xb1a2bc2e, 0xc5000000, 0x00000000,   57 },
754
  { 0xde0b6b3a, 0x76400000, 0x00000000,   60 },
755
  { 0x8ac72304, 0x89e80000, 0x00000000,   64 },
756
  { 0xad78ebc5, 0xac620000, 0x00000000,   67 },
757
  { 0xd8d726b7, 0x177a8000, 0x00000000,   70 },
758
  { 0x87867832, 0x6eac9000, 0x00000000,   74 },
759
  { 0xa968163f, 0x0a57b400, 0x00000000,   77 },
760
  { 0xd3c21bce, 0xcceda100, 0x00000000,   80 },
761
  { 0x84595161, 0x401484a0, 0x00000000,   84 },
762
  { 0xa56fa5b9, 0x9019a5c8, 0x00000000,   87 },
763
  { 0xcecb8f27, 0xf4200f3a, 0x00000000,   90 },
764
  { 0x813f3978, 0xf8940984, 0x40000000,   94 },
765
  { 0xa18f07d7, 0x36b90be5, 0x50000000,   97 },
766
  { 0xc9f2c9cd, 0x04674ede, 0xa4000000,  100 },
767
  { 0xfc6f7c40, 0x45812296, 0x4d000000,  103 },
768
  { 0x9dc5ada8, 0x2b70b59d, 0xf0200000,  107 },
769
  { 0xc5371912, 0x364ce305, 0x6c280000,  110 },
770
  { 0xf684df56, 0xc3e01bc6, 0xc7320000,  113 },
771
  { 0x9a130b96, 0x3a6c115c, 0x3c7f4000,  117 },
772
  { 0xc097ce7b, 0xc90715b3, 0x4b9f1000,  120 },
773
  { 0xf0bdc21a, 0xbb48db20, 0x1e86d400,  123 },
774
  { 0x96769950, 0xb50d88f4, 0x13144480,  127 },
775
  { 0xbc143fa4, 0xe250eb31, 0x17d955a0,  130 },
776
  { 0xeb194f8e, 0x1ae525fd, 0x5dcfab08,  133 },
777
  { 0x92efd1b8, 0xd0cf37be, 0x5aa1cae5,  137 },
778
  { 0xb7abc627, 0x050305ad, 0xf14a3d9e,  140 },
779
  { 0xe596b7b0, 0xc643c719, 0x6d9ccd05,  143 },
780
  { 0x8f7e32ce, 0x7bea5c6f, 0xe4820023,  147 },
781
  { 0xb35dbf82, 0x1ae4f38b, 0xdda2802c,  150 },
782
  { 0xe0352f62, 0xa19e306e, 0xd50b2037,  153 },
783
  { 0x8c213d9d, 0xa502de45, 0x4526f422,  157 },
784
  { 0xaf298d05, 0x0e4395d6, 0x9670b12b,  160 },
785
  { 0xdaf3f046, 0x51d47b4c, 0x3c0cdd76,  163 },
786
  { 0x88d8762b, 0xf324cd0f, 0xa5880a69,  167 },
787
  { 0xab0e93b6, 0xefee0053, 0x8eea0d04,  170 },
788
  { 0xd5d238a4, 0xabe98068, 0x72a49045,  173 },
789
  { 0x85a36366, 0xeb71f041, 0x47a6da2b,  177 },
790
  { 0xa70c3c40, 0xa64e6c51, 0x999090b6,  180 },
791
  { 0xd0cf4b50, 0xcfe20765, 0xfff4b4e3,  183 },
792
  { 0x82818f12, 0x81ed449f, 0xbff8f10e,  187 },
793
  { 0xa321f2d7, 0x226895c7, 0xaff72d52,  190 },
794
  { 0xcbea6f8c, 0xeb02bb39, 0x9bf4f8a6,  193 },
795
  { 0xfee50b70, 0x25c36a08, 0x02f236d0,  196 },
796
  { 0x9f4f2726, 0x179a2245, 0x01d76242,  200 },
797
  { 0xc722f0ef, 0x9d80aad6, 0x424d3ad2,  203 },
798
  { 0xf8ebad2b, 0x84e0d58b, 0xd2e08987,  206 },
799
  { 0x9b934c3b, 0x330c8577, 0x63cc55f4,  210 },
800
  { 0xc2781f49, 0xffcfa6d5, 0x3cbf6b71,  213 },
801
  { 0xf316271c, 0x7fc3908a, 0x8bef464e,  216 },
802
  { 0x97edd871, 0xcfda3a56, 0x97758bf0,  220 },
803
  { 0xbde94e8e, 0x43d0c8ec, 0x3d52eeed,  223 },
804
  { 0xed63a231, 0xd4c4fb27, 0x4ca7aaa8,  226 },
805
  { 0x945e455f, 0x24fb1cf8, 0x8fe8caa9,  230 },
806
  { 0xb975d6b6, 0xee39e436, 0xb3e2fd53,  233 },
807
  { 0xe7d34c64, 0xa9c85d44, 0x60dbbca8,  236 },
808
  { 0x90e40fbe, 0xea1d3a4a, 0xbc8955e9,  240 },
809
  { 0xb51d13ae, 0xa4a488dd, 0x6babab63,  243 },
810
  { 0xe264589a, 0x4dcdab14, 0xc696963c,  246 },
811
  { 0x8d7eb760, 0x70a08aec, 0xfc1e1de5,  250 },
812
  { 0xb0de6538, 0x8cc8ada8, 0x3b25a55f,  253 },
813
  { 0xdd15fe86, 0xaffad912, 0x49ef0eb7,  256 },
814
  { 0x8a2dbf14, 0x2dfcc7ab, 0x6e356932,  260 },
815
  { 0xacb92ed9, 0x397bf996, 0x49c2c37f,  263 },
816
  { 0xd7e77a8f, 0x87daf7fb, 0xdc33745e,  266 },
817
  { 0x86f0ac99, 0xb4e8dafd, 0x69a028bb,  270 },
818
  { 0xa8acd7c0, 0x222311bc, 0xc40832ea,  273 },
819
  { 0xd2d80db0, 0x2aabd62b, 0xf50a3fa4,  276 },
820
  { 0x83c7088e, 0x1aab65db, 0x792667c6,  280 },
821
  { 0xa4b8cab1, 0xa1563f52, 0x577001b8,  283 },
822
  { 0xcde6fd5e, 0x09abcf26, 0xed4c0226,  286 },
823
  { 0x80b05e5a, 0xc60b6178, 0x544f8158,  290 },
824
  { 0xa0dc75f1, 0x778e39d6, 0x696361ae,  293 },
825
  { 0xc913936d, 0xd571c84c, 0x03bc3a19,  296 },
826
  { 0xfb587849, 0x4ace3a5f, 0x04ab48a0,  299 },
827
  { 0x9d174b2d, 0xcec0e47b, 0x62eb0d64,  303 },
828
  { 0xc45d1df9, 0x42711d9a, 0x3ba5d0bd,  306 },
829
  { 0xf5746577, 0x930d6500, 0xca8f44ec,  309 },
830
  { 0x9968bf6a, 0xbbe85f20, 0x7e998b13,  313 },
831
  { 0xbfc2ef45, 0x6ae276e8, 0x9e3fedd8,  316 },
832
  { 0xefb3ab16, 0xc59b14a2, 0xc5cfe94e,  319 },
833
  { 0x95d04aee, 0x3b80ece5, 0xbba1f1d1,  323 },
834
  { 0xbb445da9, 0xca61281f, 0x2a8a6e45,  326 },
835
  { 0xea157514, 0x3cf97226, 0xf52d09d7,  329 },
836
  { 0x924d692c, 0xa61be758, 0x593c2626,  333 },
837
  { 0xb6e0c377, 0xcfa2e12e, 0x6f8b2fb0,  336 },
838
  { 0xe498f455, 0xc38b997a, 0x0b6dfb9c,  339 },
839
  { 0x8edf98b5, 0x9a373fec, 0x4724bd41,  343 },
840
  { 0xb2977ee3, 0x00c50fe7, 0x58edec91,  346 },
841
  { 0xdf3d5e9b, 0xc0f653e1, 0x2f2967b6,  349 },
842
  { 0x8b865b21, 0x5899f46c, 0xbd79e0d2,  353 },
843
  { 0xae67f1e9, 0xaec07187, 0xecd85906,  356 },
844
  { 0xda01ee64, 0x1a708de9, 0xe80e6f48,  359 },
845
  { 0x884134fe, 0x908658b2, 0x3109058d,  363 },
846
  { 0xaa51823e, 0x34a7eede, 0xbd4b46f0,  366 },
847
  { 0xd4e5e2cd, 0xc1d1ea96, 0x6c9e18ac,  369 },
848
  { 0x850fadc0, 0x9923329e, 0x03e2cf6b,  373 },
849
  { 0xa6539930, 0xbf6bff45, 0x84db8346,  376 },
850
  { 0xcfe87f7c, 0xef46ff16, 0xe6126418,  379 },
851
  { 0x81f14fae, 0x158c5f6e, 0x4fcb7e8f,  383 },
852
  { 0xa26da399, 0x9aef7749, 0xe3be5e33,  386 },
853
  { 0xcb090c80, 0x01ab551c, 0x5cadf5bf,  389 },
854
  { 0xfdcb4fa0, 0x02162a63, 0x73d9732f,  392 },
855
  { 0x9e9f11c4, 0x014dda7e, 0x2867e7fd,  396 },
856
  { 0xc646d635, 0x01a1511d, 0xb281e1fd,  399 },
857
  { 0xf7d88bc2, 0x4209a565, 0x1f225a7c,  402 },
858
  { 0x9ae75759, 0x6946075f, 0x3375788d,  406 },
859
  { 0xc1a12d2f, 0xc3978937, 0x0052d6b1,  409 },
860
  { 0xf209787b, 0xb47d6b84, 0xc0678c5d,  412 },
861
  { 0x9745eb4d, 0x50ce6332, 0xf840b7ba,  416 },
862
  { 0xbd176620, 0xa501fbff, 0xb650e5a9,  419 },
863
  { 0xec5d3fa8, 0xce427aff, 0xa3e51f13,  422 },
864
  { 0x93ba47c9, 0x80e98cdf, 0xc66f336c,  426 },
865
  { 0xb8a8d9bb, 0xe123f017, 0xb80b0047,  429 },
866
  { 0xe6d3102a, 0xd96cec1d, 0xa60dc059,  432 },
867
  { 0x9043ea1a, 0xc7e41392, 0x87c89837,  436 },
868
  { 0xb454e4a1, 0x79dd1877, 0x29babe45,  439 },
869
  { 0xe16a1dc9, 0xd8545e94, 0xf4296dd6,  442 },
870
  { 0x8ce2529e, 0x2734bb1d, 0x1899e4a6,  446 },
871
  { 0xb01ae745, 0xb101e9e4, 0x5ec05dcf,  449 },
872
  { 0xdc21a117, 0x1d42645d, 0x76707543,  452 },
873
  { 0x899504ae, 0x72497eba, 0x6a06494a,  456 },
874
  { 0xabfa45da, 0x0edbde69, 0x0487db9d,  459 },
875
  { 0xd6f8d750, 0x9292d603, 0x45a9d284,  462 },
876
  { 0x865b8692, 0x5b9bc5c2, 0x0b8a2392,  466 },
877
  { 0xa7f26836, 0xf282b732, 0x8e6cac77,  469 },
878
  { 0xd1ef0244, 0xaf2364ff, 0x3207d795,  472 },
879
  { 0x8335616a, 0xed761f1f, 0x7f44e6bd,  476 },
880
  { 0xa402b9c5, 0xa8d3a6e7, 0x5f16206c,  479 },
881
  { 0xcd036837, 0x130890a1, 0x36dba887,  482 },
882
  { 0x80222122, 0x6be55a64, 0xc2494954,  486 },
883
  { 0xa02aa96b, 0x06deb0fd, 0xf2db9baa,  489 },
884
  { 0xc83553c5, 0xc8965d3d, 0x6f928294,  492 },
885
  { 0xfa42a8b7, 0x3abbf48c, 0xcb772339,  495 },
886
  { 0x9c69a972, 0x84b578d7, 0xff2a7604,  499 },
887
  { 0xc38413cf, 0x25e2d70d, 0xfef51385,  502 },
888
  { 0xf46518c2, 0xef5b8cd1, 0x7eb25866,  505 },
889
  { 0x98bf2f79, 0xd5993802, 0xef2f773f,  509 },
890
  { 0xbeeefb58, 0x4aff8603, 0xaafb550f,  512 },
891
  { 0xeeaaba2e, 0x5dbf6784, 0x95ba2a53,  515 },
892
  { 0x952ab45c, 0xfa97a0b2, 0xdd945a74,  519 },
893
  { 0xba756174, 0x393d88df, 0x94f97111,  522 },
894
  { 0xe912b9d1, 0x478ceb17, 0x7a37cd56,  525 },
895
  { 0x91abb422, 0xccb812ee, 0xac62e055,  529 },
896
  { 0xb616a12b, 0x7fe617aa, 0x577b986b,  532 },
897
  { 0xe39c4976, 0x5fdf9d94, 0xed5a7e85,  535 },
898
  { 0x8e41ade9, 0xfbebc27d, 0x14588f13,  539 },
899
  { 0xb1d21964, 0x7ae6b31c, 0x596eb2d8,  542 },
900
  { 0xde469fbd, 0x99a05fe3, 0x6fca5f8e,  545 },
901
  { 0x8aec23d6, 0x80043bee, 0x25de7bb9,  549 },
902
  { 0xada72ccc, 0x20054ae9, 0xaf561aa7,  552 },
903
  { 0xd910f7ff, 0x28069da4, 0x1b2ba151,  555 },
904
  { 0x87aa9aff, 0x79042286, 0x90fb44d2,  559 },
905
  { 0xa99541bf, 0x57452b28, 0x353a1607,  562 },
906
  { 0xd3fa922f, 0x2d1675f2, 0x42889b89,  565 },
907
  { 0x847c9b5d, 0x7c2e09b7, 0x69956135,  569 },
908
  { 0xa59bc234, 0xdb398c25, 0x43fab983,  572 },
909
  { 0xcf02b2c2, 0x1207ef2e, 0x94f967e4,  575 },
910
  { 0x8161afb9, 0x4b44f57d, 0x1d1be0ee,  579 },
911
  { 0xa1ba1ba7, 0x9e1632dc, 0x6462d92a,  582 },
912
  { 0xca28a291, 0x859bbf93, 0x7d7b8f75,  585 },
913
  { 0xfcb2cb35, 0xe702af78, 0x5cda7352,  588 },
914
  { 0x9defbf01, 0xb061adab, 0x3a088813,  592 },
915
  { 0xc56baec2, 0x1c7a1916, 0x088aaa18,  595 },
916
  { 0xf6c69a72, 0xa3989f5b, 0x8aad549e,  598 },
917
  { 0x9a3c2087, 0xa63f6399, 0x36ac54e2,  602 },
918
  { 0xc0cb28a9, 0x8fcf3c7f, 0x84576a1b,  605 },
919
  { 0xf0fdf2d3, 0xf3c30b9f, 0x656d44a2,  608 },
920
  { 0x969eb7c4, 0x7859e743, 0x9f644ae5,  612 },
921
  { 0xbc4665b5, 0x96706114, 0x873d5d9f,  615 },
922
  { 0xeb57ff22, 0xfc0c7959, 0xa90cb506,  618 },
923
  { 0x9316ff75, 0xdd87cbd8, 0x09a7f124,  622 },
924
  { 0xb7dcbf53, 0x54e9bece, 0x0c11ed6d,  625 },
925
  { 0xe5d3ef28, 0x2a242e81, 0x8f1668c8,  628 },
926
  { 0x8fa47579, 0x1a569d10, 0xf96e017d,  632 },
927
  { 0xb38d92d7, 0x60ec4455, 0x37c981dc,  635 },
928
  { 0xe070f78d, 0x3927556a, 0x85bbe253,  638 },
929
  { 0x8c469ab8, 0x43b89562, 0x93956d74,  642 },
930
  { 0xaf584166, 0x54a6babb, 0x387ac8d1,  645 },
931
  { 0xdb2e51bf, 0xe9d0696a, 0x06997b05,  648 },
932
  { 0x88fcf317, 0xf22241e2, 0x441fece3,  652 },
933
  { 0xab3c2fdd, 0xeeaad25a, 0xd527e81c,  655 },
934
  { 0xd60b3bd5, 0x6a5586f1, 0x8a71e223,  658 },
935
  { 0x85c70565, 0x62757456, 0xf6872d56,  662 },
936
  { 0xa738c6be, 0xbb12d16c, 0xb428f8ac,  665 },
937
  { 0xd106f86e, 0x69d785c7, 0xe13336d7,  668 },
938
  { 0x82a45b45, 0x0226b39c, 0xecc00246,  672 },
939
  { 0xa34d7216, 0x42b06084, 0x27f002d7,  675 },
940
  { 0xcc20ce9b, 0xd35c78a5, 0x31ec038d,  678 },
941
  { 0xff290242, 0xc83396ce, 0x7e670471,  681 },
942
  { 0x9f79a169, 0xbd203e41, 0x0f0062c6,  685 },
943
  { 0xc75809c4, 0x2c684dd1, 0x52c07b78,  688 },
944
  { 0xf92e0c35, 0x37826145, 0xa7709a56,  691 },
945
  { 0x9bbcc7a1, 0x42b17ccb, 0x88a66076,  695 },
946
  { 0xc2abf989, 0x935ddbfe, 0x6acff893,  698 },
947
  { 0xf356f7eb, 0xf83552fe, 0x0583f6b8,  701 },
948
  { 0x98165af3, 0x7b2153de, 0xc3727a33,  705 },
949
  { 0xbe1bf1b0, 0x59e9a8d6, 0x744f18c0,  708 },
950
  { 0xeda2ee1c, 0x7064130c, 0x1162def0,  711 },
951
  { 0x9485d4d1, 0xc63e8be7, 0x8addcb56,  715 },
952
  { 0xb9a74a06, 0x37ce2ee1, 0x6d953e2b,  718 },
953
  { 0xe8111c87, 0xc5c1ba99, 0xc8fa8db6,  721 },
954
  { 0x910ab1d4, 0xdb9914a0, 0x1d9c9892,  725 },
955
  { 0xb54d5e4a, 0x127f59c8, 0x2503beb6,  728 },
956
  { 0xe2a0b5dc, 0x971f303a, 0x2e44ae64,  731 },
957
  { 0x8da471a9, 0xde737e24, 0x5ceaecfe,  735 },
958
  { 0xb10d8e14, 0x56105dad, 0x7425a83e,  738 },
959
  { 0xdd50f199, 0x6b947518, 0xd12f124e,  741 },
960
  { 0x8a5296ff, 0xe33cc92f, 0x82bd6b70,  745 },
961
  { 0xace73cbf, 0xdc0bfb7b, 0x636cc64d,  748 },
962
  { 0xd8210bef, 0xd30efa5a, 0x3c47f7e0,  751 },
963
  { 0x8714a775, 0xe3e95c78, 0x65acfaec,  755 },
964
  { 0xa8d9d153, 0x5ce3b396, 0x7f1839a7,  758 },
965
  { 0xd31045a8, 0x341ca07c, 0x1ede4811,  761 },
966
  { 0x83ea2b89, 0x2091e44d, 0x934aed0a,  765 },
967
  { 0xa4e4b66b, 0x68b65d60, 0xf81da84d,  768 },
968
  { 0xce1de406, 0x42e3f4b9, 0x36251260,  771 },
969
  { 0x80d2ae83, 0xe9ce78f3, 0xc1d72b7c,  775 },
970
  { 0xa1075a24, 0xe4421730, 0xb24cf65b,  778 },
971
  { 0xc94930ae, 0x1d529cfc, 0xdee033f2,  781 },
972
  { 0xfb9b7cd9, 0xa4a7443c, 0x169840ef,  784 },
973
  { 0x9d412e08, 0x06e88aa5, 0x8e1f2895,  788 },
974
  { 0xc491798a, 0x08a2ad4e, 0xf1a6f2ba,  791 },
975
  { 0xf5b5d7ec, 0x8acb58a2, 0xae10af69,  794 },
976
  { 0x9991a6f3, 0xd6bf1765, 0xacca6da1,  798 },
977
  { 0xbff610b0, 0xcc6edd3f, 0x17fd090a,  801 },
978
  { 0xeff394dc, 0xff8a948e, 0xddfc4b4c,  804 },
979
  { 0x95f83d0a, 0x1fb69cd9, 0x4abdaf10,  808 },
980
  { 0xbb764c4c, 0xa7a4440f, 0x9d6d1ad4,  811 },
981
  { 0xea53df5f, 0xd18d5513, 0x84c86189,  814 },
982
  { 0x92746b9b, 0xe2f8552c, 0x32fd3cf5,  818 },
983
  { 0xb7118682, 0xdbb66a77, 0x3fbc8c33,  821 },
984
  { 0xe4d5e823, 0x92a40515, 0x0fabaf3f,  824 },
985
  { 0x8f05b116, 0x3ba6832d, 0x29cb4d87,  828 },
986
  { 0xb2c71d5b, 0xca9023f8, 0x743e20e9,  831 },
987
  { 0xdf78e4b2, 0xbd342cf6, 0x914da924,  834 },
988
  { 0x8bab8eef, 0xb6409c1a, 0x1ad089b6,  838 },
989
  { 0xae9672ab, 0xa3d0c320, 0xa184ac24,  841 },
990
  { 0xda3c0f56, 0x8cc4f3e8, 0xc9e5d72d,  844 },
991
  { 0x88658996, 0x17fb1871, 0x7e2fa67c,  848 },
992
  { 0xaa7eebfb, 0x9df9de8d, 0xddbb901b,  851 },
993
  { 0xd51ea6fa, 0x85785631, 0x552a7422,  854 },
994
  { 0x8533285c, 0x936b35de, 0xd53a8895,  858 },
995
  { 0xa67ff273, 0xb8460356, 0x8a892aba,  861 },
996
  { 0xd01fef10, 0xa657842c, 0x2d2b7569,  864 },
997
  { 0x8213f56a, 0x67f6b29b, 0x9c3b2962,  868 },
998
  { 0xa298f2c5, 0x01f45f42, 0x8349f3ba,  871 },
999
  { 0xcb3f2f76, 0x42717713, 0x241c70a9,  874 },
1000
  { 0xfe0efb53, 0xd30dd4d7, 0xed238cd3,  877 },
1001
  { 0x9ec95d14, 0x63e8a506, 0xf4363804,  881 },
1002
  { 0xc67bb459, 0x7ce2ce48, 0xb143c605,  884 },
1003
  { 0xf81aa16f, 0xdc1b81da, 0xdd94b786,  887 },
1004
  { 0x9b10a4e5, 0xe9913128, 0xca7cf2b4,  891 },
1005
  { 0xc1d4ce1f, 0x63f57d72, 0xfd1c2f61,  894 },
1006
  { 0xf24a01a7, 0x3cf2dccf, 0xbc633b39,  897 },
1007
  { 0x976e4108, 0x8617ca01, 0xd5be0503,  901 },
1008
  { 0xbd49d14a, 0xa79dbc82, 0x4b2d8644,  904 },
1009
  { 0xec9c459d, 0x51852ba2, 0xddf8e7d6,  907 },
1010
  { 0x93e1ab82, 0x52f33b45, 0xcabb90e5,  911 },
1011
  { 0xb8da1662, 0xe7b00a17, 0x3d6a751f,  914 },
1012
  { 0xe7109bfb, 0xa19c0c9d, 0x0cc51267,  917 },
1013
  { 0x906a617d, 0x450187e2, 0x27fb2b80,  921 },
1014
  { 0xb484f9dc, 0x9641e9da, 0xb1f9f660,  924 },
1015
  { 0xe1a63853, 0xbbd26451, 0x5e7873f8,  927 },
1016
  { 0x8d07e334, 0x55637eb2, 0xdb0b487b,  931 },
1017
  { 0xb049dc01, 0x6abc5e5f, 0x91ce1a9a,  934 },
1018
  { 0xdc5c5301, 0xc56b75f7, 0x7641a140,  937 },
1019
  { 0x89b9b3e1, 0x1b6329ba, 0xa9e904c8,  941 },
1020
  { 0xac2820d9, 0x623bf429, 0x546345fa,  944 },
1021
  { 0xd732290f, 0xbacaf133, 0xa97c1779,  947 },
1022
  { 0x867f59a9, 0xd4bed6c0, 0x49ed8eab,  951 },
1023
  { 0xa81f3014, 0x49ee8c70, 0x5c68f256,  954 },
1024
  { 0xd226fc19, 0x5c6a2f8c, 0x73832eec,  957 },
1025
  { 0x83585d8f, 0xd9c25db7, 0xc831fd53,  961 },
1026
  { 0xa42e74f3, 0xd032f525, 0xba3e7ca8,  964 },
1027
  { 0xcd3a1230, 0xc43fb26f, 0x28ce1bd2,  967 },
1028
  { 0x80444b5e, 0x7aa7cf85, 0x7980d163,  971 },
1029
  { 0xa0555e36, 0x1951c366, 0xd7e105bc,  974 },
1030
  { 0xc86ab5c3, 0x9fa63440, 0x8dd9472b,  977 },
1031
  { 0xfa856334, 0x878fc150, 0xb14f98f6,  980 },
1032
  { 0x9c935e00, 0xd4b9d8d2, 0x6ed1bf9a,  984 },
1033
  { 0xc3b83581, 0x09e84f07, 0x0a862f80,  987 },
1034
  { 0xf4a642e1, 0x4c6262c8, 0xcd27bb61,  990 },
1035
  { 0x98e7e9cc, 0xcfbd7dbd, 0x8038d51c,  994 },
1036
  { 0xbf21e440, 0x03acdd2c, 0xe0470a63,  997 },
1037
  { 0xeeea5d50, 0x04981478, 0x1858ccfc, 1000 },
1038
  { 0x95527a52, 0x02df0ccb, 0x0f37801e, 1004 },
1039
  { 0xbaa718e6, 0x8396cffd, 0xd3056025, 1007 },
1040
  { 0xe950df20, 0x247c83fd, 0x47c6b82e, 1010 },
1041
  { 0x91d28b74, 0x16cdd27e, 0x4cdc331d, 1014 },
1042
  { 0xb6472e51, 0x1c81471d, 0xe0133fe4, 1017 },
1043
  { 0xe3d8f9e5, 0x63a198e5, 0x58180fdd, 1020 },
1044
  { 0x8e679c2f, 0x5e44ff8f, 0x570f09ea, 1024 },
1045
  { 0xb201833b, 0x35d63f73, 0x2cd2cc65, 1027 },
1046
  { 0xde81e40a, 0x034bcf4f, 0xf8077f7e, 1030 },
1047
  { 0x8b112e86, 0x420f6191, 0xfb04afaf, 1034 },
1048
  { 0xadd57a27, 0xd29339f6, 0x79c5db9a, 1037 },
1049
  { 0xd94ad8b1, 0xc7380874, 0x18375281, 1040 },
1050
  { 0x87cec76f, 0x1c830548, 0x8f229391, 1044 },
1051
  { 0xa9c2794a, 0xe3a3c69a, 0xb2eb3875, 1047 },
1052
  { 0xd433179d, 0x9c8cb841, 0x5fa60692, 1050 },
1053
  { 0x849feec2, 0x81d7f328, 0xdbc7c41b, 1054 },
1054
  { 0xa5c7ea73, 0x224deff3, 0x12b9b522, 1057 },
1055
  { 0xcf39e50f, 0xeae16bef, 0xd768226b, 1060 },
1056
  { 0x81842f29, 0xf2cce375, 0xe6a11583, 1064 },
1057
  { 0xa1e53af4, 0x6f801c53, 0x60495ae3, 1067 },
1058
  { 0xca5e89b1, 0x8b602368, 0x385bb19c, 1070 },
1059
  { 0xfcf62c1d, 0xee382c42, 0x46729e03, 1073 },
1060
  { 0x9e19db92, 0xb4e31ba9, 0x6c07a2c2, 1077 }
1061
  };
1062
 static const short int Lhint[2098] = {
1063
     /*18,*/19,    19,    19,    19,    20,    20,    20,    21,    21,
1064
     21,    22,    22,    22,    23,    23,    23,    23,    24,    24,
1065
     24,    25,    25,    25,    26,    26,    26,    26,    27,    27,
1066
     27,    28,    28,    28,    29,    29,    29,    29,    30,    30,
1067
     30,    31,    31,    31,    32,    32,    32,    32,    33,    33,
1068
     33,    34,    34,    34,    35,    35,    35,    35,    36,    36,
1069
     36,    37,    37,    37,    38,    38,    38,    38,    39,    39,
1070
     39,    40,    40,    40,    41,    41,    41,    41,    42,    42,
1071
     42,    43,    43,    43,    44,    44,    44,    44,    45,    45,
1072
     45,    46,    46,    46,    47,    47,    47,    47,    48,    48,
1073
     48,    49,    49,    49,    50,    50,    50,    51,    51,    51,
1074
     51,    52,    52,    52,    53,    53,    53,    54,    54,    54,
1075
     54,    55,    55,    55,    56,    56,    56,    57,    57,    57,
1076
     57,    58,    58,    58,    59,    59,    59,    60,    60,    60,
1077
     60,    61,    61,    61,    62,    62,    62,    63,    63,    63,
1078
     63,    64,    64,    64,    65,    65,    65,    66,    66,    66,
1079
     66,    67,    67,    67,    68,    68,    68,    69,    69,    69,
1080
     69,    70,    70,    70,    71,    71,    71,    72,    72,    72,
1081
     72,    73,    73,    73,    74,    74,    74,    75,    75,    75,
1082
     75,    76,    76,    76,    77,    77,    77,    78,    78,    78,
1083
     78,    79,    79,    79,    80,    80,    80,    81,    81,    81,
1084
     82,    82,    82,    82,    83,    83,    83,    84,    84,    84,
1085
     85,    85,    85,    85,    86,    86,    86,    87,    87,    87,
1086
     88,    88,    88,    88,    89,    89,    89,    90,    90,    90,
1087
     91,    91,    91,    91,    92,    92,    92,    93,    93,    93,
1088
     94,    94,    94,    94,    95,    95,    95,    96,    96,    96,
1089
     97,    97,    97,    97,    98,    98,    98,    99,    99,    99,
1090
    100,   100,   100,   100,   101,   101,   101,   102,   102,   102,
1091
    103,   103,   103,   103,   104,   104,   104,   105,   105,   105,
1092
    106,   106,   106,   106,   107,   107,   107,   108,   108,   108,
1093
    109,   109,   109,   110,   110,   110,   110,   111,   111,   111,
1094
    112,   112,   112,   113,   113,   113,   113,   114,   114,   114,
1095
    115,   115,   115,   116,   116,   116,   116,   117,   117,   117,
1096
    118,   118,   118,   119,   119,   119,   119,   120,   120,   120,
1097
    121,   121,   121,   122,   122,   122,   122,   123,   123,   123,
1098
    124,   124,   124,   125,   125,   125,   125,   126,   126,   126,
1099
    127,   127,   127,   128,   128,   128,   128,   129,   129,   129,
1100
    130,   130,   130,   131,   131,   131,   131,   132,   132,   132,
1101
    133,   133,   133,   134,   134,   134,   134,   135,   135,   135,
1102
    136,   136,   136,   137,   137,   137,   137,   138,   138,   138,
1103
    139,   139,   139,   140,   140,   140,   141,   141,   141,   141,
1104
    142,   142,   142,   143,   143,   143,   144,   144,   144,   144,
1105
    145,   145,   145,   146,   146,   146,   147,   147,   147,   147,
1106
    148,   148,   148,   149,   149,   149,   150,   150,   150,   150,
1107
    151,   151,   151,   152,   152,   152,   153,   153,   153,   153,
1108
    154,   154,   154,   155,   155,   155,   156,   156,   156,   156,
1109
    157,   157,   157,   158,   158,   158,   159,   159,   159,   159,
1110
    160,   160,   160,   161,   161,   161,   162,   162,   162,   162,
1111
    163,   163,   163,   164,   164,   164,   165,   165,   165,   165,
1112
    166,   166,   166,   167,   167,   167,   168,   168,   168,   169,
1113
    169,   169,   169,   170,   170,   170,   171,   171,   171,   172,
1114
    172,   172,   172,   173,   173,   173,   174,   174,   174,   175,
1115
    175,   175,   175,   176,   176,   176,   177,   177,   177,   178,
1116
    178,   178,   178,   179,   179,   179,   180,   180,   180,   181,
1117
    181,   181,   181,   182,   182,   182,   183,   183,   183,   184,
1118
    184,   184,   184,   185,   185,   185,   186,   186,   186,   187,
1119
    187,   187,   187,   188,   188,   188,   189,   189,   189,   190,
1120
    190,   190,   190,   191,   191,   191,   192,   192,   192,   193,
1121
    193,   193,   193,   194,   194,   194,   195,   195,   195,   196,
1122
    196,   196,   197,   197,   197,   197,   198,   198,   198,   199,
1123
    199,   199,   200,   200,   200,   200,   201,   201,   201,   202,
1124
    202,   202,   203,   203,   203,   203,   204,   204,   204,   205,
1125
    205,   205,   206,   206,   206,   206,   207,   207,   207,   208,
1126
    208,   208,   209,   209,   209,   209,   210,   210,   210,   211,
1127
    211,   211,   212,   212,   212,   212,   213,   213,   213,   214,
1128
    214,   214,   215,   215,   215,   215,   216,   216,   216,   217,
1129
    217,   217,   218,   218,   218,   218,   219,   219,   219,   220,
1130
    220,   220,   221,   221,   221,   221,   222,   222,   222,   223,
1131
    223,   223,   224,   224,   224,   224,   225,   225,   225,   226,
1132
    226,   226,   227,   227,   227,   228,   228,   228,   228,   229,
1133
    229,   229,   230,   230,   230,   231,   231,   231,   231,   232,
1134
    232,   232,   233,   233,   233,   234,   234,   234,   234,   235,
1135
    235,   235,   236,   236,   236,   237,   237,   237,   237,   238,
1136
    238,   238,   239,   239,   239,   240,   240,   240,   240,   241,
1137
    241,   241,   242,   242,   242,   243,   243,   243,   243,   244,
1138
    244,   244,   245,   245,   245,   246,   246,   246,   246,   247,
1139
    247,   247,   248,   248,   248,   249,   249,   249,   249,   250,
1140
    250,   250,   251,   251,   251,   252,   252,   252,   252,   253,
1141
    253,   253,   254,   254,   254,   255,   255,   255,   256,   256,
1142
    256,   256,   257,   257,   257,   258,   258,   258,   259,   259,
1143
    259,   259,   260,   260,   260,   261,   261,   261,   262,   262,
1144
    262,   262,   263,   263,   263,   264,   264,   264,   265,   265,
1145
    265,   265,   266,   266,   266,   267,   267,   267,   268,   268,
1146
    268,   268,   269,   269,   269,   270,   270,   270,   271,   271,
1147
    271,   271,   272,   272,   272,   273,   273,   273,   274,   274,
1148
    274,   274,   275,   275,   275,   276,   276,   276,   277,   277,
1149
    277,   277,   278,   278,   278,   279,   279,   279,   280,   280,
1150
    280,   280,   281,   281,   281,   282,   282,   282,   283,   283,
1151
    283,   283,   284,   284,   284,   285,   285,   285,   286,   286,
1152
    286,   287,   287,   287,   287,   288,   288,   288,   289,   289,
1153
    289,   290,   290,   290,   290,   291,   291,   291,   292,   292,
1154
    292,   293,   293,   293,   293,   294,   294,   294,   295,   295,
1155
    295,   296,   296,   296,   296,   297,   297,   297,   298,   298,
1156
    298,   299,   299,   299,   299,   300,   300,   300,   301,   301,
1157
    301,   302,   302,   302,   302,   303,   303,   303,   304,   304,
1158
    304,   305,   305,   305,   305,   306,   306,   306,   307,   307,
1159
    307,   308,   308,   308,   308,   309,   309,   309,   310,   310,
1160
    310,   311,   311,   311,   311,   312,   312,   312,   313,   313,
1161
    313,   314,   314,   314,   315,   315,   315,   315,   316,   316,
1162
    316,   317,   317,   317,   318,   318,   318,   318,   319,   319,
1163
    319,   320,   320,   320,   321,   321,   321,   321,   322,   322,
1164
    322,   323,   323,   323,   324,   324,   324,   324,   325,   325,
1165
    325,   326,   326,   326,   327,   327,   327,   327,   328,   328,
1166
    328,   329,   329,   329,   330,   330,   330,   330,   331,   331,
1167
    331,   332,   332,   332,   333,   333,   333,   333,   334,   334,
1168
    334,   335,   335,   335,   336,   336,   336,   336,   337,   337,
1169
    337,   338,   338,   338,   339,   339,   339,   339,   340,   340,
1170
    340,   341,   341,   341,   342,   342,   342,   342,   343,   343,
1171
    343,   344,   344,   344,   345,   345,   345,   346,   346,   346,
1172
    346,   347,   347,   347,   348,   348,   348,   349,   349,   349,
1173
    349,   350,   350,   350,   351,   351,   351,   352,   352,   352,
1174
    352,   353,   353,   353,   354,   354,   354,   355,   355,   355,
1175
    355,   356,   356,   356,   357,   357,   357,   358,   358,   358,
1176
    358,   359,   359,   359,   360,   360,   360,   361,   361,   361,
1177
    361,   362,   362,   362,   363,   363,   363,   364,   364,   364,
1178
    364,   365,   365,   365,   366,   366,   366,   367,   367,   367,
1179
    367,   368,   368,   368,   369,   369,   369,   370,   370,   370,
1180
    370,   371,   371,   371,   372,   372,   372,   373,   373,   373,
1181
    374,   374,   374,   374,   375,   375,   375,   376,   376,   376,
1182
    377,   377,   377,   377,   378,   378,   378,   379,   379,   379,
1183
    380,   380,   380,   380,   381,   381,   381,   382,   382,   382,
1184
    383,   383,   383,   383,   384,   384,   384,   385,   385,   385,
1185
    386,   386,   386,   386,   387,   387,   387,   388,   388,   388,
1186
    389,   389,   389,   389,   390,   390,   390,   391,   391,   391,
1187
    392,   392,   392,   392,   393,   393,   393,   394,   394,   394,
1188
    395,   395,   395,   395,   396,   396,   396,   397,   397,   397,
1189
    398,   398,   398,   398,   399,   399,   399,   400,   400,   400,
1190
    401,   401,   401,   402,   402,   402,   402,   403,   403,   403,
1191
    404,   404,   404,   405,   405,   405,   405,   406,   406,   406,
1192
    407,   407,   407,   408,   408,   408,   408,   409,   409,   409,
1193
    410,   410,   410,   411,   411,   411,   411,   412,   412,   412,
1194
    413,   413,   413,   414,   414,   414,   414,   415,   415,   415,
1195
    416,   416,   416,   417,   417,   417,   417,   418,   418,   418,
1196
    419,   419,   419,   420,   420,   420,   420,   421,   421,   421,
1197
    422,   422,   422,   423,   423,   423,   423,   424,   424,   424,
1198
    425,   425,   425,   426,   426,   426,   426,   427,   427,   427,
1199
    428,   428,   428,   429,   429,   429,   429,   430,   430,   430,
1200
    431,   431,   431,   432,   432,   432,   433,   433,   433,   433,
1201
    434,   434,   434,   435,   435,   435,   436,   436,   436,   436,
1202
    437,   437,   437,   438,   438,   438,   439,   439,   439,   439,
1203
    440,   440,   440,   441,   441,   441,   442,   442,   442,   442,
1204
    443,   443,   443,   444,   444,   444,   445,   445,   445,   445,
1205
    446,   446,   446,   447,   447,   447,   448,   448,   448,   448,
1206
    449,   449,   449,   450,   450,   450,   451,   451,   451,   451,
1207
    452,   452,   452,   453,   453,   453,   454,   454,   454,   454,
1208
    455,   455,   455,   456,   456,   456,   457,   457,   457,   457,
1209
    458,   458,   458,   459,   459,   459,   460,   460,   460,   461,
1210
    461,   461,   461,   462,   462,   462,   463,   463,   463,   464,
1211
    464,   464,   464,   465,   465,   465,   466,   466,   466,   467,
1212
    467,   467,   467,   468,   468,   468,   469,   469,   469,   470,
1213
    470,   470,   470,   471,   471,   471,   472,   472,   472,   473,
1214
    473,   473,   473,   474,   474,   474,   475,   475,   475,   476,
1215
    476,   476,   476,   477,   477,   477,   478,   478,   478,   479,
1216
    479,   479,   479,   480,   480,   480,   481,   481,   481,   482,
1217
    482,   482,   482,   483,   483,   483,   484,   484,   484,   485,
1218
    485,   485,   485,   486,   486,   486,   487,   487,   487,   488,
1219
    488,   488,   488,   489,   489,   489,   490,   490,   490,   491,
1220
    491,   491,   492,   492,   492,   492,   493,   493,   493,   494,
1221
    494,   494,   495,   495,   495,   495,   496,   496,   496,   497,
1222
    497,   497,   498,   498,   498,   498,   499,   499,   499,   500,
1223
    500,   500,   501,   501,   501,   501,   502,   502,   502,   503,
1224
    503,   503,   504,   504,   504,   504,   505,   505,   505,   506,
1225
    506,   506,   507,   507,   507,   507,   508,   508,   508,   509,
1226
    509,   509,   510,   510,   510,   510,   511,   511,   511,   512,
1227
    512,   512,   513,   513,   513,   513,   514,   514,   514,   515,
1228
    515,   515,   516,   516,   516,   516,   517,   517,   517,   518,
1229
    518,   518,   519,   519,   519,   520,   520,   520,   520,   521,
1230
    521,   521,   522,   522,   522,   523,   523,   523,   523,   524,
1231
    524,   524,   525,   525,   525,   526,   526,   526,   526,   527,
1232
    527,   527,   528,   528,   528,   529,   529,   529,   529,   530,
1233
    530,   530,   531,   531,   531,   532,   532,   532,   532,   533,
1234
    533,   533,   534,   534,   534,   535,   535,   535,   535,   536,
1235
    536,   536,   537,   537,   537,   538,   538,   538,   538,   539,
1236
    539,   539,   540,   540,   540,   541,   541,   541,   541,   542,
1237
    542,   542,   543,   543,   543,   544,   544,   544,   544,   545,
1238
    545,   545,   546,   546,   546,   547,   547,   547,   548,   548,
1239
    548,   548,   549,   549,   549,   550,   550,   550,   551,   551,
1240
    551,   551,   552,   552,   552,   553,   553,   553,   554,   554,
1241
    554,   554,   555,   555,   555,   556,   556,   556,   557,   557,
1242
    557,   557,   558,   558,   558,   559,   559,   559,   560,   560,
1243
    560,   560,   561,   561,   561,   562,   562,   562,   563,   563,
1244
    563,   563,   564,   564,   564,   565,   565,   565,   566,   566,
1245
    566,   566,   567,   567,   567,   568,   568,   568,   569,   569,
1246
    569,   569,   570,   570,   570,   571,   571,   571,   572,   572,
1247
    572,   572,   573,   573,   573,   574,   574,   574,   575,   575,
1248
    575,   575,   576,   576,   576,   577,   577,   577,   578,   578,
1249
    578,   579,   579,   579,   579,   580,   580,   580,   581,   581,
1250
    581,   582,   582,   582,   582,   583,   583,   583,   584,   584,
1251
    584,   585,   585,   585,   585,   586,   586,   586,   587,   587,
1252
    587,   588,   588,   588,   588,   589,   589,   589,   590,   590,
1253
    590,   591,   591,   591,   591,   592,   592,   592,   593,   593,
1254
    593,   594,   594,   594,   594,   595,   595,   595,   596,   596,
1255
    596,   597,   597,   597,   597,   598,   598,   598,   599,   599,
1256
    599,   600,   600,   600,   600,   601,   601,   601,   602,   602,
1257
    602,   603,   603,   603,   603,   604,   604,   604,   605,   605,
1258
    605,   606,   606,   606,   607,   607,   607,   607,   608,   608,
1259
    608,   609,   609,   609,   610,   610,   610,   610,   611,   611,
1260
    611,   612,   612,   612,   613,   613,   613,   613,   614,   614,
1261
    614,   615,   615,   615,   616,   616,   616,   616,   617,   617,
1262
    617,   618,   618,   618,   619,   619,   619,   619,   620,   620,
1263
    620,   621,   621,   621,   622,   622,   622,   622,   623,   623,
1264
    623,   624,   624,   624,   625,   625,   625,   625,   626,   626,
1265
    626,   627,   627,   627,   628,   628,   628,   628,   629,   629,
1266
    629,   630,   630,   630,   631,   631,   631,   631,   632,   632,
1267
    632,   633,   633,   633,   634,   634,   634,   634,   635,   635,
1268
    635,   636,   636,   636,   637,   637,   637,   638,   638,   638,
1269
    638,   639,   639,   639,   640,   640,   640,   641,   641,   641,
1270
    641,   642,   642,   642,   643,   643,   643,   644,   644,   644,
1271
    644,   645,   645,   645,   646,   646,   646,   647,   647,   647,
1272
    647,   648,   648,   648,   649,   649,   649,   650,   650 };
1273
 static const ULLong pfive[27] = {
1274
    5ll,
1275
    25ll,
1276
    125ll,
1277
    625ll,
1278
    3125ll,
1279
    15625ll,
1280
    78125ll,
1281
    390625ll,
1282
    1953125ll,
1283
    9765625ll,
1284
    48828125ll,
1285
    244140625ll,
1286
    1220703125ll,
1287
    6103515625ll,
1288
    30517578125ll,
1289
    152587890625ll,
1290
    762939453125ll,
1291
    3814697265625ll,
1292
    19073486328125ll,
1293
    95367431640625ll,
1294
    476837158203125ll,
1295
    2384185791015625ll,
1296
    11920928955078125ll,
1297
    59604644775390625ll,
1298
    298023223876953125ll,
1299
    1490116119384765625ll,
1300
    7450580596923828125ll
1301
    };
1302
1303
 static const int pfivebits[25] = {3, 5, 7, 10, 12, 14, 17, 19, 21, 24, 26, 28, 31,
1304
           33, 35, 38, 40, 42, 45, 47, 49, 52, 54, 56, 59};
1305
#endif /*}*/
1306
#endif /*}} NO_LONG_LONG */
1307
1308
typedef union { double d; ULong L[2];
1309
#ifdef USE_BF96
1310
  ULLong LL;
1311
#endif
1312
  } U;
1313
1314
#ifdef IEEE_8087
1315
0
#define word0(x) (x)->L[1]
1316
0
#define word1(x) (x)->L[0]
1317
#else
1318
#define word0(x) (x)->L[0]
1319
#define word1(x) (x)->L[1]
1320
#endif
1321
0
#define dval(x) (x)->d
1322
#define LLval(x) (x)->LL
1323
1324
#ifndef STRTOD_DIGLIM
1325
#define STRTOD_DIGLIM 40
1326
#endif
1327
1328
#ifdef DIGLIM_DEBUG
1329
extern int strtod_diglim;
1330
#else
1331
#define strtod_diglim STRTOD_DIGLIM
1332
#endif
1333
1334
/* The following definition of Storeinc is appropriate for MIPS processors.
1335
 * An alternative that might be better on some machines is
1336
 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
1337
 */
1338
#if defined(IEEE_8087) + defined(VAX)
1339
#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
1340
((unsigned short *)a)[0] = (unsigned short)c, a++)
1341
#else
1342
#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
1343
((unsigned short *)a)[1] = (unsigned short)c, a++)
1344
#endif
1345
1346
/* #define P DBL_MANT_DIG */
1347
/* Ten_pmax = floor(P*log(2)/log(5)) */
1348
/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
1349
/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
1350
/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
1351
1352
#ifdef IEEE_Arith
1353
0
#define Exp_shift  20
1354
0
#define Exp_shift1 20
1355
0
#define Exp_msk1    0x100000
1356
#define Exp_msk11   0x100000
1357
0
#define Exp_mask  0x7ff00000
1358
0
#define P 53
1359
#define Nbits 53
1360
0
#define Bias 1023
1361
#define Emax 1023
1362
#define Emin (-1022)
1363
#define Exp_1  0x3ff00000
1364
#define Exp_11 0x3ff00000
1365
#define Ebits 11
1366
0
#define Frac_mask  0xfffff
1367
#define Frac_mask1 0xfffff
1368
#define Ten_pmax 22
1369
#define Bletch 0x10
1370
0
#define Bndry_mask  0xfffff
1371
#define Bndry_mask1 0xfffff
1372
#define LSB 1
1373
0
#define Sign_bit 0x80000000
1374
0
#define Log2P 1
1375
#define Tiny0 0
1376
#define Tiny1 1
1377
#define Quick_max 14
1378
#define Int_max 14
1379
#ifndef NO_IEEE_Scale
1380
#define Avoid_Underflow
1381
#ifdef Flush_Denorm /* debugging option */
1382
#undef Sudden_Underflow
1383
#endif
1384
#endif
1385
1386
#ifndef Flt_Rounds
1387
#ifdef FLT_ROUNDS
1388
0
#define Flt_Rounds FLT_ROUNDS
1389
#else
1390
#define Flt_Rounds 1
1391
#endif
1392
#endif /*Flt_Rounds*/
1393
1394
#ifdef Honor_FLT_ROUNDS
1395
#undef Check_FLT_ROUNDS
1396
#define Check_FLT_ROUNDS
1397
#else
1398
0
#define Rounding Flt_Rounds
1399
#endif
1400
1401
#else /* ifndef IEEE_Arith */
1402
#undef Check_FLT_ROUNDS
1403
#undef Honor_FLT_ROUNDS
1404
#undef SET_INEXACT
1405
#undef  Sudden_Underflow
1406
#define Sudden_Underflow
1407
#ifdef IBM
1408
#undef Flt_Rounds
1409
#define Flt_Rounds 0
1410
#define Exp_shift  24
1411
#define Exp_shift1 24
1412
#define Exp_msk1   0x1000000
1413
#define Exp_msk11  0x1000000
1414
#define Exp_mask  0x7f000000
1415
#define P 14
1416
#define Nbits 56
1417
#define Bias 65
1418
#define Emax 248
1419
#define Emin (-260)
1420
#define Exp_1  0x41000000
1421
#define Exp_11 0x41000000
1422
#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
1423
#define Frac_mask  0xffffff
1424
#define Frac_mask1 0xffffff
1425
#define Bletch 4
1426
#define Ten_pmax 22
1427
#define Bndry_mask  0xefffff
1428
#define Bndry_mask1 0xffffff
1429
#define LSB 1
1430
#define Sign_bit 0x80000000
1431
#define Log2P 4
1432
#define Tiny0 0x100000
1433
#define Tiny1 0
1434
#define Quick_max 14
1435
#define Int_max 15
1436
#else /* VAX */
1437
#undef Flt_Rounds
1438
#define Flt_Rounds 1
1439
#define Exp_shift  23
1440
#define Exp_shift1 7
1441
#define Exp_msk1    0x80
1442
#define Exp_msk11   0x800000
1443
#define Exp_mask  0x7f80
1444
#define P 56
1445
#define Nbits 56
1446
#define Bias 129
1447
#define Emax 126
1448
#define Emin (-129)
1449
#define Exp_1  0x40800000
1450
#define Exp_11 0x4080
1451
#define Ebits 8
1452
#define Frac_mask  0x7fffff
1453
#define Frac_mask1 0xffff007f
1454
#define Ten_pmax 24
1455
#define Bletch 2
1456
#define Bndry_mask  0xffff007f
1457
#define Bndry_mask1 0xffff007f
1458
#define LSB 0x10000
1459
#define Sign_bit 0x8000
1460
#define Log2P 1
1461
#define Tiny0 0x80
1462
#define Tiny1 0
1463
#define Quick_max 15
1464
#define Int_max 15
1465
#endif /* IBM, VAX */
1466
#endif /* IEEE_Arith */
1467
1468
#ifndef IEEE_Arith
1469
#define ROUND_BIASED
1470
#else
1471
#ifdef ROUND_BIASED_without_Round_Up
1472
#undef  ROUND_BIASED
1473
#define ROUND_BIASED
1474
#endif
1475
#endif
1476
1477
#ifdef RND_PRODQUOT
1478
#define rounded_product(a,b) a = rnd_prod(a, b)
1479
#define rounded_quotient(a,b) a = rnd_quot(a, b)
1480
extern double rnd_prod(double, double), rnd_quot(double, double);
1481
#else
1482
#define rounded_product(a,b) a *= b
1483
#define rounded_quotient(a,b) a /= b
1484
#endif
1485
1486
#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
1487
#define Big1 0xffffffff
1488
1489
#ifndef Pack_32
1490
#define Pack_32
1491
#endif
1492
1493
typedef struct BCinfo BCinfo;
1494
 struct
1495
BCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk; };
1496
1497
0
#define FFFFFFFF 0xffffffffUL
1498
1499
#ifdef MULTIPLE_THREADS
1500
#define MTa , PTI
1501
#define MTb , &TI
1502
#define MTd , ThInfo **PTI
1503
static unsigned int maxthreads = 0;
1504
#else
1505
#define MTa /*nothing*/
1506
#define MTb /*nothing*/
1507
#define MTd /*nothing*/
1508
#endif
1509
1510
0
#define Kmax 7
1511
1512
#ifdef __cplusplus
1513
extern "C" char *dtoa(double d, int mode, int ndigits,
1514
      int *decpt, int *sign, char **rve);
1515
#endif
1516
1517
 struct
1518
Bigint {
1519
  struct Bigint *next;
1520
  int k, maxwds, sign, wds;
1521
  ULong x[1];
1522
  };
1523
1524
 typedef struct Bigint Bigint;
1525
 typedef struct
1526
ThInfo {
1527
  Bigint *Freelist[Kmax+1];
1528
  Bigint *P5s;
1529
  } ThInfo;
1530
1531
 static ThInfo TI0;
1532
1533
#ifdef MULTIPLE_THREADS
1534
 static ThInfo *TI1;
1535
 static int TI0_used;
1536
1537
 void
1538
set_max_dtoa_threads(unsigned int n)
1539
{
1540
  size_t L;
1541
1542
  if (n > maxthreads) {
1543
    L = n*sizeof(ThInfo);
1544
    if (TI1) {
1545
      TI1 = (ThInfo*)REALLOC(TI1, L);
1546
      memset(TI1 + maxthreads, 0, (n-maxthreads)*sizeof(ThInfo));
1547
      }
1548
    else {
1549
      TI1 = (ThInfo*)MALLOC(L);
1550
      if (TI0_used) {
1551
        memcpy(TI1, &TI0, sizeof(ThInfo));
1552
        if (n > 1)
1553
          memset(TI1 + 1, 0, L - sizeof(ThInfo));
1554
        memset(&TI0, 0, sizeof(ThInfo));
1555
        }
1556
      else
1557
        memset(TI1, 0, L);
1558
      }
1559
    maxthreads = n;
1560
    }
1561
  }
1562
1563
 static ThInfo*
1564
get_TI(void)
1565
{
1566
  unsigned int thno = dtoa_get_threadno();
1567
  if (thno < maxthreads)
1568
    return TI1 + thno;
1569
  if (thno == 0)
1570
    TI0_used = 1;
1571
  return &TI0;
1572
  }
1573
#define freelist TI->Freelist
1574
#define p5s TI->P5s
1575
#else
1576
0
#define freelist TI0.Freelist
1577
0
#define p5s TI0.P5s
1578
#endif
1579
1580
 static Bigint *
1581
Balloc(int k MTd)
1582
0
{
1583
0
  int x;
1584
0
  Bigint *rv;
1585
0
#ifndef Omit_Private_Memory
1586
0
  unsigned int len;
1587
0
#endif
1588
#ifdef MULTIPLE_THREADS
1589
  ThInfo *TI;
1590
1591
  if (!(TI = *PTI))
1592
    *PTI = TI = get_TI();
1593
  if (TI == &TI0)
1594
    ACQUIRE_DTOA_LOCK(0);
1595
#endif
1596
  /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
1597
  /* but this case seems very unlikely. */
1598
0
  if (k <= Kmax && (rv = freelist[k]))
1599
0
    freelist[k] = rv->next;
1600
0
  else {
1601
0
    x = 1 << k;
1602
#ifdef Omit_Private_Memory
1603
    rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
1604
#else
1605
0
    len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
1606
0
      /sizeof(double);
1607
0
    if (k <= Kmax && pmem_next - private_mem + len <= (ssize_t)PRIVATE_mem
1608
#ifdef MULTIPLE_THREADS
1609
      && TI == TI1
1610
#endif
1611
0
      ) {
1612
0
      rv = (Bigint*)pmem_next;
1613
0
      pmem_next += len;
1614
0
      }
1615
0
    else
1616
0
      rv = (Bigint*)MALLOC(len*sizeof(double));
1617
0
#endif
1618
0
    rv->k = k;
1619
0
    rv->maxwds = x;
1620
0
    }
1621
#ifdef MULTIPLE_THREADS
1622
  if (TI == &TI0)
1623
    FREE_DTOA_LOCK(0);
1624
#endif
1625
0
  rv->sign = rv->wds = 0;
1626
0
  return rv;
1627
0
  }
1628
1629
 static void
1630
Bfree(Bigint *v MTd)
1631
0
{
1632
#ifdef MULTIPLE_THREADS
1633
  ThInfo *TI;
1634
#endif
1635
0
  if (v) {
1636
0
    if (v->k > Kmax)
1637
0
      FREE((void*)v);
1638
0
    else {
1639
#ifdef MULTIPLE_THREADS
1640
      if (!(TI = *PTI))
1641
        *PTI = TI = get_TI();
1642
      if (TI == &TI0)
1643
        ACQUIRE_DTOA_LOCK(0);
1644
#endif
1645
0
      v->next = freelist[v->k];
1646
0
      freelist[v->k] = v;
1647
#ifdef MULTIPLE_THREADS
1648
      if (TI == &TI0)
1649
        FREE_DTOA_LOCK(0);
1650
#endif
1651
0
      }
1652
0
    }
1653
0
  }
1654
1655
0
#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
1656
0
y->wds*sizeof(Long) + 2*sizeof(int))
1657
1658
 static Bigint *
1659
multadd(Bigint *b, int m, int a MTd)  /* multiply by m and add a */
1660
0
{
1661
0
  int i, wds;
1662
0
#ifdef ULLong
1663
0
  ULong *x;
1664
0
  ULLong carry, y;
1665
#else
1666
  ULong carry, *x, y;
1667
#ifdef Pack_32
1668
  ULong xi, z;
1669
#endif
1670
#endif
1671
0
  Bigint *b1;
1672
1673
0
  wds = b->wds;
1674
0
  x = b->x;
1675
0
  i = 0;
1676
0
  carry = a;
1677
0
  do {
1678
0
#ifdef ULLong
1679
0
    y = *x * (ULLong)m + carry;
1680
0
    carry = y >> 32;
1681
0
    *x++ = y & FFFFFFFF;
1682
#else
1683
#ifdef Pack_32
1684
    xi = *x;
1685
    y = (xi & 0xffff) * m + carry;
1686
    z = (xi >> 16) * m + (y >> 16);
1687
    carry = z >> 16;
1688
    *x++ = (z << 16) + (y & 0xffff);
1689
#else
1690
    y = *x * m + carry;
1691
    carry = y >> 16;
1692
    *x++ = y & 0xffff;
1693
#endif
1694
#endif
1695
0
    }
1696
0
    while(++i < wds);
1697
0
  if (carry) {
1698
0
    if (wds >= b->maxwds) {
1699
0
      b1 = Balloc(b->k+1 MTa);
1700
0
      Bcopy(b1, b);
1701
0
      Bfree(b MTa);
1702
0
      b = b1;
1703
0
      }
1704
0
    b->x[wds++] = (ULong)carry;
1705
0
    b->wds = wds;
1706
0
    }
1707
0
  return b;
1708
0
  }
1709
1710
 static int
1711
hi0bits(ULong x)
1712
0
{
1713
0
  int k = 0;
1714
1715
0
  if (!(x & 0xffff0000)) {
1716
0
    k = 16;
1717
0
    x <<= 16;
1718
0
    }
1719
0
  if (!(x & 0xff000000)) {
1720
0
    k += 8;
1721
0
    x <<= 8;
1722
0
    }
1723
0
  if (!(x & 0xf0000000)) {
1724
0
    k += 4;
1725
0
    x <<= 4;
1726
0
    }
1727
0
  if (!(x & 0xc0000000)) {
1728
0
    k += 2;
1729
0
    x <<= 2;
1730
0
    }
1731
0
  if (!(x & 0x80000000)) {
1732
0
    k++;
1733
0
    if (!(x & 0x40000000))
1734
0
      return 32;
1735
0
    }
1736
0
  return k;
1737
0
  }
1738
1739
 static int
1740
lo0bits(ULong *y)
1741
0
{
1742
0
  int k;
1743
0
  ULong x = *y;
1744
1745
0
  if (x & 7) {
1746
0
    if (x & 1)
1747
0
      return 0;
1748
0
    if (x & 2) {
1749
0
      *y = x >> 1;
1750
0
      return 1;
1751
0
      }
1752
0
    *y = x >> 2;
1753
0
    return 2;
1754
0
    }
1755
0
  k = 0;
1756
0
  if (!(x & 0xffff)) {
1757
0
    k = 16;
1758
0
    x >>= 16;
1759
0
    }
1760
0
  if (!(x & 0xff)) {
1761
0
    k += 8;
1762
0
    x >>= 8;
1763
0
    }
1764
0
  if (!(x & 0xf)) {
1765
0
    k += 4;
1766
0
    x >>= 4;
1767
0
    }
1768
0
  if (!(x & 0x3)) {
1769
0
    k += 2;
1770
0
    x >>= 2;
1771
0
    }
1772
0
  if (!(x & 1)) {
1773
0
    k++;
1774
0
    x >>= 1;
1775
0
    if (!x)
1776
0
      return 32;
1777
0
    }
1778
0
  *y = x;
1779
0
  return k;
1780
0
  }
1781
1782
 static Bigint *
1783
i2b(int i MTd)
1784
0
{
1785
0
  Bigint *b;
1786
1787
0
  b = Balloc(1 MTa);
1788
0
  b->x[0] = i;
1789
0
  b->wds = 1;
1790
0
  return b;
1791
0
  }
1792
1793
 static Bigint *
1794
mult(Bigint *a, Bigint *b MTd)
1795
0
{
1796
0
  Bigint *c;
1797
0
  int k, wa, wb, wc;
1798
0
  ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
1799
0
  ULong y;
1800
0
#ifdef ULLong
1801
0
  ULLong carry, z;
1802
#else
1803
  ULong carry, z;
1804
#ifdef Pack_32
1805
  ULong z2;
1806
#endif
1807
#endif
1808
1809
0
  if (a->wds < b->wds) {
1810
0
    c = a;
1811
0
    a = b;
1812
0
    b = c;
1813
0
    }
1814
0
  k = a->k;
1815
0
  wa = a->wds;
1816
0
  wb = b->wds;
1817
0
  wc = wa + wb;
1818
0
  if (wc > a->maxwds)
1819
0
    k++;
1820
0
  c = Balloc(k MTa);
1821
0
  for(x = c->x, xa = x + wc; x < xa; x++)
1822
0
    *x = 0;
1823
0
  xa = a->x;
1824
0
  xae = xa + wa;
1825
0
  xb = b->x;
1826
0
  xbe = xb + wb;
1827
0
  xc0 = c->x;
1828
0
#ifdef ULLong
1829
0
  for(; xb < xbe; xc0++) {
1830
0
    if ((y = *xb++)) {
1831
0
      x = xa;
1832
0
      xc = xc0;
1833
0
      carry = 0;
1834
0
      do {
1835
0
        z = *x++ * (ULLong)y + *xc + carry;
1836
0
        carry = z >> 32;
1837
0
        *xc++ = z & FFFFFFFF;
1838
0
        }
1839
0
        while(x < xae);
1840
0
      *xc = (ULong)carry;
1841
0
      }
1842
0
    }
1843
#else
1844
#ifdef Pack_32
1845
  for(; xb < xbe; xb++, xc0++) {
1846
    if ((y = *xb & 0xffff)) {
1847
      x = xa;
1848
      xc = xc0;
1849
      carry = 0;
1850
      do {
1851
        z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
1852
        carry = z >> 16;
1853
        z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
1854
        carry = z2 >> 16;
1855
        Storeinc(xc, z2, z);
1856
        }
1857
        while(x < xae);
1858
      *xc = carry;
1859
      }
1860
    if ((y = *xb >> 16)) {
1861
      x = xa;
1862
      xc = xc0;
1863
      carry = 0;
1864
      z2 = *xc;
1865
      do {
1866
        z = (*x & 0xffff) * y + (*xc >> 16) + carry;
1867
        carry = z >> 16;
1868
        Storeinc(xc, z, z2);
1869
        z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
1870
        carry = z2 >> 16;
1871
        }
1872
        while(x < xae);
1873
      *xc = z2;
1874
      }
1875
    }
1876
#else
1877
  for(; xb < xbe; xc0++) {
1878
    if (y = *xb++) {
1879
      x = xa;
1880
      xc = xc0;
1881
      carry = 0;
1882
      do {
1883
        z = *x++ * y + *xc + carry;
1884
        carry = z >> 16;
1885
        *xc++ = z & 0xffff;
1886
        }
1887
        while(x < xae);
1888
      *xc = carry;
1889
      }
1890
    }
1891
#endif
1892
#endif
1893
0
  for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
1894
0
  c->wds = wc;
1895
0
  return c;
1896
0
  }
1897
1898
 static Bigint *
1899
pow5mult(Bigint *b, int k MTd)
1900
0
{
1901
0
  Bigint *b1, *p5, *p51;
1902
#ifdef MULTIPLE_THREADS
1903
  ThInfo *TI;
1904
#endif
1905
0
  int i;
1906
0
  static const int p05[3] = { 5, 25, 125 };
1907
1908
0
  if ((i = k & 3))
1909
0
    b = multadd(b, p05[i-1], 0 MTa);
1910
1911
0
  if (!(k >>= 2))
1912
0
    return b;
1913
#ifdef  MULTIPLE_THREADS
1914
  if (!(TI = *PTI))
1915
    *PTI = TI = get_TI();
1916
#endif
1917
0
  if (!(p5 = p5s)) {
1918
    /* first time */
1919
#ifdef MULTIPLE_THREADS
1920
    if (!(TI = *PTI))
1921
      *PTI = TI = get_TI();
1922
    if (TI == &TI0)
1923
      ACQUIRE_DTOA_LOCK(1);
1924
    if (!(p5 = p5s)) {
1925
      p5 = p5s = i2b(625 MTa);
1926
      p5->next = 0;
1927
      }
1928
    if (TI == &TI0)
1929
      FREE_DTOA_LOCK(1);
1930
#else
1931
0
    p5 = p5s = i2b(625 MTa);
1932
0
    p5->next = 0;
1933
0
#endif
1934
0
    }
1935
0
  for(;;) {
1936
0
    if (k & 1) {
1937
0
      b1 = mult(b, p5 MTa);
1938
0
      Bfree(b MTa);
1939
0
      b = b1;
1940
0
      }
1941
0
    if (!(k >>= 1))
1942
0
      break;
1943
0
    if (!(p51 = p5->next)) {
1944
#ifdef MULTIPLE_THREADS
1945
      if (!TI && !(TI = *PTI))
1946
        *PTI = TI = get_TI();
1947
      if (TI == &TI0)
1948
        ACQUIRE_DTOA_LOCK(1);
1949
      if (!(p51 = p5->next)) {
1950
        p51 = p5->next = mult(p5,p5 MTa);
1951
        p51->next = 0;
1952
        }
1953
      if (TI == &TI0)
1954
        FREE_DTOA_LOCK(1);
1955
#else
1956
0
      p51 = p5->next = mult(p5,p5);
1957
0
      p51->next = 0;
1958
0
#endif
1959
0
      }
1960
0
    p5 = p51;
1961
0
    }
1962
0
  return b;
1963
0
  }
1964
1965
 static Bigint *
1966
lshift(Bigint *b, int k MTd)
1967
0
{
1968
0
  int i, k1, n, n1;
1969
0
  Bigint *b1;
1970
0
  ULong *x, *x1, *xe, z;
1971
1972
0
#ifdef Pack_32
1973
0
  n = k >> 5;
1974
#else
1975
  n = k >> 4;
1976
#endif
1977
0
  k1 = b->k;
1978
0
  n1 = n + b->wds + 1;
1979
0
  for(i = b->maxwds; n1 > i; i <<= 1)
1980
0
    k1++;
1981
0
  b1 = Balloc(k1 MTa);
1982
0
  x1 = b1->x;
1983
0
  for(i = 0; i < n; i++)
1984
0
    *x1++ = 0;
1985
0
  x = b->x;
1986
0
  xe = x + b->wds;
1987
0
#ifdef Pack_32
1988
0
  if (k &= 0x1f) {
1989
0
    k1 = 32 - k;
1990
0
    z = 0;
1991
0
    do {
1992
0
      *x1++ = *x << k | z;
1993
0
      z = *x++ >> k1;
1994
0
      }
1995
0
      while(x < xe);
1996
0
    if ((*x1 = z))
1997
0
      ++n1;
1998
0
    }
1999
#else
2000
  if (k &= 0xf) {
2001
    k1 = 16 - k;
2002
    z = 0;
2003
    do {
2004
      *x1++ = *x << k  & 0xffff | z;
2005
      z = *x++ >> k1;
2006
      }
2007
      while(x < xe);
2008
    if (*x1 = z)
2009
      ++n1;
2010
    }
2011
#endif
2012
0
  else do
2013
0
    *x1++ = *x++;
2014
0
    while(x < xe);
2015
0
  b1->wds = n1 - 1;
2016
0
  Bfree(b MTa);
2017
0
  return b1;
2018
0
  }
2019
2020
 static int
2021
cmp(Bigint *a, Bigint *b)
2022
0
{
2023
0
  ULong *xa, *xa0, *xb, *xb0;
2024
0
  int i, j;
2025
2026
0
  i = a->wds;
2027
0
  j = b->wds;
2028
#ifdef DEBUG
2029
  if (i > 1 && !a->x[i-1])
2030
    Bug("cmp called with a->x[a->wds-1] == 0");
2031
  if (j > 1 && !b->x[j-1])
2032
    Bug("cmp called with b->x[b->wds-1] == 0");
2033
#endif
2034
0
  if (i -= j)
2035
0
    return i;
2036
0
  xa0 = a->x;
2037
0
  xa = xa0 + j;
2038
0
  xb0 = b->x;
2039
0
  xb = xb0 + j;
2040
0
  for(;;) {
2041
0
    if (*--xa != *--xb)
2042
0
      return *xa < *xb ? -1 : 1;
2043
0
    if (xa <= xa0)
2044
0
      break;
2045
0
    }
2046
0
  return 0;
2047
0
  }
2048
2049
 static Bigint *
2050
diff(Bigint *a, Bigint *b MTd)
2051
0
{
2052
0
  Bigint *c;
2053
0
  int i, wa, wb;
2054
0
  ULong *xa, *xae, *xb, *xbe, *xc;
2055
0
#ifdef ULLong
2056
0
  ULLong borrow, y;
2057
#else
2058
  ULong borrow, y;
2059
#ifdef Pack_32
2060
  ULong z;
2061
#endif
2062
#endif
2063
2064
0
  i = cmp(a,b);
2065
0
  if (!i) {
2066
0
    c = Balloc(0 MTa);
2067
0
    c->wds = 1;
2068
0
    c->x[0] = 0;
2069
0
    return c;
2070
0
    }
2071
0
  if (i < 0) {
2072
0
    c = a;
2073
0
    a = b;
2074
0
    b = c;
2075
0
    i = 1;
2076
0
    }
2077
0
  else
2078
0
    i = 0;
2079
0
  c = Balloc(a->k MTa);
2080
0
  c->sign = i;
2081
0
  wa = a->wds;
2082
0
  xa = a->x;
2083
0
  xae = xa + wa;
2084
0
  wb = b->wds;
2085
0
  xb = b->x;
2086
0
  xbe = xb + wb;
2087
0
  xc = c->x;
2088
0
  borrow = 0;
2089
0
#ifdef ULLong
2090
0
  do {
2091
0
    y = (ULLong)*xa++ - *xb++ - borrow;
2092
0
    borrow = y >> 32 & (ULong)1;
2093
0
    *xc++ = y & FFFFFFFF;
2094
0
    }
2095
0
    while(xb < xbe);
2096
0
  while(xa < xae) {
2097
0
    y = *xa++ - borrow;
2098
0
    borrow = y >> 32 & (ULong)1;
2099
0
    *xc++ = y & FFFFFFFF;
2100
0
    }
2101
#else
2102
#ifdef Pack_32
2103
  do {
2104
    y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
2105
    borrow = (y & 0x10000) >> 16;
2106
    z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
2107
    borrow = (z & 0x10000) >> 16;
2108
    Storeinc(xc, z, y);
2109
    }
2110
    while(xb < xbe);
2111
  while(xa < xae) {
2112
    y = (*xa & 0xffff) - borrow;
2113
    borrow = (y & 0x10000) >> 16;
2114
    z = (*xa++ >> 16) - borrow;
2115
    borrow = (z & 0x10000) >> 16;
2116
    Storeinc(xc, z, y);
2117
    }
2118
#else
2119
  do {
2120
    y = *xa++ - *xb++ - borrow;
2121
    borrow = (y & 0x10000) >> 16;
2122
    *xc++ = y & 0xffff;
2123
    }
2124
    while(xb < xbe);
2125
  while(xa < xae) {
2126
    y = *xa++ - borrow;
2127
    borrow = (y & 0x10000) >> 16;
2128
    *xc++ = y & 0xffff;
2129
    }
2130
#endif
2131
#endif
2132
0
  while(!*--xc)
2133
0
    wa--;
2134
0
  c->wds = wa;
2135
0
  return c;
2136
0
  }
2137
2138
 static Bigint *
2139
d2b(U *d, int *e, int *bits MTd)
2140
0
{
2141
0
  Bigint *b;
2142
0
  int de, k;
2143
0
  ULong *x, y, z;
2144
0
#ifndef Sudden_Underflow
2145
0
  int i;
2146
0
#endif
2147
#ifdef VAX
2148
  ULong d0, d1;
2149
  d0 = word0(d) >> 16 | word0(d) << 16;
2150
  d1 = word1(d) >> 16 | word1(d) << 16;
2151
#else
2152
0
#define d0 word0(d)
2153
0
#define d1 word1(d)
2154
0
#endif
2155
2156
0
#ifdef Pack_32
2157
0
  b = Balloc(1 MTa);
2158
#else
2159
  b = Balloc(2 MTa);
2160
#endif
2161
0
  x = b->x;
2162
2163
0
  z = d0 & Frac_mask;
2164
0
  d0 &= 0x7fffffff; /* clear sign bit, which we ignore */
2165
#ifdef Sudden_Underflow
2166
  de = (int)(d0 >> Exp_shift);
2167
#ifndef IBM
2168
  z |= Exp_msk11;
2169
#endif
2170
#else
2171
0
  if ((de = (int)(d0 >> Exp_shift)))
2172
0
    z |= Exp_msk1;
2173
0
#endif
2174
0
#ifdef Pack_32
2175
0
  if ((y = d1)) {
2176
0
    if ((k = lo0bits(&y))) {
2177
0
      x[0] = y | z << (32 - k);
2178
0
      z >>= k;
2179
0
      }
2180
0
    else
2181
0
      x[0] = y;
2182
0
#ifndef Sudden_Underflow
2183
0
    i =
2184
0
#endif
2185
0
        b->wds = (x[1] = z) ? 2 : 1;
2186
0
    }
2187
0
  else {
2188
0
    k = lo0bits(&z);
2189
0
    x[0] = z;
2190
0
#ifndef Sudden_Underflow
2191
0
    i =
2192
0
#endif
2193
0
        b->wds = 1;
2194
0
    k += 32;
2195
0
    }
2196
#else
2197
  if (y = d1) {
2198
    if (k = lo0bits(&y))
2199
      if (k >= 16) {
2200
        x[0] = y | z << 32 - k & 0xffff;
2201
        x[1] = z >> k - 16 & 0xffff;
2202
        x[2] = z >> k;
2203
        i = 2;
2204
        }
2205
      else {
2206
        x[0] = y & 0xffff;
2207
        x[1] = y >> 16 | z << 16 - k & 0xffff;
2208
        x[2] = z >> k & 0xffff;
2209
        x[3] = z >> k+16;
2210
        i = 3;
2211
        }
2212
    else {
2213
      x[0] = y & 0xffff;
2214
      x[1] = y >> 16;
2215
      x[2] = z & 0xffff;
2216
      x[3] = z >> 16;
2217
      i = 3;
2218
      }
2219
    }
2220
  else {
2221
#ifdef DEBUG
2222
    if (!z)
2223
      Bug("Zero passed to d2b");
2224
#endif
2225
    k = lo0bits(&z);
2226
    if (k >= 16) {
2227
      x[0] = z;
2228
      i = 0;
2229
      }
2230
    else {
2231
      x[0] = z & 0xffff;
2232
      x[1] = z >> 16;
2233
      i = 1;
2234
      }
2235
    k += 32;
2236
    }
2237
  while(!x[i])
2238
    --i;
2239
  b->wds = i + 1;
2240
#endif
2241
0
#ifndef Sudden_Underflow
2242
0
  if (de) {
2243
0
#endif
2244
#ifdef IBM
2245
    *e = (de - Bias - (P-1) << 2) + k;
2246
    *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
2247
#else
2248
0
    *e = de - Bias - (P-1) + k;
2249
0
    *bits = P - k;
2250
0
#endif
2251
0
#ifndef Sudden_Underflow
2252
0
    }
2253
0
  else {
2254
0
    *e = de - Bias - (P-1) + 1 + k;
2255
0
#ifdef Pack_32
2256
0
    *bits = 32*i - hi0bits(x[i-1]);
2257
#else
2258
    *bits = (i+2)*16 - hi0bits(x[i]);
2259
#endif
2260
0
    }
2261
0
#endif
2262
0
  return b;
2263
0
  }
2264
#undef d0
2265
#undef d1
2266
2267
#undef Need_Hexdig
2268
#ifdef INFNAN_CHECK
2269
#ifndef No_Hex_NaN
2270
#define Need_Hexdig
2271
#endif
2272
#endif
2273
2274
#ifndef Need_Hexdig
2275
#ifndef NO_HEX_FP
2276
#define Need_Hexdig
2277
#endif
2278
#endif
2279
2280
#ifdef INFNAN_CHECK
2281
2282
#ifndef NAN_WORD0
2283
#define NAN_WORD0 0x7ff80000
2284
#endif
2285
2286
#ifndef NAN_WORD1
2287
#define NAN_WORD1 0
2288
#endif
2289
2290
#endif /* INFNAN_CHECK */
2291
2292
#ifdef Pack_32
2293
#define ULbits 32
2294
#define kshift 5
2295
0
#define kmask 31
2296
#else
2297
#define ULbits 16
2298
#define kshift 4
2299
#define kmask 15
2300
#endif
2301
2302
#if !defined(NO_HEX_FP) || defined(Honor_FLT_ROUNDS) /*{*/
2303
 static Bigint *
2304
increment(Bigint *b MTd)
2305
{
2306
  ULong *x, *xe;
2307
  Bigint *b1;
2308
2309
  x = b->x;
2310
  xe = x + b->wds;
2311
  do {
2312
    if (*x < (ULong)0xffffffffL) {
2313
      ++*x;
2314
      return b;
2315
      }
2316
    *x++ = 0;
2317
    } while(x < xe);
2318
  {
2319
    if (b->wds >= b->maxwds) {
2320
      b1 = Balloc(b->k+1 MTa);
2321
      Bcopy(b1,b);
2322
      Bfree(b MTa);
2323
      b = b1;
2324
      }
2325
    b->x[b->wds++] = 1;
2326
    }
2327
  return b;
2328
  }
2329
2330
#endif /*}*/
2331
2332
 static int
2333
dshift(Bigint *b, int p2)
2334
0
{
2335
0
  int rv = hi0bits(b->x[b->wds-1]) - 4;
2336
0
  if (p2 > 0)
2337
0
    rv -= p2;
2338
0
  return rv & kmask;
2339
0
  }
2340
2341
 static int
2342
quorem(Bigint *b, Bigint *S)
2343
0
{
2344
0
  int n;
2345
0
  ULong *bx, *bxe, q, *sx, *sxe;
2346
0
#ifdef ULLong
2347
0
  ULLong borrow, carry, y, ys;
2348
#else
2349
  ULong borrow, carry, y, ys;
2350
#ifdef Pack_32
2351
  ULong si, z, zs;
2352
#endif
2353
#endif
2354
2355
0
  n = S->wds;
2356
#ifdef DEBUG
2357
  /*debug*/ if (b->wds > n)
2358
  /*debug*/ Bug("oversize b in quorem");
2359
#endif
2360
0
  if (b->wds < n)
2361
0
    return 0;
2362
0
  sx = S->x;
2363
0
  sxe = sx + --n;
2364
0
  bx = b->x;
2365
0
  bxe = bx + n;
2366
0
  q = *bxe / (*sxe + 1);  /* ensure q <= true quotient */
2367
#ifdef DEBUG
2368
#ifdef NO_STRTOD_BIGCOMP
2369
  /*debug*/ if (q > 9)
2370
#else
2371
  /* An oversized q is possible when quorem is called from bigcomp and */
2372
  /* the input is near, e.g., twice the smallest denormalized number. */
2373
  /*debug*/ if (q > 15)
2374
#endif
2375
  /*debug*/ Bug("oversized quotient in quorem");
2376
#endif
2377
0
  if (q) {
2378
0
    borrow = 0;
2379
0
    carry = 0;
2380
0
    do {
2381
0
#ifdef ULLong
2382
0
      ys = *sx++ * (ULLong)q + carry;
2383
0
      carry = ys >> 32;
2384
0
      y = *bx - (ys & FFFFFFFF) - borrow;
2385
0
      borrow = y >> 32 & (ULong)1;
2386
0
      *bx++ = y & FFFFFFFF;
2387
#else
2388
#ifdef Pack_32
2389
      si = *sx++;
2390
      ys = (si & 0xffff) * q + carry;
2391
      zs = (si >> 16) * q + (ys >> 16);
2392
      carry = zs >> 16;
2393
      y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2394
      borrow = (y & 0x10000) >> 16;
2395
      z = (*bx >> 16) - (zs & 0xffff) - borrow;
2396
      borrow = (z & 0x10000) >> 16;
2397
      Storeinc(bx, z, y);
2398
#else
2399
      ys = *sx++ * q + carry;
2400
      carry = ys >> 16;
2401
      y = *bx - (ys & 0xffff) - borrow;
2402
      borrow = (y & 0x10000) >> 16;
2403
      *bx++ = y & 0xffff;
2404
#endif
2405
#endif
2406
0
      }
2407
0
      while(sx <= sxe);
2408
0
    if (!*bxe) {
2409
0
      bx = b->x;
2410
0
      while(--bxe > bx && !*bxe)
2411
0
        --n;
2412
0
      b->wds = n;
2413
0
      }
2414
0
    }
2415
0
  if (cmp(b, S) >= 0) {
2416
0
    q++;
2417
0
    borrow = 0;
2418
0
    carry = 0;
2419
0
    bx = b->x;
2420
0
    sx = S->x;
2421
0
    do {
2422
0
#ifdef ULLong
2423
0
      ys = *sx++ + carry;
2424
0
      carry = ys >> 32;
2425
0
      y = *bx - (ys & FFFFFFFF) - borrow;
2426
0
      borrow = y >> 32 & (ULong)1;
2427
0
      *bx++ = y & FFFFFFFF;
2428
#else
2429
#ifdef Pack_32
2430
      si = *sx++;
2431
      ys = (si & 0xffff) + carry;
2432
      zs = (si >> 16) + (ys >> 16);
2433
      carry = zs >> 16;
2434
      y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2435
      borrow = (y & 0x10000) >> 16;
2436
      z = (*bx >> 16) - (zs & 0xffff) - borrow;
2437
      borrow = (z & 0x10000) >> 16;
2438
      Storeinc(bx, z, y);
2439
#else
2440
      ys = *sx++ + carry;
2441
      carry = ys >> 16;
2442
      y = *bx - (ys & 0xffff) - borrow;
2443
      borrow = (y & 0x10000) >> 16;
2444
      *bx++ = y & 0xffff;
2445
#endif
2446
#endif
2447
0
      }
2448
0
      while(sx <= sxe);
2449
0
    bx = b->x;
2450
0
    bxe = bx + n;
2451
0
    if (!*bxe) {
2452
0
      while(--bxe > bx && !*bxe)
2453
0
        --n;
2454
0
      b->wds = n;
2455
0
      }
2456
0
    }
2457
0
  return q;
2458
0
  }
2459
2460
#ifndef MULTIPLE_THREADS
2461
 static char *dtoa_result;
2462
#endif
2463
2464
 static char *
2465
rv_alloc(size_t i MTd)
2466
0
{
2467
0
  int j, k, *r;
2468
2469
0
  j = sizeof(ULong);
2470
0
  for(k = 0;
2471
0
    sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i;
2472
0
    j <<= 1)
2473
0
      k++;
2474
0
  r = (int*)Balloc(k MTa);
2475
0
  *r = k;
2476
0
  return
2477
0
#ifndef MULTIPLE_THREADS
2478
0
  dtoa_result =
2479
0
#endif
2480
0
    (char *)(r+1);
2481
0
  }
2482
2483
 static char *
2484
nrv_alloc(const char *s, char *s0, size_t s0len, char **rve, size_t n MTd)
2485
0
{
2486
0
  char *rv, *t;
2487
2488
0
  if (!s0)
2489
0
    s0 = rv_alloc(n MTa);
2490
0
  else if (s0len <= n) {
2491
0
    rv = 0;
2492
0
    t = rv + n;
2493
0
    goto rve_chk;
2494
0
    }
2495
0
  t = rv = s0;
2496
0
  while((*t = *s++))
2497
0
    ++t;
2498
0
 rve_chk:
2499
0
  if (rve)
2500
0
    *rve = t;
2501
0
  return rv;
2502
0
  }
2503
2504
/* freedtoa(s) must be used to free values s returned by dtoa
2505
 * when MULTIPLE_THREADS is #defined.  It should be used in all cases,
2506
 * but for consistency with earlier versions of dtoa, it is optional
2507
 * when MULTIPLE_THREADS is not defined.
2508
 */
2509
2510
 void
2511
freedtoa(char *s)
2512
0
{
2513
#ifdef MULTIPLE_THREADS
2514
  ThInfo *TI = 0;
2515
#endif
2516
0
  Bigint *b = (Bigint *)((int *)s - 1);
2517
0
  b->maxwds = 1 << (b->k = *(int*)b);
2518
0
  Bfree(b MTb);
2519
0
#ifndef MULTIPLE_THREADS
2520
0
  if (s == dtoa_result)
2521
0
    dtoa_result = 0;
2522
0
#endif
2523
0
  }
2524
2525
/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
2526
 *
2527
 * Inspired by "How to Print Floating-Point Numbers Accurately" by
2528
 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
2529
 *
2530
 * Modifications:
2531
 *  1. Rather than iterating, we use a simple numeric overestimate
2532
 *     to determine k = floor(log10(d)).  We scale relevant
2533
 *     quantities using O(log2(k)) rather than O(k) multiplications.
2534
 *  2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
2535
 *     try to generate digits strictly left to right.  Instead, we
2536
 *     compute with fewer bits and propagate the carry if necessary
2537
 *     when rounding the final digit up.  This is often faster.
2538
 *  3. Under the assumption that input will be rounded nearest,
2539
 *     mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
2540
 *     That is, we allow equality in stopping tests when the
2541
 *     round-nearest rule will give the same floating-point value
2542
 *     as would satisfaction of the stopping test with strict
2543
 *     inequality.
2544
 *  4. We remove common factors of powers of 2 from relevant
2545
 *     quantities.
2546
 *  5. When converting floating-point integers less than 1e16,
2547
 *     we use floating-point arithmetic rather than resorting
2548
 *     to multiple-precision integers.
2549
 *  6. When asked to produce fewer than 15 digits, we first try
2550
 *     to get by with floating-point arithmetic; we resort to
2551
 *     multiple-precision integer arithmetic only if we cannot
2552
 *     guarantee that the floating-point calculation has given
2553
 *     the correctly rounded result.  For k requested digits and
2554
 *     "uniformly" distributed input, the probability is
2555
 *     something like 10^(k-15) that we must resort to the Long
2556
 *     calculation.
2557
 */
2558
2559
 char *
2560
dtoa_r(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve, char *buf, size_t blen)
2561
0
{
2562
 /* Arguments ndigits, decpt, sign are similar to those
2563
  of ecvt and fcvt; trailing zeros are suppressed from
2564
  the returned string.  If not null, *rve is set to point
2565
  to the end of the return value.  If d is +-Infinity or NaN,
2566
  then *decpt is set to 9999.
2567
2568
  mode:
2569
    0 ==> shortest string that yields d when read in
2570
      and rounded to nearest.
2571
    1 ==> like 0, but with Steele & White stopping rule;
2572
      e.g. with IEEE P754 arithmetic , mode 0 gives
2573
      1e23 whereas mode 1 gives 9.999999999999999e22.
2574
    2 ==> max(1,ndigits) significant digits.  This gives a
2575
      return value similar to that of ecvt, except
2576
      that trailing zeros are suppressed.
2577
    3 ==> through ndigits past the decimal point.  This
2578
      gives a return value similar to that from fcvt,
2579
      except that trailing zeros are suppressed, and
2580
      ndigits can be negative.
2581
    4,5 ==> similar to 2 and 3, respectively, but (in
2582
      round-nearest mode) with the tests of mode 0 to
2583
      possibly return a shorter string that rounds to d.
2584
      With IEEE arithmetic and compilation with
2585
      -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
2586
      as modes 2 and 3 when FLT_ROUNDS != 1.
2587
    6-9 ==> Debugging modes similar to mode - 4:  don't try
2588
      fast floating-point estimate (if applicable).
2589
2590
    Values of mode other than 0-9 are treated as mode 0.
2591
2592
  When not NULL, buf is an output buffer of length blen, which must
2593
  be large enough to accommodate suppressed trailing zeros and a trailing
2594
  null byte.  If blen is too small, rv = NULL is returned, in which case
2595
  if rve is not NULL, a subsequent call with blen >= (*rve - rv) + 1
2596
  should succeed in returning buf.
2597
2598
  When buf is NULL, sufficient space is allocated for the return value,
2599
  which, when done using, the caller should pass to freedtoa().
2600
2601
  USE_BF is automatically defined when neither NO_LONG_LONG nor NO_BF96
2602
  is defined.
2603
  */
2604
2605
#ifdef MULTIPLE_THREADS
2606
  ThInfo *TI = 0;
2607
#endif
2608
0
  int bbits, b2, b5, be, dig, i, ilim, ilim1,
2609
0
    j, j1, k, leftright, m2, m5, s2, s5, spec_case;
2610
0
#if !defined(Sudden_Underflow) || defined(USE_BF96)
2611
0
  int denorm;
2612
0
#endif
2613
0
  Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2614
0
  U u;
2615
0
  char *s;
2616
#ifdef SET_INEXACT
2617
  int inexact, oldinexact;
2618
#endif
2619
0
#ifdef USE_BF96 /*{{*/
2620
0
  const BF96 *p10;
2621
0
  ULLong dbhi, dbits, dblo, den, hb, rb, rblo, res, res0, res3, reslo, sres,
2622
0
    sulp, tv0, tv1, tv2, tv3, ulp, ulplo, ulpmask, ures, ureslo, zb;
2623
0
  int eulp, k1, n2, ulpadj, ulpshift;
2624
#else /*}{*/
2625
#ifndef Sudden_Underflow
2626
  ULong x;
2627
#endif
2628
  Long L;
2629
  U d2, eps;
2630
  double ds;
2631
  int ieps, ilim0, k0, k_check, try_quick;
2632
#ifndef No_leftright
2633
#ifdef IEEE_Arith
2634
  U eps1;
2635
#endif
2636
#endif
2637
#endif /*}}*/
2638
#ifdef Honor_FLT_ROUNDS /*{*/
2639
  int Rounding;
2640
#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
2641
  Rounding = Flt_Rounds;
2642
#else /*}{*/
2643
  Rounding = 1;
2644
  switch(fegetround()) {
2645
    case FE_TOWARDZERO: Rounding = 0; break;
2646
    case FE_UPWARD: Rounding = 2; break;
2647
    case FE_DOWNWARD: Rounding = 3;
2648
    }
2649
#endif /*}}*/
2650
#endif /*}*/
2651
2652
0
  u.d = dd;
2653
0
  if (word0(&u) & Sign_bit) {
2654
    /* set sign for everything, including 0's and NaNs */
2655
0
    *sign = 1;
2656
0
    word0(&u) &= ~Sign_bit; /* clear sign bit */
2657
0
    }
2658
0
  else
2659
0
    *sign = 0;
2660
2661
0
#if defined(IEEE_Arith) + defined(VAX)
2662
0
#ifdef IEEE_Arith
2663
0
  if ((word0(&u) & Exp_mask) == Exp_mask)
2664
#else
2665
  if (word0(&u)  == 0x8000)
2666
#endif
2667
0
    {
2668
    /* Infinity or NaN */
2669
0
    *decpt = 9999;
2670
0
#ifdef IEEE_Arith
2671
0
    if (!word1(&u) && !(word0(&u) & 0xfffff))
2672
0
      return nrv_alloc("Infinity", buf, blen, rve, 8 MTb);
2673
0
#endif
2674
0
    return nrv_alloc("NaN", buf, blen, rve, 3 MTb);
2675
0
    }
2676
0
#endif
2677
#ifdef IBM
2678
  dval(&u) += 0; /* normalize */
2679
#endif
2680
0
  if (!dval(&u)) {
2681
0
    *decpt = 1;
2682
0
    return nrv_alloc("0", buf, blen, rve, 1 MTb);
2683
0
    }
2684
2685
#ifdef SET_INEXACT
2686
#ifndef USE_BF96
2687
  try_quick =
2688
#endif
2689
  oldinexact = get_inexact();
2690
  inexact = 1;
2691
#endif
2692
#ifdef Honor_FLT_ROUNDS
2693
  if (Rounding >= 2) {
2694
    if (*sign)
2695
      Rounding = Rounding == 2 ? 0 : 2;
2696
    else
2697
      if (Rounding != 2)
2698
        Rounding = 0;
2699
    }
2700
#endif
2701
0
#ifdef USE_BF96 /*{{*/
2702
0
  dbits = (u.LL & 0xfffffffffffffull) << 11;  /* fraction bits */
2703
0
  if ((be = u.LL >> 52)) /* biased exponent; nonzero ==> normal */ {
2704
0
    dbits |= 0x8000000000000000ull;
2705
0
    denorm = ulpadj = 0;
2706
0
    }
2707
0
  else {
2708
0
    denorm = 1;
2709
0
    ulpadj = be + 1;
2710
0
    dbits <<= 1;
2711
0
    if (!(dbits & 0xffffffff00000000ull)) {
2712
0
      dbits <<= 32;
2713
0
      be -= 32;
2714
0
      }
2715
0
    if (!(dbits & 0xffff000000000000ull)) {
2716
0
      dbits <<= 16;
2717
0
      be -= 16;
2718
0
      }
2719
0
    if (!(dbits & 0xff00000000000000ull)) {
2720
0
      dbits <<= 8;
2721
0
      be -= 8;
2722
0
      }
2723
0
    if (!(dbits & 0xf000000000000000ull)) {
2724
0
      dbits <<= 4;
2725
0
      be -= 4;
2726
0
      }
2727
0
    if (!(dbits & 0xc000000000000000ull)) {
2728
0
      dbits <<= 2;
2729
0
      be -= 2;
2730
0
      }
2731
0
    if (!(dbits & 0x8000000000000000ull)) {
2732
0
      dbits <<= 1;
2733
0
      be -= 1;
2734
0
      }
2735
0
    assert(be >= -51);
2736
0
    ulpadj -= be;
2737
0
    }
2738
0
  j = Lhint[be + 51];
2739
0
  p10 = &pten[j];
2740
0
  dbhi = dbits >> 32;
2741
0
  dblo = dbits & 0xffffffffull;
2742
0
  i = be - 0x3fe;
2743
0
  if (i < p10->e
2744
0
  || (i == p10->e && (dbhi < p10->b0 || (dbhi == p10->b0 && dblo < p10->b1))))
2745
0
    --j;
2746
0
  k = j - 342;
2747
2748
  /* now 10^k <= dd < 10^(k+1) */
2749
2750
#else /*}{*/
2751
2752
  b = d2b(&u, &be, &bbits MTb);
2753
#ifdef Sudden_Underflow
2754
  i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
2755
#else
2756
  if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
2757
#endif
2758
    dval(&d2) = dval(&u);
2759
    word0(&d2) &= Frac_mask1;
2760
    word0(&d2) |= Exp_11;
2761
#ifdef IBM
2762
    if (j = 11 - hi0bits(word0(&d2) & Frac_mask))
2763
      dval(&d2) /= 1 << j;
2764
#endif
2765
2766
    /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
2767
     * log10(x)  =  log(x) / log(10)
2768
     *    ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2769
     * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2770
     *
2771
     * This suggests computing an approximation k to log10(d) by
2772
     *
2773
     * k = (i - Bias)*0.301029995663981
2774
     *  + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2775
     *
2776
     * We want k to be too large rather than too small.
2777
     * The error in the first-order Taylor series approximation
2778
     * is in our favor, so we just round up the constant enough
2779
     * to compensate for any error in the multiplication of
2780
     * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2781
     * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2782
     * adding 1e-13 to the constant term more than suffices.
2783
     * Hence we adjust the constant term to 0.1760912590558.
2784
     * (We could get a more accurate k by invoking log10,
2785
     *  but this is probably not worthwhile.)
2786
     */
2787
2788
    i -= Bias;
2789
#ifdef IBM
2790
    i <<= 2;
2791
    i += j;
2792
#endif
2793
#ifndef Sudden_Underflow
2794
    denorm = 0;
2795
    }
2796
  else {
2797
    /* d is denormalized */
2798
2799
    i = bbits + be + (Bias + (P-1) - 1);
2800
    x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
2801
          : word1(&u) << (32 - i);
2802
    dval(&d2) = x;
2803
    word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
2804
    i -= (Bias + (P-1) - 1) + 1;
2805
    denorm = 1;
2806
    }
2807
#endif
2808
  ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
2809
  k = (int)ds;
2810
  if (ds < 0. && ds != k)
2811
    k--;  /* want k = floor(ds) */
2812
  k_check = 1;
2813
  if (k >= 0 && k <= Ten_pmax) {
2814
    if (dval(&u) < tens[k])
2815
      k--;
2816
    k_check = 0;
2817
    }
2818
  j = bbits - i - 1;
2819
  if (j >= 0) {
2820
    b2 = 0;
2821
    s2 = j;
2822
    }
2823
  else {
2824
    b2 = -j;
2825
    s2 = 0;
2826
    }
2827
  if (k >= 0) {
2828
    b5 = 0;
2829
    s5 = k;
2830
    s2 += k;
2831
    }
2832
  else {
2833
    b2 -= k;
2834
    b5 = -k;
2835
    s5 = 0;
2836
    }
2837
#endif /*}}*/
2838
0
  if (mode < 0 || mode > 9)
2839
0
    mode = 0;
2840
2841
#ifndef USE_BF96
2842
#ifndef SET_INEXACT
2843
#ifdef Check_FLT_ROUNDS
2844
  try_quick = Rounding == 1;
2845
#else
2846
  try_quick = 1;
2847
#endif
2848
#endif /*SET_INEXACT*/
2849
#endif /*USE_BF96*/
2850
2851
0
  if (mode > 5) {
2852
0
    mode -= 4;
2853
#ifndef USE_BF96
2854
    try_quick = 0;
2855
#endif
2856
0
    }
2857
0
  leftright = 1;
2858
0
  ilim = ilim1 = -1;  /* Values for cases 0 and 1; done here to */
2859
        /* silence erroneous "gcc -Wall" warning. */
2860
0
  switch(mode) {
2861
0
    case 0:
2862
0
    case 1:
2863
0
      i = 18;
2864
0
      ndigits = 0;
2865
0
      break;
2866
0
    case 2:
2867
0
      leftright = 0;
2868
      /* FALLTHROUGH */
2869
0
    case 4:
2870
0
      if (ndigits <= 0)
2871
0
        ndigits = 1;
2872
0
      ilim = ilim1 = i = ndigits;
2873
0
      break;
2874
0
    case 3:
2875
0
      leftright = 0;
2876
      /* FALLTHROUGH */
2877
0
    case 5:
2878
0
      i = ndigits + k + 1;
2879
0
      ilim = i;
2880
0
      ilim1 = i - 1;
2881
0
      if (i <= 0)
2882
0
        i = 1;
2883
0
    }
2884
0
  if (!buf) {
2885
0
    buf = rv_alloc(i MTb);
2886
0
    blen = sizeof(Bigint) + ((1 << ((int*)buf)[-1]) - 1)*sizeof(ULong) - sizeof(int);
2887
0
    }
2888
0
  else if (blen <= (size_t)i) {
2889
0
    buf = 0;
2890
0
    if (rve)
2891
0
      *rve = buf + i;
2892
0
    return buf;
2893
0
    }
2894
0
  s = buf;
2895
2896
  /* Check for special case that d is a normalized power of 2. */
2897
2898
0
  spec_case = 0;
2899
0
  if (mode < 2 || (leftright
2900
#ifdef Honor_FLT_ROUNDS
2901
      && Rounding == 1
2902
#endif
2903
0
        )) {
2904
0
    if (!word1(&u) && !(word0(&u) & Bndry_mask)
2905
0
#ifndef Sudden_Underflow
2906
0
     && word0(&u) & (Exp_mask & ~Exp_msk1)
2907
0
#endif
2908
0
        ) {
2909
      /* The special case */
2910
0
      spec_case = 1;
2911
0
      }
2912
0
    }
2913
2914
0
#ifdef USE_BF96 /*{*/
2915
0
  b = 0;
2916
0
  if (ilim < 0 && (mode == 3 || mode == 5)) {
2917
0
    S = mhi = 0;
2918
0
    goto no_digits;
2919
0
    }
2920
0
  i = 1;
2921
0
  j = 52 + 0x3ff - be;
2922
0
  ulpshift = 0;
2923
0
  ulplo = 0;
2924
  /* Can we do an exact computation with 64-bit integer arithmetic? */
2925
0
  if (k < 0) {
2926
0
    if (k < -25)
2927
0
      goto toobig;
2928
0
    res = dbits >> 11;
2929
0
    n2 = pfivebits[k1 = -(k + 1)] + 53;
2930
0
    j1 = j;
2931
0
    if (n2 > 61) {
2932
0
      ulpshift = n2 - 61;
2933
0
      if (res & (ulpmask = (1ull << ulpshift) - 1))
2934
0
        goto toobig;
2935
0
      j -= ulpshift;
2936
0
      res >>= ulpshift;
2937
0
      }
2938
    /* Yes. */
2939
0
    res *= ulp = pfive[k1];
2940
0
    if (ulpshift) {
2941
0
      ulplo = ulp;
2942
0
      ulp >>= ulpshift;
2943
0
      }
2944
0
    j += k;
2945
0
    if (ilim == 0) {
2946
0
      S = mhi = 0;
2947
0
      if (res > (5ull << j))
2948
0
        goto one_digit;
2949
0
      goto no_digits;
2950
0
      }
2951
0
    goto no_div;
2952
0
    }
2953
0
  if (ilim == 0 && j + k >= 0) {
2954
0
    S = mhi = 0;
2955
0
    if ((dbits >> 11) > (pfive[k-1] << j))
2956
0
      goto one_digit;
2957
0
    goto no_digits;
2958
0
    }
2959
0
  if (k <= dtoa_divmax && j + k >= 0) {
2960
    /* Another "yes" case -- we will use exact integer arithmetic. */
2961
0
 use_exact:
2962
0
    Debug(++dtoa_stats[3]);
2963
0
    res = dbits >> 11;  /* residual */
2964
0
    ulp = 1;
2965
0
    if (k <= 0)
2966
0
      goto no_div;
2967
0
    j1 = j + k + 1;
2968
0
    den = pfive[k-i] << (j1 - i);
2969
0
    for(;;) {
2970
0
      dig = (int)(res / den);
2971
0
      *s++ = '0' + dig;
2972
0
      if (!(res -= dig*den)) {
2973
#ifdef SET_INEXACT
2974
        inexact = 0;
2975
        oldinexact = 1;
2976
#endif
2977
0
        goto retc;
2978
0
        }
2979
0
      if (ilim < 0) {
2980
0
        ures = den - res;
2981
0
        if (2*res <= ulp
2982
0
        && (spec_case ? 4*res <= ulp : (2*res < ulp || dig & 1)))
2983
0
          goto ulp_reached;
2984
0
        if (2*ures < ulp)
2985
0
          goto Roundup;
2986
0
        }
2987
0
      else if (i == ilim) {
2988
0
        switch(Rounding) {
2989
0
          case 0: goto retc;
2990
0
          case 2: goto Roundup;
2991
0
          }
2992
0
        ures = 2*res;
2993
0
        if (ures > den
2994
0
        || (ures == den && dig & 1)
2995
0
        || (spec_case && res <= ulp && 2*res >= ulp))
2996
0
          goto Roundup;
2997
0
        goto retc;
2998
0
        }
2999
0
      if (j1 < ++i) {
3000
0
        res *= 10;
3001
0
        ulp *= 10;
3002
0
        }
3003
0
      else {
3004
0
        if (i > k)
3005
0
          break;
3006
0
        den = pfive[k-i] << (j1 - i);
3007
0
        }
3008
0
      }
3009
0
 no_div:
3010
0
    for(;;) {
3011
0
      den = res >> j;
3012
0
      dig = (int)den;
3013
0
      *s++ = '0' + dig;
3014
0
      if (!(res -= den << j)) {
3015
#ifdef SET_INEXACT
3016
        inexact = 0;
3017
        oldinexact = 1;
3018
#endif
3019
0
        goto retc;
3020
0
        }
3021
0
      if (ilim < 0) {
3022
0
        ures = (1ull << j) - res;
3023
0
        if (2*res <= ulp
3024
0
        && (spec_case ? 4*res <= ulp : (2*res < ulp || dig & 1))) {
3025
0
 ulp_reached:
3026
0
          if (ures < res
3027
0
          || (ures == res && dig & 1)
3028
0
          || (dig == 9 && 2*ures <= ulp))
3029
0
            goto Roundup;
3030
0
          goto retc;
3031
0
          }
3032
0
        if (2*ures < ulp)
3033
0
          goto Roundup;
3034
0
        }
3035
0
      --j;
3036
0
      if (i == ilim) {
3037
#ifdef Honor_FLT_ROUNDS
3038
        switch(Rounding) {
3039
          case 0: goto retc;
3040
          case 2: goto Roundup;
3041
          }
3042
#endif
3043
0
        hb = 1ull << j;
3044
0
        if (res & hb && (dig & 1 || res & (hb-1)))
3045
0
          goto Roundup;
3046
0
        if (spec_case && res <= ulp && 2*res >= ulp) {
3047
0
 Roundup:
3048
0
          while(*--s == '9')
3049
0
            if (s == buf) {
3050
0
              ++k;
3051
0
              *s++ = '1';
3052
0
              goto ret1;
3053
0
              }
3054
0
          ++*s++;
3055
0
          goto ret1;
3056
0
          }
3057
0
        goto retc;
3058
0
        }
3059
0
      ++i;
3060
0
      res *= 5;
3061
0
      if (ulpshift) {
3062
0
        ulplo = 5*(ulplo & ulpmask);
3063
0
        ulp = 5*ulp + (ulplo >> ulpshift);
3064
0
        }
3065
0
      else
3066
0
        ulp *= 5;
3067
0
      }
3068
0
    }
3069
0
 toobig:
3070
0
  if (ilim > 28)
3071
0
    goto Fast_failed1;
3072
  /* Scale by 10^-k */
3073
0
  p10 = &pten[342-k];
3074
0
  tv0 = p10->b2 * dblo; /* rarely matters, but does, e.g., for 9.862818194192001e18 */
3075
0
  tv1 = p10->b1 * dblo + (tv0 >> 32);
3076
0
  tv2 = p10->b2 * dbhi + (tv1 & 0xffffffffull);
3077
0
  tv3 = p10->b0 * dblo + (tv1>>32) + (tv2>>32);
3078
0
  res3 = p10->b1 * dbhi + (tv3 & 0xffffffffull);
3079
0
  res = p10->b0 * dbhi + (tv3>>32) + (res3>>32);
3080
0
  be += p10->e - 0x3fe;
3081
0
  eulp = j1 = be - 54 + ulpadj;
3082
0
  if (!(res & 0x8000000000000000ull)) {
3083
0
    --be;
3084
0
    res3 <<= 1;
3085
0
    res = (res << 1) | ((res3 & 0x100000000ull) >> 32);
3086
0
    }
3087
0
  res0 = res; /* save for Fast_failed */
3088
0
#if !defined(SET_INEXACT) && !defined(NO_DTOA_64) /*{*/
3089
0
  if (ilim > 19)
3090
0
    goto Fast_failed;
3091
0
  Debug(++dtoa_stats[4]);
3092
0
  assert(be >= 0 && be <= 4); /* be = 0 is rare, but possible, e.g., for 1e20 */
3093
0
  res >>= 4 - be;
3094
0
  ulp = p10->b0;  /* ulp */
3095
0
  ulp = (ulp << 29) | (p10->b1 >> 3);
3096
  /* scaled ulp = ulp * 2^(eulp - 60) */
3097
  /* We maintain 61 bits of the scaled ulp. */
3098
0
  if (ilim == 0) {
3099
0
    if (!(res & 0x7fffffffffffffeull)
3100
0
     || !((~res) & 0x7fffffffffffffeull))
3101
0
      goto Fast_failed1;
3102
0
    S = mhi = 0;
3103
0
    if (res >= 0x5000000000000000ull)
3104
0
      goto one_digit;
3105
0
    goto no_digits;
3106
0
    }
3107
0
  rb = 1; /* upper bound on rounding error */
3108
0
  for(;;++i) {
3109
0
    dig = res >> 60;
3110
0
    *s++ = '0' + dig;
3111
0
    res &= 0xfffffffffffffffull;
3112
0
    if (ilim < 0) {
3113
0
      ures = 0x1000000000000000ull - res;
3114
0
      if (eulp > 0) {
3115
0
        assert(eulp <= 4);
3116
0
        sulp = ulp << (eulp - 1);
3117
0
        if (res <= ures) {
3118
0
          if (res + rb > ures - rb)
3119
0
            goto Fast_failed;
3120
0
          if (res < sulp)
3121
0
            goto retc;
3122
0
          }
3123
0
        else {
3124
0
          if (res - rb <= ures + rb)
3125
0
            goto Fast_failed;
3126
0
          if (ures < sulp)
3127
0
            goto Roundup;
3128
0
          }
3129
0
        }
3130
0
      else {
3131
0
        zb = -(1ull << (eulp + 63));
3132
0
        if (!(zb & res)) {
3133
0
          sres = res << (1 - eulp);
3134
0
          if (sres < ulp && (!spec_case || 2*sres < ulp)) {
3135
0
            if ((res+rb) << (1 - eulp) >= ulp)
3136
0
              goto Fast_failed;
3137
0
            if (ures < res) {
3138
0
              if (ures + rb >= res - rb)
3139
0
                goto Fast_failed;
3140
0
              goto Roundup;
3141
0
              }
3142
0
            if (ures - rb < res + rb)
3143
0
              goto Fast_failed;
3144
0
            goto retc;
3145
0
            }
3146
0
          }
3147
0
        if (!(zb & ures) && ures << -eulp < ulp) {
3148
0
          if (ures << (1 - eulp) < ulp)
3149
0
            goto  Roundup;
3150
0
          goto Fast_failed;
3151
0
          }
3152
0
        }
3153
0
      }
3154
0
    else if (i == ilim) {
3155
0
      ures = 0x1000000000000000ull - res;
3156
0
      if (ures < res) {
3157
0
        if (ures <= rb || res - rb <= ures + rb) {
3158
0
          if (j + k >= 0 && k >= 0 && k <= 27)
3159
0
            goto use_exact1;
3160
0
          goto Fast_failed;
3161
0
          }
3162
#ifdef Honor_FLT_ROUNDS
3163
        if (Rounding == 0)
3164
          goto retc;
3165
#endif
3166
0
        goto Roundup;
3167
0
        }
3168
0
      if (res <= rb || ures - rb <= res + rb) {
3169
0
        if (j + k >= 0 && k >= 0 && k <= 27) {
3170
0
 use_exact1:
3171
0
          s = buf;
3172
0
          i = 1;
3173
0
          goto use_exact;
3174
0
          }
3175
0
        goto Fast_failed;
3176
0
        }
3177
#ifdef Honor_FLT_ROUNDS
3178
      if (Rounding == 2)
3179
        goto Roundup;
3180
#endif
3181
0
      goto retc;
3182
0
      }
3183
0
    rb *= 10;
3184
0
    if (rb >= 0x1000000000000000ull)
3185
0
      goto Fast_failed;
3186
0
    res *= 10;
3187
0
    ulp *= 5;
3188
0
    if (ulp & 0x8000000000000000ull) {
3189
0
      eulp += 4;
3190
0
      ulp >>= 3;
3191
0
      }
3192
0
    else {
3193
0
      eulp += 3;
3194
0
      ulp >>= 2;
3195
0
      }
3196
0
    }
3197
0
#endif /*}*/
3198
0
#ifndef NO_BF96
3199
0
 Fast_failed:
3200
0
#endif
3201
0
  Debug(++dtoa_stats[5]);
3202
0
  s = buf;
3203
0
  i = 4 - be;
3204
0
  res = res0 >> i;
3205
0
  reslo = 0xffffffffull & res3;
3206
0
  if (i)
3207
0
    reslo = (res0 << (64 - i)) >> 32 | (reslo >> i);
3208
0
  rb = 0;
3209
0
  rblo = 4; /* roundoff bound */
3210
0
  ulp = p10->b0;  /* ulp */
3211
0
  ulp = (ulp << 29) | (p10->b1 >> 3);
3212
0
  eulp = j1;
3213
0
  for(i = 1;;++i) {
3214
0
    dig = res >> 60;
3215
0
    *s++ = '0' + dig;
3216
0
    res &= 0xfffffffffffffffull;
3217
#ifdef SET_INEXACT
3218
    if (!res && !reslo) {
3219
      if (!(res3 & 0xffffffffull)) {
3220
        inexact = 0;
3221
        oldinexact = 1;
3222
        }
3223
      goto retc;
3224
      }
3225
#endif
3226
0
    if (ilim < 0) {
3227
0
      ures = 0x1000000000000000ull - res;
3228
0
      ureslo = 0;
3229
0
      if (reslo) {
3230
0
        ureslo = 0x100000000ull - reslo;
3231
0
        --ures;
3232
0
        }
3233
0
      if (eulp > 0) {
3234
0
        assert(eulp <= 4);
3235
0
        sulp = (ulp << (eulp - 1)) - rb;
3236
0
        if (res <= ures) {
3237
0
          if (res < sulp) {
3238
0
            if (res+rb < ures-rb)
3239
0
              goto retc;
3240
0
            }
3241
0
          }
3242
0
        else if (ures < sulp) {
3243
0
          if (res-rb > ures+rb)
3244
0
            goto Roundup;
3245
0
          }
3246
0
        goto Fast_failed1;
3247
0
        }
3248
0
      else {
3249
0
        zb = -(1ull << (eulp + 60));
3250
0
        if (!(zb & (res + rb))) {
3251
0
          sres = (res - rb) << (1 - eulp);
3252
0
          if (sres < ulp && (!spec_case || 2*sres < ulp)) {
3253
0
            sres = res << (1 - eulp);
3254
0
            if ((j = eulp + 31) > 0)
3255
0
              sres += (rblo + reslo) >> j;
3256
0
            else
3257
0
              sres += (rblo + reslo) << -j;
3258
0
            if (sres + (rb << (1 - eulp)) >= ulp)
3259
0
              goto Fast_failed1;
3260
0
            if (sres >= ulp)
3261
0
              goto more96;
3262
0
            if (ures < res
3263
0
            || (ures == res && ureslo < reslo)) {
3264
0
              if (ures + rb >= res - rb)
3265
0
                goto Fast_failed1;
3266
0
              goto Roundup;
3267
0
              }
3268
0
            if (ures - rb <= res + rb)
3269
0
              goto Fast_failed1;
3270
0
            goto retc;
3271
0
            }
3272
0
          }
3273
0
        if (!(zb & ures) && (ures-rb) << (1 - eulp) < ulp) {
3274
0
          if ((ures + rb) << (2 - eulp) < ulp)
3275
0
            goto Roundup;
3276
0
          goto Fast_failed1;
3277
0
          }
3278
0
        }
3279
0
      }
3280
0
    else if (i == ilim) {
3281
0
      ures = 0x1000000000000000ull - res;
3282
0
      sres = ureslo = 0;
3283
0
      if (reslo) {
3284
0
        ureslo = 0x100000000ull - reslo;
3285
0
        --ures;
3286
0
        sres = (reslo + rblo) >> 31;
3287
0
        }
3288
0
      sres += 2*rb;
3289
0
      if (ures <= res) {
3290
0
        if (ures <=sres || res - ures <= sres)
3291
0
          goto Fast_failed1;
3292
#ifdef Honor_FLT_ROUNDS
3293
        if (Rounding == 0)
3294
          goto retc;
3295
#endif
3296
0
        goto Roundup;
3297
0
        }
3298
0
      if (res <= sres || ures - res <= sres)
3299
0
        goto Fast_failed1;
3300
#ifdef Honor_FLT_ROUNDS
3301
      if (Rounding == 2)
3302
        goto Roundup;
3303
#endif
3304
0
      goto retc;
3305
0
      }
3306
0
 more96:
3307
0
    rblo *= 10;
3308
0
    rb = 10*rb + (rblo >> 32);
3309
0
    rblo &= 0xffffffffull;
3310
0
    if (rb >= 0x1000000000000000ull)
3311
0
      goto Fast_failed1;
3312
0
    reslo *= 10;
3313
0
    res = 10*res + (reslo >> 32);
3314
0
    reslo &= 0xffffffffull;
3315
0
    ulp *= 5;
3316
0
    if (ulp & 0x8000000000000000ull) {
3317
0
      eulp += 4;
3318
0
      ulp >>= 3;
3319
0
      }
3320
0
    else {
3321
0
      eulp += 3;
3322
0
      ulp >>= 2;
3323
0
      }
3324
0
    }
3325
0
 Fast_failed1:
3326
0
  Debug(++dtoa_stats[6]);
3327
0
  S = mhi = mlo = 0;
3328
0
#ifdef USE_BF96
3329
0
  b = d2b(&u, &be, &bbits MTb);
3330
0
#endif
3331
0
  s = buf;
3332
0
  i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
3333
0
  i -= Bias;
3334
0
  if (ulpadj)
3335
0
    i -= ulpadj - 1;
3336
0
  j = bbits - i - 1;
3337
0
  if (j >= 0) {
3338
0
    b2 = 0;
3339
0
    s2 = j;
3340
0
    }
3341
0
  else {
3342
0
    b2 = -j;
3343
0
    s2 = 0;
3344
0
    }
3345
0
  if (k >= 0) {
3346
0
    b5 = 0;
3347
0
    s5 = k;
3348
0
    s2 += k;
3349
0
    }
3350
0
  else {
3351
0
    b2 -= k;
3352
0
    b5 = -k;
3353
0
    s5 = 0;
3354
0
    }
3355
0
#endif /*}*/
3356
3357
#ifdef Honor_FLT_ROUNDS
3358
  if (mode > 1 && Rounding != 1)
3359
    leftright = 0;
3360
#endif
3361
3362
#ifndef USE_BF96 /*{*/
3363
  if (ilim >= 0 && ilim <= Quick_max && try_quick) {
3364
3365
    /* Try to get by with floating-point arithmetic. */
3366
3367
    i = 0;
3368
    dval(&d2) = dval(&u);
3369
    j1 = -(k0 = k);
3370
    ilim0 = ilim;
3371
    ieps = 2; /* conservative */
3372
    if (k > 0) {
3373
      ds = tens[k&0xf];
3374
      j = k >> 4;
3375
      if (j & Bletch) {
3376
        /* prevent overflows */
3377
        j &= Bletch - 1;
3378
        dval(&u) /= bigtens[n_bigtens-1];
3379
        ieps++;
3380
        }
3381
      for(; j; j >>= 1, i++)
3382
        if (j & 1) {
3383
          ieps++;
3384
          ds *= bigtens[i];
3385
          }
3386
      dval(&u) /= ds;
3387
      }
3388
    else if (j1 > 0) {
3389
      dval(&u) *= tens[j1 & 0xf];
3390
      for(j = j1 >> 4; j; j >>= 1, i++)
3391
        if (j & 1) {
3392
          ieps++;
3393
          dval(&u) *= bigtens[i];
3394
          }
3395
      }
3396
    if (k_check && dval(&u) < 1. && ilim > 0) {
3397
      if (ilim1 <= 0)
3398
        goto fast_failed;
3399
      ilim = ilim1;
3400
      k--;
3401
      dval(&u) *= 10.;
3402
      ieps++;
3403
      }
3404
    dval(&eps) = ieps*dval(&u) + 7.;
3405
    word0(&eps) -= (P-1)*Exp_msk1;
3406
    if (ilim == 0) {
3407
      S = mhi = 0;
3408
      dval(&u) -= 5.;
3409
      if (dval(&u) > dval(&eps))
3410
        goto one_digit;
3411
      if (dval(&u) < -dval(&eps))
3412
        goto no_digits;
3413
      goto fast_failed;
3414
      }
3415
#ifndef No_leftright
3416
    if (leftright) {
3417
      /* Use Steele & White method of only
3418
       * generating digits needed.
3419
       */
3420
      dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
3421
#ifdef IEEE_Arith
3422
      if (j1 >= 307) {
3423
        eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */
3424
        word0(&eps1) -= Exp_msk1 * (Bias+P-1);
3425
        dval(&eps1) *= tens[j1 & 0xf];
3426
        for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++)
3427
          if (j & 1)
3428
            dval(&eps1) *= bigtens[i];
3429
        if (eps.d < eps1.d)
3430
          eps.d = eps1.d;
3431
        if (10. - u.d < 10.*eps.d && eps.d < 1.) {
3432
          /* eps.d < 1. excludes trouble with the tiniest denormal */
3433
          *s++ = '1';
3434
          ++k;
3435
          goto ret1;
3436
          }
3437
        }
3438
#endif
3439
      for(i = 0;;) {
3440
        L = dval(&u);
3441
        dval(&u) -= L;
3442
        *s++ = '0' + (int)L;
3443
        if (1. - dval(&u) < dval(&eps))
3444
          goto bump_up;
3445
        if (dval(&u) < dval(&eps))
3446
          goto retc;
3447
        if (++i >= ilim)
3448
          break;
3449
        dval(&eps) *= 10.;
3450
        dval(&u) *= 10.;
3451
        }
3452
      }
3453
    else {
3454
#endif
3455
      /* Generate ilim digits, then fix them up. */
3456
      dval(&eps) *= tens[ilim-1];
3457
      for(i = 1;; i++, dval(&u) *= 10.) {
3458
        L = (Long)(dval(&u));
3459
        if (!(dval(&u) -= L))
3460
          ilim = i;
3461
        *s++ = '0' + (int)L;
3462
        if (i == ilim) {
3463
          if (dval(&u) > 0.5 + dval(&eps))
3464
            goto bump_up;
3465
          else if (dval(&u) < 0.5 - dval(&eps))
3466
            goto retc;
3467
          break;
3468
          }
3469
        }
3470
#ifndef No_leftright
3471
      }
3472
#endif
3473
 fast_failed:
3474
    s = buf;
3475
    dval(&u) = dval(&d2);
3476
    k = k0;
3477
    ilim = ilim0;
3478
    }
3479
3480
  /* Do we have a "small" integer? */
3481
3482
  if (be >= 0 && k <= Int_max) {
3483
    /* Yes. */
3484
    ds = tens[k];
3485
    if (ndigits < 0 && ilim <= 0) {
3486
      S = mhi = 0;
3487
      if (ilim < 0 || dval(&u) <= 5*ds)
3488
        goto no_digits;
3489
      goto one_digit;
3490
      }
3491
    for(i = 1;; i++, dval(&u) *= 10.) {
3492
      L = (Long)(dval(&u) / ds);
3493
      dval(&u) -= L*ds;
3494
#ifdef Check_FLT_ROUNDS
3495
      /* If FLT_ROUNDS == 2, L will usually be high by 1 */
3496
      if (dval(&u) < 0) {
3497
        L--;
3498
        dval(&u) += ds;
3499
        }
3500
#endif
3501
      *s++ = '0' + (int)L;
3502
      if (!dval(&u)) {
3503
#ifdef SET_INEXACT
3504
        inexact = 0;
3505
#endif
3506
        break;
3507
        }
3508
      if (i == ilim) {
3509
#ifdef Honor_FLT_ROUNDS
3510
        if (mode > 1)
3511
        switch(Rounding) {
3512
          case 0: goto retc;
3513
          case 2: goto bump_up;
3514
          }
3515
#endif
3516
        dval(&u) += dval(&u);
3517
#ifdef ROUND_BIASED
3518
        if (dval(&u) >= ds)
3519
#else
3520
        if (dval(&u) > ds || (dval(&u) == ds && L & 1))
3521
#endif
3522
          {
3523
 bump_up:
3524
          while(*--s == '9')
3525
            if (s == buf) {
3526
              k++;
3527
              *s = '0';
3528
              break;
3529
              }
3530
          ++*s++;
3531
          }
3532
        break;
3533
        }
3534
      }
3535
    goto retc;
3536
    }
3537
3538
#endif /*}*/
3539
0
  m2 = b2;
3540
0
  m5 = b5;
3541
0
  mhi = mlo = 0;
3542
0
  if (leftright) {
3543
0
    i =
3544
0
#ifndef Sudden_Underflow
3545
0
      denorm ? be + (Bias + (P-1) - 1 + 1) :
3546
0
#endif
3547
#ifdef IBM
3548
      1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
3549
#else
3550
0
      1 + P - bbits;
3551
0
#endif
3552
0
    b2 += i;
3553
0
    s2 += i;
3554
0
    mhi = i2b(1 MTb);
3555
0
    }
3556
0
  if (m2 > 0 && s2 > 0) {
3557
0
    i = m2 < s2 ? m2 : s2;
3558
0
    b2 -= i;
3559
0
    m2 -= i;
3560
0
    s2 -= i;
3561
0
    }
3562
0
  if (b5 > 0) {
3563
0
    if (leftright) {
3564
0
      if (m5 > 0) {
3565
0
        mhi = pow5mult(mhi, m5 MTb);
3566
0
        b1 = mult(mhi, b MTb);
3567
0
        Bfree(b MTb);
3568
0
        b = b1;
3569
0
        }
3570
0
      if ((j = b5 - m5))
3571
0
        b = pow5mult(b, j MTb);
3572
0
      }
3573
0
    else
3574
0
      b = pow5mult(b, b5 MTb);
3575
0
    }
3576
0
  S = i2b(1 MTb);
3577
0
  if (s5 > 0)
3578
0
    S = pow5mult(S, s5 MTb);
3579
3580
0
  if (spec_case) {
3581
0
    b2 += Log2P;
3582
0
    s2 += Log2P;
3583
0
    }
3584
3585
  /* Arrange for convenient computation of quotients:
3586
   * shift left if necessary so divisor has 4 leading 0 bits.
3587
   *
3588
   * Perhaps we should just compute leading 28 bits of S once
3589
   * and for all and pass them and a shift to quorem, so it
3590
   * can do shifts and ors to compute the numerator for q.
3591
   */
3592
0
  i = dshift(S, s2);
3593
0
  b2 += i;
3594
0
  m2 += i;
3595
0
  s2 += i;
3596
0
  if (b2 > 0)
3597
0
    b = lshift(b, b2 MTb);
3598
0
  if (s2 > 0)
3599
0
    S = lshift(S, s2 MTb);
3600
#ifndef USE_BF96
3601
  if (k_check) {
3602
    if (cmp(b,S) < 0) {
3603
      k--;
3604
      b = multadd(b, 10, 0 MTb);  /* we botched the k estimate */
3605
      if (leftright)
3606
        mhi = multadd(mhi, 10, 0 MTb);
3607
      ilim = ilim1;
3608
      }
3609
    }
3610
#endif
3611
0
  if (ilim <= 0 && (mode == 3 || mode == 5)) {
3612
0
    if (ilim < 0 || cmp(b,S = multadd(S,5,0 MTb)) <= 0) {
3613
      /* no digits, fcvt style */
3614
0
 no_digits:
3615
0
      k = -1 - ndigits;
3616
0
      goto ret;
3617
0
      }
3618
0
 one_digit:
3619
0
    *s++ = '1';
3620
0
    ++k;
3621
0
    goto ret;
3622
0
    }
3623
0
  if (leftright) {
3624
0
    if (m2 > 0)
3625
0
      mhi = lshift(mhi, m2 MTb);
3626
3627
    /* Compute mlo -- check for special case
3628
     * that d is a normalized power of 2.
3629
     */
3630
3631
0
    mlo = mhi;
3632
0
    if (spec_case) {
3633
0
      mhi = Balloc(mhi->k MTb);
3634
0
      Bcopy(mhi, mlo);
3635
0
      mhi = lshift(mhi, Log2P MTb);
3636
0
      }
3637
3638
0
    for(i = 1;;i++) {
3639
0
      dig = quorem(b,S) + '0';
3640
      /* Do we yet have the shortest decimal string
3641
       * that will round to d?
3642
       */
3643
0
      j = cmp(b, mlo);
3644
0
      delta = diff(S, mhi MTb);
3645
0
      j1 = delta->sign ? 1 : cmp(b, delta);
3646
0
      Bfree(delta MTb);
3647
0
#ifndef ROUND_BIASED
3648
0
      if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
3649
#ifdef Honor_FLT_ROUNDS
3650
        && (mode <= 1 || Rounding >= 1)
3651
#endif
3652
0
                   ) {
3653
0
        if (dig == '9')
3654
0
          goto round_9_up;
3655
0
        if (j > 0)
3656
0
          dig++;
3657
#ifdef SET_INEXACT
3658
        else if (!b->x[0] && b->wds <= 1)
3659
          inexact = 0;
3660
#endif
3661
0
        *s++ = dig;
3662
0
        goto ret;
3663
0
        }
3664
0
#endif
3665
0
      if (j < 0 || (j == 0 && mode != 1
3666
0
#ifndef ROUND_BIASED
3667
0
              && !(word1(&u) & 1)
3668
0
#endif
3669
0
          )) {
3670
0
        if (!b->x[0] && b->wds <= 1) {
3671
#ifdef SET_INEXACT
3672
          inexact = 0;
3673
#endif
3674
0
          goto accept_dig;
3675
0
          }
3676
#ifdef Honor_FLT_ROUNDS
3677
        if (mode > 1)
3678
         switch(Rounding) {
3679
          case 0: goto accept_dig;
3680
          case 2: goto keep_dig;
3681
          }
3682
#endif /*Honor_FLT_ROUNDS*/
3683
0
        if (j1 > 0) {
3684
0
          b = lshift(b, 1 MTb);
3685
0
          j1 = cmp(b, S);
3686
#ifdef ROUND_BIASED
3687
          if (j1 >= 0 /*)*/
3688
#else
3689
0
          if ((j1 > 0 || (j1 == 0 && dig & 1))
3690
0
#endif
3691
0
          && dig++ == '9')
3692
0
            goto round_9_up;
3693
0
          }
3694
0
 accept_dig:
3695
0
        *s++ = dig;
3696
0
        goto ret;
3697
0
        }
3698
0
      if (j1 > 0) {
3699
#ifdef Honor_FLT_ROUNDS
3700
        if (!Rounding && mode > 1)
3701
          goto accept_dig;
3702
#endif
3703
0
        if (dig == '9') { /* possible if i == 1 */
3704
0
 round_9_up:
3705
0
          *s++ = '9';
3706
0
          goto roundoff;
3707
0
          }
3708
0
        *s++ = dig + 1;
3709
0
        goto ret;
3710
0
        }
3711
#ifdef Honor_FLT_ROUNDS
3712
 keep_dig:
3713
#endif
3714
0
      *s++ = dig;
3715
0
      if (i == ilim)
3716
0
        break;
3717
0
      b = multadd(b, 10, 0 MTb);
3718
0
      if (mlo == mhi)
3719
0
        mlo = mhi = multadd(mhi, 10, 0 MTb);
3720
0
      else {
3721
0
        mlo = multadd(mlo, 10, 0 MTb);
3722
0
        mhi = multadd(mhi, 10, 0 MTb);
3723
0
        }
3724
0
      }
3725
0
    }
3726
0
  else
3727
0
    for(i = 1;; i++) {
3728
0
      dig = quorem(b,S) + '0';
3729
0
      *s++ = dig;
3730
0
      if (!b->x[0] && b->wds <= 1) {
3731
#ifdef SET_INEXACT
3732
        inexact = 0;
3733
#endif
3734
0
        goto ret;
3735
0
        }
3736
0
      if (i >= ilim)
3737
0
        break;
3738
0
      b = multadd(b, 10, 0 MTb);
3739
0
      }
3740
3741
  /* Round off last digit */
3742
3743
#ifdef Honor_FLT_ROUNDS
3744
  if (mode > 1)
3745
    switch(Rounding) {
3746
      case 0: goto ret;
3747
      case 2: goto roundoff;
3748
      }
3749
#endif
3750
0
  b = lshift(b, 1 MTb);
3751
0
  j = cmp(b, S);
3752
#ifdef ROUND_BIASED
3753
  if (j >= 0)
3754
#else
3755
0
  if (j > 0 || (j == 0 && dig & 1))
3756
0
#endif
3757
0
    {
3758
0
 roundoff:
3759
0
    while(*--s == '9')
3760
0
      if (s == buf) {
3761
0
        k++;
3762
0
        *s++ = '1';
3763
0
        goto ret;
3764
0
        }
3765
0
    ++*s++;
3766
0
    }
3767
0
 ret:
3768
0
  Bfree(S MTb);
3769
0
  if (mhi) {
3770
0
    if (mlo && mlo != mhi)
3771
0
      Bfree(mlo MTb);
3772
0
    Bfree(mhi MTb);
3773
0
    }
3774
0
 retc:
3775
0
  while(s > buf && s[-1] == '0')
3776
0
    --s;
3777
0
 ret1:
3778
0
  if (b)
3779
0
    Bfree(b MTb);
3780
0
  *s = 0;
3781
0
  *decpt = k + 1;
3782
0
  if (rve)
3783
0
    *rve = s;
3784
#ifdef SET_INEXACT
3785
  if (inexact) {
3786
    if (!oldinexact) {
3787
      word0(&u) = Exp_1 + (70 << Exp_shift);
3788
      word1(&u) = 0;
3789
      dval(&u) += 1.;
3790
      }
3791
    }
3792
  else if (!oldinexact)
3793
    clear_inexact();
3794
#endif
3795
0
  return buf;
3796
0
  }
3797
3798
 char *
3799
dtoa(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)
3800
0
{
3801
  /*  Sufficient space is allocated to the return value
3802
    to hold the suppressed trailing zeros.
3803
    See dtoa_r() above for details on the other arguments.
3804
  */
3805
0
#ifndef MULTIPLE_THREADS
3806
0
  if (dtoa_result)
3807
0
    freedtoa(dtoa_result);
3808
0
#endif
3809
0
  return dtoa_r(dd, mode, ndigits, decpt, sign, rve, 0, 0);
3810
0
  }
3811
3812
3813
 char *
3814
dtoa_g_fmt(register char *b, double x)
3815
0
{
3816
0
        register int i, k;
3817
0
        register char *s;
3818
0
        int decpt, j, sign;
3819
0
        char *b0, *s0, *se;
3820
3821
0
        b0 = b;
3822
#ifdef IGNORE_ZERO_SIGN
3823
        if (!x) {
3824
                *b++ = '0';
3825
                *b = 0;
3826
                goto done;
3827
                }
3828
#endif
3829
0
        s = s0 = dtoa(x, 0, 0, &decpt, &sign, &se);
3830
0
        if (sign)
3831
0
                *b++ = '-';
3832
0
        if (decpt == 9999) /* Infinity or Nan */ {
3833
0
                while((*b++ = *s++));
3834
0
                goto done0;
3835
0
                }
3836
0
        if (decpt <= -4 || decpt > se - s + 5) {
3837
0
                *b++ = *s++;
3838
0
                if (*s) {
3839
0
                        *b++ = '.';
3840
0
                        while((*b = *s++))
3841
0
                                b++;
3842
0
                        }
3843
0
                *b++ = 'e';
3844
                /* sprintf(b, "%+.2d", decpt - 1); */
3845
0
                if (--decpt < 0) {
3846
0
                        *b++ = '-';
3847
0
                        decpt = -decpt;
3848
0
                        }
3849
0
                else
3850
0
                        *b++ = '+';
3851
0
                for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10);
3852
0
                for(;;) {
3853
0
                        i = decpt / k;
3854
0
                        *b++ = i + '0';
3855
0
                        if (--j <= 0)
3856
0
                                break;
3857
0
                        decpt -= i*k;
3858
0
                        decpt *= 10;
3859
0
                        }
3860
0
                *b = 0;
3861
0
                }
3862
0
        else if (decpt <= 0) {
3863
0
                *b++ = '0'; // Add leading zero, not in dmg's original
3864
0
                *b++ = '.';
3865
0
                for(; decpt < 0; decpt++)
3866
0
                        *b++ = '0';
3867
0
                while((*b++ = *s++));
3868
0
                }
3869
0
        else {
3870
0
                while((*b = *s++)) {
3871
0
                        b++;
3872
0
                        if (--decpt == 0 && *s)
3873
0
                                *b++ = '.';
3874
0
                        }
3875
0
                for(; decpt > 0; decpt--)
3876
0
                        *b++ = '0';
3877
0
                *b = 0;
3878
0
                }
3879
0
 done0:
3880
0
        freedtoa(s0);
3881
#ifdef IGNORE_ZERO_SIGN
3882
 done:
3883
#endif
3884
0
        return b0;
3885
0
        }
3886
3887
3888
#ifdef __cplusplus
3889
}
3890
#endif