Coverage Report

Created: 2026-05-12 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/jansson/src/dtoa.c
Line
Count
Source
1
// clang-format off
2
/****************************************************************
3
 *
4
 * The author of this software is David M. Gay.
5
 *
6
 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
7
 *
8
 * Permission to use, copy, modify, and distribute this software for any
9
 * purpose without fee is hereby granted, provided that this entire notice
10
 * is included in all copies of any software which is or includes a copy
11
 * or modification of this software and in all copies of the supporting
12
 * documentation for such software.
13
 *
14
 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
15
 * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
16
 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
17
 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
18
 *
19
 ***************************************************************/
20
21
/* Please send bug reports to David M. Gay (dmg at acm dot org,
22
 * with " at " changed at "@" and " dot " changed to ".").  */
23
24
/* On a machine with IEEE extended-precision registers, it is
25
 * necessary to specify double-precision (53-bit) rounding precision
26
 * before invoking strtod or dtoa.  If the machine uses (the equivalent
27
 * of) Intel 80x87 arithmetic, the call
28
 *  _control87(PC_53, MCW_PC);
29
 * does this with many compilers.  Whether this or another call is
30
 * appropriate depends on the compiler; for this to work, it may be
31
 * necessary to #include "float.h" or another system-dependent header
32
 * file.
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
#include "jansson_private.h"
67
68
#ifdef WORDS_BIGENDIAN
69
#  define IEEE_MC68k 1
70
#else
71
#  define IEEE_8087 1
72
#endif
73
74
#if defined(JSON_INTEGER_IS_LONG_LONG) && (JSON_INTEGER_IS_LONG_LONG == 0)
75
#  define NO_LONG_LONG 1
76
#endif
77
78
0
#define MALLOC jsonp_malloc
79
0
#define FREE jsonp_free
80
81
/*
82
 * #define IEEE_8087 for IEEE-arithmetic machines where the least
83
 *  significant byte has the lowest address.
84
 * #define IEEE_MC68k for IEEE-arithmetic machines where the most
85
 *  significant byte has the lowest address.
86
 * #define Long int on machines with 32-bit ints and 64-bit longs.
87
 * #define IBM for IBM mainframe-style floating-point arithmetic.
88
 * #define VAX for VAX-style floating-point arithmetic (D_floating).
89
 * #define No_leftright to omit left-right logic in fast floating-point
90
 *  computation of dtoa.  This will cause dtoa modes 4 and 5 to be
91
 *  treated the same as modes 2 and 3 for some inputs.
92
 * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
93
 *  and strtod and dtoa should round accordingly.  Unless Trust_FLT_ROUNDS
94
 *  is also #defined, fegetround() will be queried for the rounding mode.
95
 *  Note that both FLT_ROUNDS and fegetround() are specified by the C99
96
 *  standard (and are specified to be consistent, with fesetround()
97
 *  affecting the value of FLT_ROUNDS), but that some (Linux) systems
98
 *  do not work correctly in this regard, so using fegetround() is more
99
 *  portable than using FLT_ROUNDS directly.
100
 * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
101
 *  and Honor_FLT_ROUNDS is not #defined.
102
 * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
103
 *  that use extended-precision instructions to compute rounded
104
 *  products and quotients) with IBM.
105
 * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic
106
 *  that rounds toward +Infinity.
107
 * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased
108
 *  rounding when the underlying floating-point arithmetic uses
109
 *  unbiased rounding.  This prevent using ordinary floating-point
110
 *  arithmetic when the result could be computed with one rounding error.
111
 * #define Inaccurate_Divide for IEEE-format with correctly rounded
112
 *  products but inaccurate quotients, e.g., for Intel i860.
113
 * #define NO_LONG_LONG on machines that do not have a "long long"
114
 *  integer type (of >= 64 bits).  On such machines, you can
115
 *  #define Just_16 to store 16 bits per 32-bit Long when doing
116
 *  high-precision integer arithmetic.  Whether this speeds things
117
 *  up or slows things down depends on the machine and the number
118
 *  being converted.  If long long is available and the name is
119
 *  something other than "long long", #define Llong to be the name,
120
 *  and if "unsigned Llong" does not work as an unsigned version of
121
 *  Llong, #define #ULLong to be the corresponding unsigned type.
122
 * #define Bad_float_h if your system lacks a float.h or if it does not
123
 *  define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
124
 *  FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
125
 * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
126
 *  if memory is available and otherwise does something you deem
127
 *  appropriate.  If MALLOC is undefined, malloc will be invoked
128
 *  directly -- and assumed always to succeed.  Similarly, if you
129
 *  want something other than the system's free() to be called to
130
 *  recycle memory acquired from MALLOC, #define FREE to be the
131
 *  name of the alternate routine.  (FREE or free is only called in
132
 *  pathological cases, e.g., in a dtoa call after a dtoa return in
133
 *  mode 3 with thousands of digits requested.)
134
 * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
135
 *  memory allocations from a private pool of memory when possible.
136
 *  When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,
137
 *  unless #defined to be a different length.  This default length
138
 *  suffices to get rid of MALLOC calls except for unusual cases,
139
 *  such as decimal-to-binary conversion of a very long string of
140
 *  digits.  The longest string dtoa can return is about 751 bytes
141
 *  long.  For conversions by strtod of strings of 800 digits and
142
 *  all dtoa conversions in single-threaded executions with 8-byte
143
 *  pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte
144
 *  pointers, PRIVATE_MEM >= 7112 appears adequate.
145
 * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
146
 *  #defined automatically on IEEE systems.  On such systems,
147
 *  when INFNAN_CHECK is #defined, strtod checks
148
 *  for Infinity and NaN (case insensitively).  On some systems
149
 *  (e.g., some HP systems), it may be necessary to #define NAN_WORD0
150
 *  appropriately -- to the most significant word of a quiet NaN.
151
 *  (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
152
 *  When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
153
 *  strtod also accepts (case insensitively) strings of the form
154
 *  NaN(x), where x is a string of hexadecimal digits and spaces;
155
 *  if there is only one string of hexadecimal digits, it is taken
156
 *  for the 52 fraction bits of the resulting NaN; if there are two
157
 *  or more strings of hex digits, the first is for the high 20 bits,
158
 *  the second and subsequent for the low 32 bits, with intervening
159
 *  white space ignored; but if this results in none of the 52
160
 *  fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0
161
 *  and NAN_WORD1 are used instead.
162
 * #define MULTIPLE_THREADS if the system offers preemptively scheduled
163
 *  multiple threads.  In this case, you must provide (or suitably
164
 *  #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
165
 *  by FREE_DTOA_LOCK(n) for n = 0 or 1.  (The second lock, accessed
166
 *  in pow5mult, ensures lazy evaluation of only one copy of high
167
 *  powers of 5; omitting this lock would introduce a small
168
 *  probability of wasting memory, but would otherwise be harmless.)
169
 *  You must also invoke freedtoa(s) to free the value s returned by
170
 *  dtoa.  You may do so whether or not MULTIPLE_THREADS is #defined.
171
172
 *  When MULTIPLE_THREADS is #defined, this source file provides
173
 *    void set_max_dtoa_threads(unsigned int n);
174
 *  and expects
175
 *    unsigned int dtoa_get_threadno(void);
176
 *  to be available (possibly provided by
177
 *    #define dtoa_get_threadno omp_get_thread_num
178
 *  if OpenMP is in use or by
179
 *    #define dtoa_get_threadno pthread_self
180
 *  if Pthreads is in use), to return the current thread number.
181
 *  If set_max_dtoa_threads(n) was called and the current thread
182
 *  number is k with k < n, then calls on ACQUIRE_DTOA_LOCK(...) and
183
 *  FREE_DTOA_LOCK(...) are avoided; instead each thread with thread
184
 *  number < n has a separate copy of relevant data structures.
185
 *  After set_max_dtoa_threads(n), a call set_max_dtoa_threads(m)
186
 *  with m <= n has has no effect, but a call with m > n is honored.
187
 *  Such a call invokes REALLOC (assumed to be "realloc" if REALLOC
188
 *  is not #defined) to extend the size of the relevant array.
189
190
 * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that
191
 *  avoids underflows on inputs whose result does not underflow.
192
 *  If you #define NO_IEEE_Scale on a machine that uses IEEE-format
193
 *  floating-point numbers and flushes underflows to zero rather
194
 *  than implementing gradual underflow, then you must also #define
195
 *  Sudden_Underflow.
196
 * #define USE_LOCALE to use the current locale's decimal_point value.
197
 * #define SET_INEXACT if IEEE arithmetic is being used and extra
198
 *  computation should be done to set the inexact flag when the
199
 *  result is inexact and avoid setting inexact when the result
200
 *  is exact.  In this case, dtoa.c must be compiled in
201
 *  an environment, perhaps provided by #include "dtoa.c" in a
202
 *  suitable wrapper, that defines two functions,
203
 *    int get_inexact(void);
204
 *    void clear_inexact(void);
205
 *  such that get_inexact() returns a nonzero value if the
206
 *  inexact bit is already set, and clear_inexact() sets the
207
 *  inexact bit to 0.  When SET_INEXACT is #defined, strtod
208
 *  also does extra computations to set the underflow and overflow
209
 *  flags when appropriate (i.e., when the result is tiny and
210
 *  inexact or when it is a numeric value rounded to +-infinity).
211
 * #define NO_ERRNO if strtod should not assign errno = ERANGE when
212
 *  the result overflows to +-Infinity or underflows to 0.
213
 *  When errno should be assigned, under seemingly rare conditions
214
 *  it may be necessary to define Set_errno(x) suitably, e.g., in
215
 *  a local errno.h, such as
216
 *    #include <errno.h>
217
 *    #define Set_errno(x) _set_errno(x)
218
 * #define NO_HEX_FP to omit recognition of hexadecimal floating-point
219
 *  values by strtod.
220
 * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now)
221
 *  to disable logic for "fast" testing of very long input strings
222
 *  to strtod.  This testing proceeds by initially truncating the
223
 *  input string, then if necessary comparing the whole string with
224
 *  a decimal expansion to decide close cases. This logic is only
225
 *  used for input more than STRTOD_DIGLIM digits long (default 40).
226
 */
227
228
#ifndef Long
229
0
#define Long int
230
#endif
231
#ifndef ULong
232
typedef unsigned Long ULong;
233
#endif
234
235
#ifdef DEBUG
236
#include <assert.h>
237
#include "stdio.h"
238
#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
239
#define Debug(x) x
240
int dtoa_stats[7]; /* strtod_{64,96,bigcomp},dtoa_{exact,64,96,bigcomp} */
241
#else
242
#define assert(x) /*nothing*/
243
#define Debug(x) /*nothing*/
244
#endif
245
246
#include "stdlib.h"
247
#include "string.h"
248
249
#ifdef USE_LOCALE
250
#include "locale.h"
251
#endif
252
253
#ifdef Honor_FLT_ROUNDS
254
#ifndef Trust_FLT_ROUNDS
255
#include <fenv.h>
256
#endif
257
#endif
258
259
#ifdef __cplusplus
260
extern "C" {
261
#endif
262
#ifdef MALLOC
263
extern void *MALLOC(size_t);
264
#else
265
#define MALLOC malloc
266
#endif
267
268
#ifdef REALLOC
269
extern void *REALLOC(void*,size_t);
270
#else
271
#define REALLOC realloc
272
#endif
273
274
#ifndef FREE
275
#define FREE free
276
#endif
277
278
#ifdef __cplusplus
279
  }
280
#endif
281
282
#ifndef Omit_Private_Memory
283
#ifndef PRIVATE_MEM
284
26
#define PRIVATE_MEM 2304
285
#endif
286
26
#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
287
static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
288
#endif
289
290
#undef IEEE_Arith
291
#undef Avoid_Underflow
292
#ifdef IEEE_MC68k
293
#define IEEE_Arith
294
#endif
295
#ifdef IEEE_8087
296
#define IEEE_Arith
297
#endif
298
299
#ifdef IEEE_Arith
300
#ifndef NO_INFNAN_CHECK
301
#undef INFNAN_CHECK
302
#define INFNAN_CHECK
303
#endif
304
#else
305
#undef INFNAN_CHECK
306
#define NO_STRTOD_BIGCOMP
307
#endif
308
309
#include "errno.h"
310
311
#ifdef NO_ERRNO /*{*/
312
#undef Set_errno
313
#define Set_errno(x)
314
#else
315
#ifndef Set_errno
316
0
#define Set_errno(x) errno = x
317
#endif
318
#endif /*}*/
319
320
#ifdef Bad_float_h
321
322
#ifdef IEEE_Arith
323
#define DBL_DIG 15
324
#define DBL_MAX_10_EXP 308
325
#define DBL_MAX_EXP 1024
326
#define FLT_RADIX 2
327
#endif /*IEEE_Arith*/
328
329
#ifdef IBM
330
#define DBL_DIG 16
331
#define DBL_MAX_10_EXP 75
332
#define DBL_MAX_EXP 63
333
#define FLT_RADIX 16
334
#define DBL_MAX 7.2370055773322621e+75
335
#endif
336
337
#ifdef VAX
338
#define DBL_DIG 16
339
#define DBL_MAX_10_EXP 38
340
#define DBL_MAX_EXP 127
341
#define FLT_RADIX 2
342
#define DBL_MAX 1.7014118346046923e+38
343
#endif
344
345
#ifndef LONG_MAX
346
#define LONG_MAX 2147483647
347
#endif
348
349
#else /* ifndef Bad_float_h */
350
#include "float.h"
351
#endif /* Bad_float_h */
352
353
#ifndef __MATH_H__
354
#include "math.h"
355
#endif
356
357
#ifdef __cplusplus
358
extern "C" {
359
#endif
360
361
#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
362
Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
363
#endif
364
365
#undef USE_BF96
366
367
#ifdef NO_LONG_LONG /*{{*/
368
#undef ULLong
369
#ifdef Just_16
370
#undef Pack_32
371
/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
372
 * This makes some inner loops simpler and sometimes saves work
373
 * during multiplications, but it often seems to make things slightly
374
 * slower.  Hence the default is now to store 32 bits per Long.
375
 */
376
#endif
377
#else /*}{ long long available */
378
#ifndef Llong
379
#define Llong long long
380
#endif
381
#ifndef ULLong
382
3.80M
#define ULLong unsigned Llong
383
#endif
384
#ifndef NO_BF96 /*{*/
385
#define USE_BF96
386
387
#ifdef SET_INEXACT
388
#define dtoa_divmax 27
389
#else
390
int dtoa_divmax = 2;  /* Permit experimenting: on some systems, 64-bit integer */
391
      /* division is slow enough that we may sometimes want to */
392
      /* avoid using it.   We assume (but do not check) that   */
393
      /* dtoa_divmax <= 27.*/
394
#endif
395
396
typedef struct BF96 {   /* Normalized 96-bit software floating point numbers */
397
  unsigned int b0,b1,b2;  /* b0 = most significant, binary point just to its left */
398
  int e;      /* number represented = b * 2^e, with .5 <= b < 1 */
399
  } BF96;
400
401
 static BF96 pten[667] = {
402
  { 0xeef453d6, 0x923bd65a, 0x113faa29, -1136 },
403
  { 0x9558b466, 0x1b6565f8, 0x4ac7ca59, -1132 },
404
  { 0xbaaee17f, 0xa23ebf76, 0x5d79bcf0, -1129 },
405
  { 0xe95a99df, 0x8ace6f53, 0xf4d82c2c, -1126 },
406
  { 0x91d8a02b, 0xb6c10594, 0x79071b9b, -1122 },
407
  { 0xb64ec836, 0xa47146f9, 0x9748e282, -1119 },
408
  { 0xe3e27a44, 0x4d8d98b7, 0xfd1b1b23, -1116 },
409
  { 0x8e6d8c6a, 0xb0787f72, 0xfe30f0f5, -1112 },
410
  { 0xb208ef85, 0x5c969f4f, 0xbdbd2d33, -1109 },
411
  { 0xde8b2b66, 0xb3bc4723, 0xad2c7880, -1106 },
412
  { 0x8b16fb20, 0x3055ac76, 0x4c3bcb50, -1102 },
413
  { 0xaddcb9e8, 0x3c6b1793, 0xdf4abe24, -1099 },
414
  { 0xd953e862, 0x4b85dd78, 0xd71d6dad, -1096 },
415
  { 0x87d4713d, 0x6f33aa6b, 0x8672648c, -1092 },
416
  { 0xa9c98d8c, 0xcb009506, 0x680efdaf, -1089 },
417
  { 0xd43bf0ef, 0xfdc0ba48, 0x0212bd1b, -1086 },
418
  { 0x84a57695, 0xfe98746d, 0x014bb630, -1082 },
419
  { 0xa5ced43b, 0x7e3e9188, 0x419ea3bd, -1079 },
420
  { 0xcf42894a, 0x5dce35ea, 0x52064cac, -1076 },
421
  { 0x818995ce, 0x7aa0e1b2, 0x7343efeb, -1072 },
422
  { 0xa1ebfb42, 0x19491a1f, 0x1014ebe6, -1069 },
423
  { 0xca66fa12, 0x9f9b60a6, 0xd41a26e0, -1066 },
424
  { 0xfd00b897, 0x478238d0, 0x8920b098, -1063 },
425
  { 0x9e20735e, 0x8cb16382, 0x55b46e5f, -1059 },
426
  { 0xc5a89036, 0x2fddbc62, 0xeb2189f7, -1056 },
427
  { 0xf712b443, 0xbbd52b7b, 0xa5e9ec75, -1053 },
428
  { 0x9a6bb0aa, 0x55653b2d, 0x47b233c9, -1049 },
429
  { 0xc1069cd4, 0xeabe89f8, 0x999ec0bb, -1046 },
430
  { 0xf148440a, 0x256e2c76, 0xc00670ea, -1043 },
431
  { 0x96cd2a86, 0x5764dbca, 0x38040692, -1039 },
432
  { 0xbc807527, 0xed3e12bc, 0xc6050837, -1036 },
433
  { 0xeba09271, 0xe88d976b, 0xf7864a44, -1033 },
434
  { 0x93445b87, 0x31587ea3, 0x7ab3ee6a, -1029 },
435
  { 0xb8157268, 0xfdae9e4c, 0x5960ea05, -1026 },
436
  { 0xe61acf03, 0x3d1a45df, 0x6fb92487, -1023 },
437
  { 0x8fd0c162, 0x06306bab, 0xa5d3b6d4, -1019 },
438
  { 0xb3c4f1ba, 0x87bc8696, 0x8f48a489, -1016 },
439
  { 0xe0b62e29, 0x29aba83c, 0x331acdab, -1013 },
440
  { 0x8c71dcd9, 0xba0b4925, 0x9ff0c08b, -1009 },
441
  { 0xaf8e5410, 0x288e1b6f, 0x07ecf0ae, -1006 },
442
  { 0xdb71e914, 0x32b1a24a, 0xc9e82cd9, -1003 },
443
  { 0x892731ac, 0x9faf056e, 0xbe311c08,  -999 },
444
  { 0xab70fe17, 0xc79ac6ca, 0x6dbd630a,  -996 },
445
  { 0xd64d3d9d, 0xb981787d, 0x092cbbcc,  -993 },
446
  { 0x85f04682, 0x93f0eb4e, 0x25bbf560,  -989 },
447
  { 0xa76c5823, 0x38ed2621, 0xaf2af2b8,  -986 },
448
  { 0xd1476e2c, 0x07286faa, 0x1af5af66,  -983 },
449
  { 0x82cca4db, 0x847945ca, 0x50d98d9f,  -979 },
450
  { 0xa37fce12, 0x6597973c, 0xe50ff107,  -976 },
451
  { 0xcc5fc196, 0xfefd7d0c, 0x1e53ed49,  -973 },
452
  { 0xff77b1fc, 0xbebcdc4f, 0x25e8e89c,  -970 },
453
  { 0x9faacf3d, 0xf73609b1, 0x77b19161,  -966 },
454
  { 0xc795830d, 0x75038c1d, 0xd59df5b9,  -963 },
455
  { 0xf97ae3d0, 0xd2446f25, 0x4b057328,  -960 },
456
  { 0x9becce62, 0x836ac577, 0x4ee367f9,  -956 },
457
  { 0xc2e801fb, 0x244576d5, 0x229c41f7,  -953 },
458
  { 0xf3a20279, 0xed56d48a, 0x6b435275,  -950 },
459
  { 0x9845418c, 0x345644d6, 0x830a1389,  -946 },
460
  { 0xbe5691ef, 0x416bd60c, 0x23cc986b,  -943 },
461
  { 0xedec366b, 0x11c6cb8f, 0x2cbfbe86,  -940 },
462
  { 0x94b3a202, 0xeb1c3f39, 0x7bf7d714,  -936 },
463
  { 0xb9e08a83, 0xa5e34f07, 0xdaf5ccd9,  -933 },
464
  { 0xe858ad24, 0x8f5c22c9, 0xd1b3400f,  -930 },
465
  { 0x91376c36, 0xd99995be, 0x23100809,  -926 },
466
  { 0xb5854744, 0x8ffffb2d, 0xabd40a0c,  -923 },
467
  { 0xe2e69915, 0xb3fff9f9, 0x16c90c8f,  -920 },
468
  { 0x8dd01fad, 0x907ffc3b, 0xae3da7d9,  -916 },
469
  { 0xb1442798, 0xf49ffb4a, 0x99cd11cf,  -913 },
470
  { 0xdd95317f, 0x31c7fa1d, 0x40405643,  -910 },
471
  { 0x8a7d3eef, 0x7f1cfc52, 0x482835ea,  -906 },
472
  { 0xad1c8eab, 0x5ee43b66, 0xda324365,  -903 },
473
  { 0xd863b256, 0x369d4a40, 0x90bed43e,  -900 },
474
  { 0x873e4f75, 0xe2224e68, 0x5a7744a6,  -896 },
475
  { 0xa90de353, 0x5aaae202, 0x711515d0,  -893 },
476
  { 0xd3515c28, 0x31559a83, 0x0d5a5b44,  -890 },
477
  { 0x8412d999, 0x1ed58091, 0xe858790a,  -886 },
478
  { 0xa5178fff, 0x668ae0b6, 0x626e974d,  -883 },
479
  { 0xce5d73ff, 0x402d98e3, 0xfb0a3d21,  -880 },
480
  { 0x80fa687f, 0x881c7f8e, 0x7ce66634,  -876 },
481
  { 0xa139029f, 0x6a239f72, 0x1c1fffc1,  -873 },
482
  { 0xc9874347, 0x44ac874e, 0xa327ffb2,  -870 },
483
  { 0xfbe91419, 0x15d7a922, 0x4bf1ff9f,  -867 },
484
  { 0x9d71ac8f, 0xada6c9b5, 0x6f773fc3,  -863 },
485
  { 0xc4ce17b3, 0x99107c22, 0xcb550fb4,  -860 },
486
  { 0xf6019da0, 0x7f549b2b, 0x7e2a53a1,  -857 },
487
  { 0x99c10284, 0x4f94e0fb, 0x2eda7444,  -853 },
488
  { 0xc0314325, 0x637a1939, 0xfa911155,  -850 },
489
  { 0xf03d93ee, 0xbc589f88, 0x793555ab,  -847 },
490
  { 0x96267c75, 0x35b763b5, 0x4bc1558b,  -843 },
491
  { 0xbbb01b92, 0x83253ca2, 0x9eb1aaed,  -840 },
492
  { 0xea9c2277, 0x23ee8bcb, 0x465e15a9,  -837 },
493
  { 0x92a1958a, 0x7675175f, 0x0bfacd89,  -833 },
494
  { 0xb749faed, 0x14125d36, 0xcef980ec,  -830 },
495
  { 0xe51c79a8, 0x5916f484, 0x82b7e127,  -827 },
496
  { 0x8f31cc09, 0x37ae58d2, 0xd1b2ecb8,  -823 },
497
  { 0xb2fe3f0b, 0x8599ef07, 0x861fa7e6,  -820 },
498
  { 0xdfbdcece, 0x67006ac9, 0x67a791e0,  -817 },
499
  { 0x8bd6a141, 0x006042bd, 0xe0c8bb2c,  -813 },
500
  { 0xaecc4991, 0x4078536d, 0x58fae9f7,  -810 },
501
  { 0xda7f5bf5, 0x90966848, 0xaf39a475,  -807 },
502
  { 0x888f9979, 0x7a5e012d, 0x6d8406c9,  -803 },
503
  { 0xaab37fd7, 0xd8f58178, 0xc8e5087b,  -800 },
504
  { 0xd5605fcd, 0xcf32e1d6, 0xfb1e4a9a,  -797 },
505
  { 0x855c3be0, 0xa17fcd26, 0x5cf2eea0,  -793 },
506
  { 0xa6b34ad8, 0xc9dfc06f, 0xf42faa48,  -790 },
507
  { 0xd0601d8e, 0xfc57b08b, 0xf13b94da,  -787 },
508
  { 0x823c1279, 0x5db6ce57, 0x76c53d08,  -783 },
509
  { 0xa2cb1717, 0xb52481ed, 0x54768c4b,  -780 },
510
  { 0xcb7ddcdd, 0xa26da268, 0xa9942f5d,  -777 },
511
  { 0xfe5d5415, 0x0b090b02, 0xd3f93b35,  -774 },
512
  { 0x9efa548d, 0x26e5a6e1, 0xc47bc501,  -770 },
513
  { 0xc6b8e9b0, 0x709f109a, 0x359ab641,  -767 },
514
  { 0xf867241c, 0x8cc6d4c0, 0xc30163d2,  -764 },
515
  { 0x9b407691, 0xd7fc44f8, 0x79e0de63,  -760 },
516
  { 0xc2109436, 0x4dfb5636, 0x985915fc,  -757 },
517
  { 0xf294b943, 0xe17a2bc4, 0x3e6f5b7b,  -754 },
518
  { 0x979cf3ca, 0x6cec5b5a, 0xa705992c,  -750 },
519
  { 0xbd8430bd, 0x08277231, 0x50c6ff78,  -747 },
520
  { 0xece53cec, 0x4a314ebd, 0xa4f8bf56,  -744 },
521
  { 0x940f4613, 0xae5ed136, 0x871b7795,  -740 },
522
  { 0xb9131798, 0x99f68584, 0x28e2557b,  -737 },
523
  { 0xe757dd7e, 0xc07426e5, 0x331aeada,  -734 },
524
  { 0x9096ea6f, 0x3848984f, 0x3ff0d2c8,  -730 },
525
  { 0xb4bca50b, 0x065abe63, 0x0fed077a,  -727 },
526
  { 0xe1ebce4d, 0xc7f16dfb, 0xd3e84959,  -724 },
527
  { 0x8d3360f0, 0x9cf6e4bd, 0x64712dd7,  -720 },
528
  { 0xb080392c, 0xc4349dec, 0xbd8d794d,  -717 },
529
  { 0xdca04777, 0xf541c567, 0xecf0d7a0,  -714 },
530
  { 0x89e42caa, 0xf9491b60, 0xf41686c4,  -710 },
531
  { 0xac5d37d5, 0xb79b6239, 0x311c2875,  -707 },
532
  { 0xd77485cb, 0x25823ac7, 0x7d633293,  -704 },
533
  { 0x86a8d39e, 0xf77164bc, 0xae5dff9c,  -700 },
534
  { 0xa8530886, 0xb54dbdeb, 0xd9f57f83,  -697 },
535
  { 0xd267caa8, 0x62a12d66, 0xd072df63,  -694 },
536
  { 0x8380dea9, 0x3da4bc60, 0x4247cb9e,  -690 },
537
  { 0xa4611653, 0x8d0deb78, 0x52d9be85,  -687 },
538
  { 0xcd795be8, 0x70516656, 0x67902e27,  -684 },
539
  { 0x806bd971, 0x4632dff6, 0x00ba1cd8,  -680 },
540
  { 0xa086cfcd, 0x97bf97f3, 0x80e8a40e,  -677 },
541
  { 0xc8a883c0, 0xfdaf7df0, 0x6122cd12,  -674 },
542
  { 0xfad2a4b1, 0x3d1b5d6c, 0x796b8057,  -671 },
543
  { 0x9cc3a6ee, 0xc6311a63, 0xcbe33036,  -667 },
544
  { 0xc3f490aa, 0x77bd60fc, 0xbedbfc44,  -664 },
545
  { 0xf4f1b4d5, 0x15acb93b, 0xee92fb55,  -661 },
546
  { 0x99171105, 0x2d8bf3c5, 0x751bdd15,  -657 },
547
  { 0xbf5cd546, 0x78eef0b6, 0xd262d45a,  -654 },
548
  { 0xef340a98, 0x172aace4, 0x86fb8971,  -651 },
549
  { 0x9580869f, 0x0e7aac0e, 0xd45d35e6,  -647 },
550
  { 0xbae0a846, 0xd2195712, 0x89748360,  -644 },
551
  { 0xe998d258, 0x869facd7, 0x2bd1a438,  -641 },
552
  { 0x91ff8377, 0x5423cc06, 0x7b6306a3,  -637 },
553
  { 0xb67f6455, 0x292cbf08, 0x1a3bc84c,  -634 },
554
  { 0xe41f3d6a, 0x7377eeca, 0x20caba5f,  -631 },
555
  { 0x8e938662, 0x882af53e, 0x547eb47b,  -627 },
556
  { 0xb23867fb, 0x2a35b28d, 0xe99e619a,  -624 },
557
  { 0xdec681f9, 0xf4c31f31, 0x6405fa00,  -621 },
558
  { 0x8b3c113c, 0x38f9f37e, 0xde83bc40,  -617 },
559
  { 0xae0b158b, 0x4738705e, 0x9624ab50,  -614 },
560
  { 0xd98ddaee, 0x19068c76, 0x3badd624,  -611 },
561
  { 0x87f8a8d4, 0xcfa417c9, 0xe54ca5d7,  -607 },
562
  { 0xa9f6d30a, 0x038d1dbc, 0x5e9fcf4c,  -604 },
563
  { 0xd47487cc, 0x8470652b, 0x7647c320,  -601 },
564
  { 0x84c8d4df, 0xd2c63f3b, 0x29ecd9f4,  -597 },
565
  { 0xa5fb0a17, 0xc777cf09, 0xf4681071,  -594 },
566
  { 0xcf79cc9d, 0xb955c2cc, 0x7182148d,  -591 },
567
  { 0x81ac1fe2, 0x93d599bf, 0xc6f14cd8,  -587 },
568
  { 0xa21727db, 0x38cb002f, 0xb8ada00e,  -584 },
569
  { 0xca9cf1d2, 0x06fdc03b, 0xa6d90811,  -581 },
570
  { 0xfd442e46, 0x88bd304a, 0x908f4a16,  -578 },
571
  { 0x9e4a9cec, 0x15763e2e, 0x9a598e4e,  -574 },
572
  { 0xc5dd4427, 0x1ad3cdba, 0x40eff1e1,  -571 },
573
  { 0xf7549530, 0xe188c128, 0xd12bee59,  -568 },
574
  { 0x9a94dd3e, 0x8cf578b9, 0x82bb74f8,  -564 },
575
  { 0xc13a148e, 0x3032d6e7, 0xe36a5236,  -561 },
576
  { 0xf18899b1, 0xbc3f8ca1, 0xdc44e6c3,  -558 },
577
  { 0x96f5600f, 0x15a7b7e5, 0x29ab103a,  -554 },
578
  { 0xbcb2b812, 0xdb11a5de, 0x7415d448,  -551 },
579
  { 0xebdf6617, 0x91d60f56, 0x111b495b,  -548 },
580
  { 0x936b9fce, 0xbb25c995, 0xcab10dd9,  -544 },
581
  { 0xb84687c2, 0x69ef3bfb, 0x3d5d514f,  -541 },
582
  { 0xe65829b3, 0x046b0afa, 0x0cb4a5a3,  -538 },
583
  { 0x8ff71a0f, 0xe2c2e6dc, 0x47f0e785,  -534 },
584
  { 0xb3f4e093, 0xdb73a093, 0x59ed2167,  -531 },
585
  { 0xe0f218b8, 0xd25088b8, 0x306869c1,  -528 },
586
  { 0x8c974f73, 0x83725573, 0x1e414218,  -524 },
587
  { 0xafbd2350, 0x644eeacf, 0xe5d1929e,  -521 },
588
  { 0xdbac6c24, 0x7d62a583, 0xdf45f746,  -518 },
589
  { 0x894bc396, 0xce5da772, 0x6b8bba8c,  -514 },
590
  { 0xab9eb47c, 0x81f5114f, 0x066ea92f,  -511 },
591
  { 0xd686619b, 0xa27255a2, 0xc80a537b,  -508 },
592
  { 0x8613fd01, 0x45877585, 0xbd06742c,  -504 },
593
  { 0xa798fc41, 0x96e952e7, 0x2c481138,  -501 },
594
  { 0xd17f3b51, 0xfca3a7a0, 0xf75a1586,  -498 },
595
  { 0x82ef8513, 0x3de648c4, 0x9a984d73,  -494 },
596
  { 0xa3ab6658, 0x0d5fdaf5, 0xc13e60d0,  -491 },
597
  { 0xcc963fee, 0x10b7d1b3, 0x318df905,  -488 },
598
  { 0xffbbcfe9, 0x94e5c61f, 0xfdf17746,  -485 },
599
  { 0x9fd561f1, 0xfd0f9bd3, 0xfeb6ea8b,  -481 },
600
  { 0xc7caba6e, 0x7c5382c8, 0xfe64a52e,  -478 },
601
  { 0xf9bd690a, 0x1b68637b, 0x3dfdce7a,  -475 },
602
  { 0x9c1661a6, 0x51213e2d, 0x06bea10c,  -471 },
603
  { 0xc31bfa0f, 0xe5698db8, 0x486e494f,  -468 },
604
  { 0xf3e2f893, 0xdec3f126, 0x5a89dba3,  -465 },
605
  { 0x986ddb5c, 0x6b3a76b7, 0xf8962946,  -461 },
606
  { 0xbe895233, 0x86091465, 0xf6bbb397,  -458 },
607
  { 0xee2ba6c0, 0x678b597f, 0x746aa07d,  -455 },
608
  { 0x94db4838, 0x40b717ef, 0xa8c2a44e,  -451 },
609
  { 0xba121a46, 0x50e4ddeb, 0x92f34d62,  -448 },
610
  { 0xe896a0d7, 0xe51e1566, 0x77b020ba,  -445 },
611
  { 0x915e2486, 0xef32cd60, 0x0ace1474,  -441 },
612
  { 0xb5b5ada8, 0xaaff80b8, 0x0d819992,  -438 },
613
  { 0xe3231912, 0xd5bf60e6, 0x10e1fff6,  -435 },
614
  { 0x8df5efab, 0xc5979c8f, 0xca8d3ffa,  -431 },
615
  { 0xb1736b96, 0xb6fd83b3, 0xbd308ff8,  -428 },
616
  { 0xddd0467c, 0x64bce4a0, 0xac7cb3f6,  -425 },
617
  { 0x8aa22c0d, 0xbef60ee4, 0x6bcdf07a,  -421 },
618
  { 0xad4ab711, 0x2eb3929d, 0x86c16c98,  -418 },
619
  { 0xd89d64d5, 0x7a607744, 0xe871c7bf,  -415 },
620
  { 0x87625f05, 0x6c7c4a8b, 0x11471cd7,  -411 },
621
  { 0xa93af6c6, 0xc79b5d2d, 0xd598e40d,  -408 },
622
  { 0xd389b478, 0x79823479, 0x4aff1d10,  -405 },
623
  { 0x843610cb, 0x4bf160cb, 0xcedf722a,  -401 },
624
  { 0xa54394fe, 0x1eedb8fe, 0xc2974eb4,  -398 },
625
  { 0xce947a3d, 0xa6a9273e, 0x733d2262,  -395 },
626
  { 0x811ccc66, 0x8829b887, 0x0806357d,  -391 },
627
  { 0xa163ff80, 0x2a3426a8, 0xca07c2dc,  -388 },
628
  { 0xc9bcff60, 0x34c13052, 0xfc89b393,  -385 },
629
  { 0xfc2c3f38, 0x41f17c67, 0xbbac2078,  -382 },
630
  { 0x9d9ba783, 0x2936edc0, 0xd54b944b,  -378 },
631
  { 0xc5029163, 0xf384a931, 0x0a9e795e,  -375 },
632
  { 0xf64335bc, 0xf065d37d, 0x4d4617b5,  -372 },
633
  { 0x99ea0196, 0x163fa42e, 0x504bced1,  -368 },
634
  { 0xc06481fb, 0x9bcf8d39, 0xe45ec286,  -365 },
635
  { 0xf07da27a, 0x82c37088, 0x5d767327,  -362 },
636
  { 0x964e858c, 0x91ba2655, 0x3a6a07f8,  -358 },
637
  { 0xbbe226ef, 0xb628afea, 0x890489f7,  -355 },
638
  { 0xeadab0ab, 0xa3b2dbe5, 0x2b45ac74,  -352 },
639
  { 0x92c8ae6b, 0x464fc96f, 0x3b0b8bc9,  -348 },
640
  { 0xb77ada06, 0x17e3bbcb, 0x09ce6ebb,  -345 },
641
  { 0xe5599087, 0x9ddcaabd, 0xcc420a6a,  -342 },
642
  { 0x8f57fa54, 0xc2a9eab6, 0x9fa94682,  -338 },
643
  { 0xb32df8e9, 0xf3546564, 0x47939822,  -335 },
644
  { 0xdff97724, 0x70297ebd, 0x59787e2b,  -332 },
645
  { 0x8bfbea76, 0xc619ef36, 0x57eb4edb,  -328 },
646
  { 0xaefae514, 0x77a06b03, 0xede62292,  -325 },
647
  { 0xdab99e59, 0x958885c4, 0xe95fab36,  -322 },
648
  { 0x88b402f7, 0xfd75539b, 0x11dbcb02,  -318 },
649
  { 0xaae103b5, 0xfcd2a881, 0xd652bdc2,  -315 },
650
  { 0xd59944a3, 0x7c0752a2, 0x4be76d33,  -312 },
651
  { 0x857fcae6, 0x2d8493a5, 0x6f70a440,  -308 },
652
  { 0xa6dfbd9f, 0xb8e5b88e, 0xcb4ccd50,  -305 },
653
  { 0xd097ad07, 0xa71f26b2, 0x7e2000a4,  -302 },
654
  { 0x825ecc24, 0xc873782f, 0x8ed40066,  -298 },
655
  { 0xa2f67f2d, 0xfa90563b, 0x72890080,  -295 },
656
  { 0xcbb41ef9, 0x79346bca, 0x4f2b40a0,  -292 },
657
  { 0xfea126b7, 0xd78186bc, 0xe2f610c8,  -289 },
658
  { 0x9f24b832, 0xe6b0f436, 0x0dd9ca7d,  -285 },
659
  { 0xc6ede63f, 0xa05d3143, 0x91503d1c,  -282 },
660
  { 0xf8a95fcf, 0x88747d94, 0x75a44c63,  -279 },
661
  { 0x9b69dbe1, 0xb548ce7c, 0xc986afbe,  -275 },
662
  { 0xc24452da, 0x229b021b, 0xfbe85bad,  -272 },
663
  { 0xf2d56790, 0xab41c2a2, 0xfae27299,  -269 },
664
  { 0x97c560ba, 0x6b0919a5, 0xdccd879f,  -265 },
665
  { 0xbdb6b8e9, 0x05cb600f, 0x5400e987,  -262 },
666
  { 0xed246723, 0x473e3813, 0x290123e9,  -259 },
667
  { 0x9436c076, 0x0c86e30b, 0xf9a0b672,  -255 },
668
  { 0xb9447093, 0x8fa89bce, 0xf808e40e,  -252 },
669
  { 0xe7958cb8, 0x7392c2c2, 0xb60b1d12,  -249 },
670
  { 0x90bd77f3, 0x483bb9b9, 0xb1c6f22b,  -245 },
671
  { 0xb4ecd5f0, 0x1a4aa828, 0x1e38aeb6,  -242 },
672
  { 0xe2280b6c, 0x20dd5232, 0x25c6da63,  -239 },
673
  { 0x8d590723, 0x948a535f, 0x579c487e,  -235 },
674
  { 0xb0af48ec, 0x79ace837, 0x2d835a9d,  -232 },
675
  { 0xdcdb1b27, 0x98182244, 0xf8e43145,  -229 },
676
  { 0x8a08f0f8, 0xbf0f156b, 0x1b8e9ecb,  -225 },
677
  { 0xac8b2d36, 0xeed2dac5, 0xe272467e,  -222 },
678
  { 0xd7adf884, 0xaa879177, 0x5b0ed81d,  -219 },
679
  { 0x86ccbb52, 0xea94baea, 0x98e94712,  -215 },
680
  { 0xa87fea27, 0xa539e9a5, 0x3f2398d7,  -212 },
681
  { 0xd29fe4b1, 0x8e88640e, 0x8eec7f0d,  -209 },
682
  { 0x83a3eeee, 0xf9153e89, 0x1953cf68,  -205 },
683
  { 0xa48ceaaa, 0xb75a8e2b, 0x5fa8c342,  -202 },
684
  { 0xcdb02555, 0x653131b6, 0x3792f412,  -199 },
685
  { 0x808e1755, 0x5f3ebf11, 0xe2bbd88b,  -195 },
686
  { 0xa0b19d2a, 0xb70e6ed6, 0x5b6aceae,  -192 },
687
  { 0xc8de0475, 0x64d20a8b, 0xf245825a,  -189 },
688
  { 0xfb158592, 0xbe068d2e, 0xeed6e2f0,  -186 },
689
  { 0x9ced737b, 0xb6c4183d, 0x55464dd6,  -182 },
690
  { 0xc428d05a, 0xa4751e4c, 0xaa97e14c,  -179 },
691
  { 0xf5330471, 0x4d9265df, 0xd53dd99f,  -176 },
692
  { 0x993fe2c6, 0xd07b7fab, 0xe546a803,  -172 },
693
  { 0xbf8fdb78, 0x849a5f96, 0xde985204,  -169 },
694
  { 0xef73d256, 0xa5c0f77c, 0x963e6685,  -166 },
695
  { 0x95a86376, 0x27989aad, 0xdde70013,  -162 },
696
  { 0xbb127c53, 0xb17ec159, 0x5560c018,  -159 },
697
  { 0xe9d71b68, 0x9dde71af, 0xaab8f01e,  -156 },
698
  { 0x92267121, 0x62ab070d, 0xcab39613,  -152 },
699
  { 0xb6b00d69, 0xbb55c8d1, 0x3d607b97,  -149 },
700
  { 0xe45c10c4, 0x2a2b3b05, 0x8cb89a7d,  -146 },
701
  { 0x8eb98a7a, 0x9a5b04e3, 0x77f3608e,  -142 },
702
  { 0xb267ed19, 0x40f1c61c, 0x55f038b2,  -139 },
703
  { 0xdf01e85f, 0x912e37a3, 0x6b6c46de,  -136 },
704
  { 0x8b61313b, 0xbabce2c6, 0x2323ac4b,  -132 },
705
  { 0xae397d8a, 0xa96c1b77, 0xabec975e,  -129 },
706
  { 0xd9c7dced, 0x53c72255, 0x96e7bd35,  -126 },
707
  { 0x881cea14, 0x545c7575, 0x7e50d641,  -122 },
708
  { 0xaa242499, 0x697392d2, 0xdde50bd1,  -119 },
709
  { 0xd4ad2dbf, 0xc3d07787, 0x955e4ec6,  -116 },
710
  { 0x84ec3c97, 0xda624ab4, 0xbd5af13b,  -112 },
711
  { 0xa6274bbd, 0xd0fadd61, 0xecb1ad8a,  -109 },
712
  { 0xcfb11ead, 0x453994ba, 0x67de18ed,  -106 },
713
  { 0x81ceb32c, 0x4b43fcf4, 0x80eacf94,  -102 },
714
  { 0xa2425ff7, 0x5e14fc31, 0xa1258379,   -99 },
715
  { 0xcad2f7f5, 0x359a3b3e, 0x096ee458,   -96 },
716
  { 0xfd87b5f2, 0x8300ca0d, 0x8bca9d6e,   -93 },
717
  { 0x9e74d1b7, 0x91e07e48, 0x775ea264,   -89 },
718
  { 0xc6120625, 0x76589dda, 0x95364afe,   -86 },
719
  { 0xf79687ae, 0xd3eec551, 0x3a83ddbd,   -83 },
720
  { 0x9abe14cd, 0x44753b52, 0xc4926a96,   -79 },
721
  { 0xc16d9a00, 0x95928a27, 0x75b7053c,   -76 },
722
  { 0xf1c90080, 0xbaf72cb1, 0x5324c68b,   -73 },
723
  { 0x971da050, 0x74da7bee, 0xd3f6fc16,   -69 },
724
  { 0xbce50864, 0x92111aea, 0x88f4bb1c,   -66 },
725
  { 0xec1e4a7d, 0xb69561a5, 0x2b31e9e3,   -63 },
726
  { 0x9392ee8e, 0x921d5d07, 0x3aff322e,   -59 },
727
  { 0xb877aa32, 0x36a4b449, 0x09befeb9,   -56 },
728
  { 0xe69594be, 0xc44de15b, 0x4c2ebe68,   -53 },
729
  { 0x901d7cf7, 0x3ab0acd9, 0x0f9d3701,   -49 },
730
  { 0xb424dc35, 0x095cd80f, 0x538484c1,   -46 },
731
  { 0xe12e1342, 0x4bb40e13, 0x2865a5f2,   -43 },
732
  { 0x8cbccc09, 0x6f5088cb, 0xf93f87b7,   -39 },
733
  { 0xafebff0b, 0xcb24aafe, 0xf78f69a5,   -36 },
734
  { 0xdbe6fece, 0xbdedd5be, 0xb573440e,   -33 },
735
  { 0x89705f41, 0x36b4a597, 0x31680a88,   -29 },
736
  { 0xabcc7711, 0x8461cefc, 0xfdc20d2b,   -26 },
737
  { 0xd6bf94d5, 0xe57a42bc, 0x3d329076,   -23 },
738
  { 0x8637bd05, 0xaf6c69b5, 0xa63f9a49,   -19 },
739
  { 0xa7c5ac47, 0x1b478423, 0x0fcf80dc,   -16 },
740
  { 0xd1b71758, 0xe219652b, 0xd3c36113,   -13 },
741
  { 0x83126e97, 0x8d4fdf3b, 0x645a1cac,    -9 },
742
  { 0xa3d70a3d, 0x70a3d70a, 0x3d70a3d7,    -6 },
743
  { 0xcccccccc, 0xcccccccc, 0xcccccccc,    -3 },
744
  { 0x80000000, 0x00000000, 0x00000000,    1 },
745
  { 0xa0000000, 0x00000000, 0x00000000,    4 },
746
  { 0xc8000000, 0x00000000, 0x00000000,    7 },
747
  { 0xfa000000, 0x00000000, 0x00000000,   10 },
748
  { 0x9c400000, 0x00000000, 0x00000000,   14 },
749
  { 0xc3500000, 0x00000000, 0x00000000,   17 },
750
  { 0xf4240000, 0x00000000, 0x00000000,   20 },
751
  { 0x98968000, 0x00000000, 0x00000000,   24 },
752
  { 0xbebc2000, 0x00000000, 0x00000000,   27 },
753
  { 0xee6b2800, 0x00000000, 0x00000000,   30 },
754
  { 0x9502f900, 0x00000000, 0x00000000,   34 },
755
  { 0xba43b740, 0x00000000, 0x00000000,   37 },
756
  { 0xe8d4a510, 0x00000000, 0x00000000,   40 },
757
  { 0x9184e72a, 0x00000000, 0x00000000,   44 },
758
  { 0xb5e620f4, 0x80000000, 0x00000000,   47 },
759
  { 0xe35fa931, 0xa0000000, 0x00000000,   50 },
760
  { 0x8e1bc9bf, 0x04000000, 0x00000000,   54 },
761
  { 0xb1a2bc2e, 0xc5000000, 0x00000000,   57 },
762
  { 0xde0b6b3a, 0x76400000, 0x00000000,   60 },
763
  { 0x8ac72304, 0x89e80000, 0x00000000,   64 },
764
  { 0xad78ebc5, 0xac620000, 0x00000000,   67 },
765
  { 0xd8d726b7, 0x177a8000, 0x00000000,   70 },
766
  { 0x87867832, 0x6eac9000, 0x00000000,   74 },
767
  { 0xa968163f, 0x0a57b400, 0x00000000,   77 },
768
  { 0xd3c21bce, 0xcceda100, 0x00000000,   80 },
769
  { 0x84595161, 0x401484a0, 0x00000000,   84 },
770
  { 0xa56fa5b9, 0x9019a5c8, 0x00000000,   87 },
771
  { 0xcecb8f27, 0xf4200f3a, 0x00000000,   90 },
772
  { 0x813f3978, 0xf8940984, 0x40000000,   94 },
773
  { 0xa18f07d7, 0x36b90be5, 0x50000000,   97 },
774
  { 0xc9f2c9cd, 0x04674ede, 0xa4000000,  100 },
775
  { 0xfc6f7c40, 0x45812296, 0x4d000000,  103 },
776
  { 0x9dc5ada8, 0x2b70b59d, 0xf0200000,  107 },
777
  { 0xc5371912, 0x364ce305, 0x6c280000,  110 },
778
  { 0xf684df56, 0xc3e01bc6, 0xc7320000,  113 },
779
  { 0x9a130b96, 0x3a6c115c, 0x3c7f4000,  117 },
780
  { 0xc097ce7b, 0xc90715b3, 0x4b9f1000,  120 },
781
  { 0xf0bdc21a, 0xbb48db20, 0x1e86d400,  123 },
782
  { 0x96769950, 0xb50d88f4, 0x13144480,  127 },
783
  { 0xbc143fa4, 0xe250eb31, 0x17d955a0,  130 },
784
  { 0xeb194f8e, 0x1ae525fd, 0x5dcfab08,  133 },
785
  { 0x92efd1b8, 0xd0cf37be, 0x5aa1cae5,  137 },
786
  { 0xb7abc627, 0x050305ad, 0xf14a3d9e,  140 },
787
  { 0xe596b7b0, 0xc643c719, 0x6d9ccd05,  143 },
788
  { 0x8f7e32ce, 0x7bea5c6f, 0xe4820023,  147 },
789
  { 0xb35dbf82, 0x1ae4f38b, 0xdda2802c,  150 },
790
  { 0xe0352f62, 0xa19e306e, 0xd50b2037,  153 },
791
  { 0x8c213d9d, 0xa502de45, 0x4526f422,  157 },
792
  { 0xaf298d05, 0x0e4395d6, 0x9670b12b,  160 },
793
  { 0xdaf3f046, 0x51d47b4c, 0x3c0cdd76,  163 },
794
  { 0x88d8762b, 0xf324cd0f, 0xa5880a69,  167 },
795
  { 0xab0e93b6, 0xefee0053, 0x8eea0d04,  170 },
796
  { 0xd5d238a4, 0xabe98068, 0x72a49045,  173 },
797
  { 0x85a36366, 0xeb71f041, 0x47a6da2b,  177 },
798
  { 0xa70c3c40, 0xa64e6c51, 0x999090b6,  180 },
799
  { 0xd0cf4b50, 0xcfe20765, 0xfff4b4e3,  183 },
800
  { 0x82818f12, 0x81ed449f, 0xbff8f10e,  187 },
801
  { 0xa321f2d7, 0x226895c7, 0xaff72d52,  190 },
802
  { 0xcbea6f8c, 0xeb02bb39, 0x9bf4f8a6,  193 },
803
  { 0xfee50b70, 0x25c36a08, 0x02f236d0,  196 },
804
  { 0x9f4f2726, 0x179a2245, 0x01d76242,  200 },
805
  { 0xc722f0ef, 0x9d80aad6, 0x424d3ad2,  203 },
806
  { 0xf8ebad2b, 0x84e0d58b, 0xd2e08987,  206 },
807
  { 0x9b934c3b, 0x330c8577, 0x63cc55f4,  210 },
808
  { 0xc2781f49, 0xffcfa6d5, 0x3cbf6b71,  213 },
809
  { 0xf316271c, 0x7fc3908a, 0x8bef464e,  216 },
810
  { 0x97edd871, 0xcfda3a56, 0x97758bf0,  220 },
811
  { 0xbde94e8e, 0x43d0c8ec, 0x3d52eeed,  223 },
812
  { 0xed63a231, 0xd4c4fb27, 0x4ca7aaa8,  226 },
813
  { 0x945e455f, 0x24fb1cf8, 0x8fe8caa9,  230 },
814
  { 0xb975d6b6, 0xee39e436, 0xb3e2fd53,  233 },
815
  { 0xe7d34c64, 0xa9c85d44, 0x60dbbca8,  236 },
816
  { 0x90e40fbe, 0xea1d3a4a, 0xbc8955e9,  240 },
817
  { 0xb51d13ae, 0xa4a488dd, 0x6babab63,  243 },
818
  { 0xe264589a, 0x4dcdab14, 0xc696963c,  246 },
819
  { 0x8d7eb760, 0x70a08aec, 0xfc1e1de5,  250 },
820
  { 0xb0de6538, 0x8cc8ada8, 0x3b25a55f,  253 },
821
  { 0xdd15fe86, 0xaffad912, 0x49ef0eb7,  256 },
822
  { 0x8a2dbf14, 0x2dfcc7ab, 0x6e356932,  260 },
823
  { 0xacb92ed9, 0x397bf996, 0x49c2c37f,  263 },
824
  { 0xd7e77a8f, 0x87daf7fb, 0xdc33745e,  266 },
825
  { 0x86f0ac99, 0xb4e8dafd, 0x69a028bb,  270 },
826
  { 0xa8acd7c0, 0x222311bc, 0xc40832ea,  273 },
827
  { 0xd2d80db0, 0x2aabd62b, 0xf50a3fa4,  276 },
828
  { 0x83c7088e, 0x1aab65db, 0x792667c6,  280 },
829
  { 0xa4b8cab1, 0xa1563f52, 0x577001b8,  283 },
830
  { 0xcde6fd5e, 0x09abcf26, 0xed4c0226,  286 },
831
  { 0x80b05e5a, 0xc60b6178, 0x544f8158,  290 },
832
  { 0xa0dc75f1, 0x778e39d6, 0x696361ae,  293 },
833
  { 0xc913936d, 0xd571c84c, 0x03bc3a19,  296 },
834
  { 0xfb587849, 0x4ace3a5f, 0x04ab48a0,  299 },
835
  { 0x9d174b2d, 0xcec0e47b, 0x62eb0d64,  303 },
836
  { 0xc45d1df9, 0x42711d9a, 0x3ba5d0bd,  306 },
837
  { 0xf5746577, 0x930d6500, 0xca8f44ec,  309 },
838
  { 0x9968bf6a, 0xbbe85f20, 0x7e998b13,  313 },
839
  { 0xbfc2ef45, 0x6ae276e8, 0x9e3fedd8,  316 },
840
  { 0xefb3ab16, 0xc59b14a2, 0xc5cfe94e,  319 },
841
  { 0x95d04aee, 0x3b80ece5, 0xbba1f1d1,  323 },
842
  { 0xbb445da9, 0xca61281f, 0x2a8a6e45,  326 },
843
  { 0xea157514, 0x3cf97226, 0xf52d09d7,  329 },
844
  { 0x924d692c, 0xa61be758, 0x593c2626,  333 },
845
  { 0xb6e0c377, 0xcfa2e12e, 0x6f8b2fb0,  336 },
846
  { 0xe498f455, 0xc38b997a, 0x0b6dfb9c,  339 },
847
  { 0x8edf98b5, 0x9a373fec, 0x4724bd41,  343 },
848
  { 0xb2977ee3, 0x00c50fe7, 0x58edec91,  346 },
849
  { 0xdf3d5e9b, 0xc0f653e1, 0x2f2967b6,  349 },
850
  { 0x8b865b21, 0x5899f46c, 0xbd79e0d2,  353 },
851
  { 0xae67f1e9, 0xaec07187, 0xecd85906,  356 },
852
  { 0xda01ee64, 0x1a708de9, 0xe80e6f48,  359 },
853
  { 0x884134fe, 0x908658b2, 0x3109058d,  363 },
854
  { 0xaa51823e, 0x34a7eede, 0xbd4b46f0,  366 },
855
  { 0xd4e5e2cd, 0xc1d1ea96, 0x6c9e18ac,  369 },
856
  { 0x850fadc0, 0x9923329e, 0x03e2cf6b,  373 },
857
  { 0xa6539930, 0xbf6bff45, 0x84db8346,  376 },
858
  { 0xcfe87f7c, 0xef46ff16, 0xe6126418,  379 },
859
  { 0x81f14fae, 0x158c5f6e, 0x4fcb7e8f,  383 },
860
  { 0xa26da399, 0x9aef7749, 0xe3be5e33,  386 },
861
  { 0xcb090c80, 0x01ab551c, 0x5cadf5bf,  389 },
862
  { 0xfdcb4fa0, 0x02162a63, 0x73d9732f,  392 },
863
  { 0x9e9f11c4, 0x014dda7e, 0x2867e7fd,  396 },
864
  { 0xc646d635, 0x01a1511d, 0xb281e1fd,  399 },
865
  { 0xf7d88bc2, 0x4209a565, 0x1f225a7c,  402 },
866
  { 0x9ae75759, 0x6946075f, 0x3375788d,  406 },
867
  { 0xc1a12d2f, 0xc3978937, 0x0052d6b1,  409 },
868
  { 0xf209787b, 0xb47d6b84, 0xc0678c5d,  412 },
869
  { 0x9745eb4d, 0x50ce6332, 0xf840b7ba,  416 },
870
  { 0xbd176620, 0xa501fbff, 0xb650e5a9,  419 },
871
  { 0xec5d3fa8, 0xce427aff, 0xa3e51f13,  422 },
872
  { 0x93ba47c9, 0x80e98cdf, 0xc66f336c,  426 },
873
  { 0xb8a8d9bb, 0xe123f017, 0xb80b0047,  429 },
874
  { 0xe6d3102a, 0xd96cec1d, 0xa60dc059,  432 },
875
  { 0x9043ea1a, 0xc7e41392, 0x87c89837,  436 },
876
  { 0xb454e4a1, 0x79dd1877, 0x29babe45,  439 },
877
  { 0xe16a1dc9, 0xd8545e94, 0xf4296dd6,  442 },
878
  { 0x8ce2529e, 0x2734bb1d, 0x1899e4a6,  446 },
879
  { 0xb01ae745, 0xb101e9e4, 0x5ec05dcf,  449 },
880
  { 0xdc21a117, 0x1d42645d, 0x76707543,  452 },
881
  { 0x899504ae, 0x72497eba, 0x6a06494a,  456 },
882
  { 0xabfa45da, 0x0edbde69, 0x0487db9d,  459 },
883
  { 0xd6f8d750, 0x9292d603, 0x45a9d284,  462 },
884
  { 0x865b8692, 0x5b9bc5c2, 0x0b8a2392,  466 },
885
  { 0xa7f26836, 0xf282b732, 0x8e6cac77,  469 },
886
  { 0xd1ef0244, 0xaf2364ff, 0x3207d795,  472 },
887
  { 0x8335616a, 0xed761f1f, 0x7f44e6bd,  476 },
888
  { 0xa402b9c5, 0xa8d3a6e7, 0x5f16206c,  479 },
889
  { 0xcd036837, 0x130890a1, 0x36dba887,  482 },
890
  { 0x80222122, 0x6be55a64, 0xc2494954,  486 },
891
  { 0xa02aa96b, 0x06deb0fd, 0xf2db9baa,  489 },
892
  { 0xc83553c5, 0xc8965d3d, 0x6f928294,  492 },
893
  { 0xfa42a8b7, 0x3abbf48c, 0xcb772339,  495 },
894
  { 0x9c69a972, 0x84b578d7, 0xff2a7604,  499 },
895
  { 0xc38413cf, 0x25e2d70d, 0xfef51385,  502 },
896
  { 0xf46518c2, 0xef5b8cd1, 0x7eb25866,  505 },
897
  { 0x98bf2f79, 0xd5993802, 0xef2f773f,  509 },
898
  { 0xbeeefb58, 0x4aff8603, 0xaafb550f,  512 },
899
  { 0xeeaaba2e, 0x5dbf6784, 0x95ba2a53,  515 },
900
  { 0x952ab45c, 0xfa97a0b2, 0xdd945a74,  519 },
901
  { 0xba756174, 0x393d88df, 0x94f97111,  522 },
902
  { 0xe912b9d1, 0x478ceb17, 0x7a37cd56,  525 },
903
  { 0x91abb422, 0xccb812ee, 0xac62e055,  529 },
904
  { 0xb616a12b, 0x7fe617aa, 0x577b986b,  532 },
905
  { 0xe39c4976, 0x5fdf9d94, 0xed5a7e85,  535 },
906
  { 0x8e41ade9, 0xfbebc27d, 0x14588f13,  539 },
907
  { 0xb1d21964, 0x7ae6b31c, 0x596eb2d8,  542 },
908
  { 0xde469fbd, 0x99a05fe3, 0x6fca5f8e,  545 },
909
  { 0x8aec23d6, 0x80043bee, 0x25de7bb9,  549 },
910
  { 0xada72ccc, 0x20054ae9, 0xaf561aa7,  552 },
911
  { 0xd910f7ff, 0x28069da4, 0x1b2ba151,  555 },
912
  { 0x87aa9aff, 0x79042286, 0x90fb44d2,  559 },
913
  { 0xa99541bf, 0x57452b28, 0x353a1607,  562 },
914
  { 0xd3fa922f, 0x2d1675f2, 0x42889b89,  565 },
915
  { 0x847c9b5d, 0x7c2e09b7, 0x69956135,  569 },
916
  { 0xa59bc234, 0xdb398c25, 0x43fab983,  572 },
917
  { 0xcf02b2c2, 0x1207ef2e, 0x94f967e4,  575 },
918
  { 0x8161afb9, 0x4b44f57d, 0x1d1be0ee,  579 },
919
  { 0xa1ba1ba7, 0x9e1632dc, 0x6462d92a,  582 },
920
  { 0xca28a291, 0x859bbf93, 0x7d7b8f75,  585 },
921
  { 0xfcb2cb35, 0xe702af78, 0x5cda7352,  588 },
922
  { 0x9defbf01, 0xb061adab, 0x3a088813,  592 },
923
  { 0xc56baec2, 0x1c7a1916, 0x088aaa18,  595 },
924
  { 0xf6c69a72, 0xa3989f5b, 0x8aad549e,  598 },
925
  { 0x9a3c2087, 0xa63f6399, 0x36ac54e2,  602 },
926
  { 0xc0cb28a9, 0x8fcf3c7f, 0x84576a1b,  605 },
927
  { 0xf0fdf2d3, 0xf3c30b9f, 0x656d44a2,  608 },
928
  { 0x969eb7c4, 0x7859e743, 0x9f644ae5,  612 },
929
  { 0xbc4665b5, 0x96706114, 0x873d5d9f,  615 },
930
  { 0xeb57ff22, 0xfc0c7959, 0xa90cb506,  618 },
931
  { 0x9316ff75, 0xdd87cbd8, 0x09a7f124,  622 },
932
  { 0xb7dcbf53, 0x54e9bece, 0x0c11ed6d,  625 },
933
  { 0xe5d3ef28, 0x2a242e81, 0x8f1668c8,  628 },
934
  { 0x8fa47579, 0x1a569d10, 0xf96e017d,  632 },
935
  { 0xb38d92d7, 0x60ec4455, 0x37c981dc,  635 },
936
  { 0xe070f78d, 0x3927556a, 0x85bbe253,  638 },
937
  { 0x8c469ab8, 0x43b89562, 0x93956d74,  642 },
938
  { 0xaf584166, 0x54a6babb, 0x387ac8d1,  645 },
939
  { 0xdb2e51bf, 0xe9d0696a, 0x06997b05,  648 },
940
  { 0x88fcf317, 0xf22241e2, 0x441fece3,  652 },
941
  { 0xab3c2fdd, 0xeeaad25a, 0xd527e81c,  655 },
942
  { 0xd60b3bd5, 0x6a5586f1, 0x8a71e223,  658 },
943
  { 0x85c70565, 0x62757456, 0xf6872d56,  662 },
944
  { 0xa738c6be, 0xbb12d16c, 0xb428f8ac,  665 },
945
  { 0xd106f86e, 0x69d785c7, 0xe13336d7,  668 },
946
  { 0x82a45b45, 0x0226b39c, 0xecc00246,  672 },
947
  { 0xa34d7216, 0x42b06084, 0x27f002d7,  675 },
948
  { 0xcc20ce9b, 0xd35c78a5, 0x31ec038d,  678 },
949
  { 0xff290242, 0xc83396ce, 0x7e670471,  681 },
950
  { 0x9f79a169, 0xbd203e41, 0x0f0062c6,  685 },
951
  { 0xc75809c4, 0x2c684dd1, 0x52c07b78,  688 },
952
  { 0xf92e0c35, 0x37826145, 0xa7709a56,  691 },
953
  { 0x9bbcc7a1, 0x42b17ccb, 0x88a66076,  695 },
954
  { 0xc2abf989, 0x935ddbfe, 0x6acff893,  698 },
955
  { 0xf356f7eb, 0xf83552fe, 0x0583f6b8,  701 },
956
  { 0x98165af3, 0x7b2153de, 0xc3727a33,  705 },
957
  { 0xbe1bf1b0, 0x59e9a8d6, 0x744f18c0,  708 },
958
  { 0xeda2ee1c, 0x7064130c, 0x1162def0,  711 },
959
  { 0x9485d4d1, 0xc63e8be7, 0x8addcb56,  715 },
960
  { 0xb9a74a06, 0x37ce2ee1, 0x6d953e2b,  718 },
961
  { 0xe8111c87, 0xc5c1ba99, 0xc8fa8db6,  721 },
962
  { 0x910ab1d4, 0xdb9914a0, 0x1d9c9892,  725 },
963
  { 0xb54d5e4a, 0x127f59c8, 0x2503beb6,  728 },
964
  { 0xe2a0b5dc, 0x971f303a, 0x2e44ae64,  731 },
965
  { 0x8da471a9, 0xde737e24, 0x5ceaecfe,  735 },
966
  { 0xb10d8e14, 0x56105dad, 0x7425a83e,  738 },
967
  { 0xdd50f199, 0x6b947518, 0xd12f124e,  741 },
968
  { 0x8a5296ff, 0xe33cc92f, 0x82bd6b70,  745 },
969
  { 0xace73cbf, 0xdc0bfb7b, 0x636cc64d,  748 },
970
  { 0xd8210bef, 0xd30efa5a, 0x3c47f7e0,  751 },
971
  { 0x8714a775, 0xe3e95c78, 0x65acfaec,  755 },
972
  { 0xa8d9d153, 0x5ce3b396, 0x7f1839a7,  758 },
973
  { 0xd31045a8, 0x341ca07c, 0x1ede4811,  761 },
974
  { 0x83ea2b89, 0x2091e44d, 0x934aed0a,  765 },
975
  { 0xa4e4b66b, 0x68b65d60, 0xf81da84d,  768 },
976
  { 0xce1de406, 0x42e3f4b9, 0x36251260,  771 },
977
  { 0x80d2ae83, 0xe9ce78f3, 0xc1d72b7c,  775 },
978
  { 0xa1075a24, 0xe4421730, 0xb24cf65b,  778 },
979
  { 0xc94930ae, 0x1d529cfc, 0xdee033f2,  781 },
980
  { 0xfb9b7cd9, 0xa4a7443c, 0x169840ef,  784 },
981
  { 0x9d412e08, 0x06e88aa5, 0x8e1f2895,  788 },
982
  { 0xc491798a, 0x08a2ad4e, 0xf1a6f2ba,  791 },
983
  { 0xf5b5d7ec, 0x8acb58a2, 0xae10af69,  794 },
984
  { 0x9991a6f3, 0xd6bf1765, 0xacca6da1,  798 },
985
  { 0xbff610b0, 0xcc6edd3f, 0x17fd090a,  801 },
986
  { 0xeff394dc, 0xff8a948e, 0xddfc4b4c,  804 },
987
  { 0x95f83d0a, 0x1fb69cd9, 0x4abdaf10,  808 },
988
  { 0xbb764c4c, 0xa7a4440f, 0x9d6d1ad4,  811 },
989
  { 0xea53df5f, 0xd18d5513, 0x84c86189,  814 },
990
  { 0x92746b9b, 0xe2f8552c, 0x32fd3cf5,  818 },
991
  { 0xb7118682, 0xdbb66a77, 0x3fbc8c33,  821 },
992
  { 0xe4d5e823, 0x92a40515, 0x0fabaf3f,  824 },
993
  { 0x8f05b116, 0x3ba6832d, 0x29cb4d87,  828 },
994
  { 0xb2c71d5b, 0xca9023f8, 0x743e20e9,  831 },
995
  { 0xdf78e4b2, 0xbd342cf6, 0x914da924,  834 },
996
  { 0x8bab8eef, 0xb6409c1a, 0x1ad089b6,  838 },
997
  { 0xae9672ab, 0xa3d0c320, 0xa184ac24,  841 },
998
  { 0xda3c0f56, 0x8cc4f3e8, 0xc9e5d72d,  844 },
999
  { 0x88658996, 0x17fb1871, 0x7e2fa67c,  848 },
1000
  { 0xaa7eebfb, 0x9df9de8d, 0xddbb901b,  851 },
1001
  { 0xd51ea6fa, 0x85785631, 0x552a7422,  854 },
1002
  { 0x8533285c, 0x936b35de, 0xd53a8895,  858 },
1003
  { 0xa67ff273, 0xb8460356, 0x8a892aba,  861 },
1004
  { 0xd01fef10, 0xa657842c, 0x2d2b7569,  864 },
1005
  { 0x8213f56a, 0x67f6b29b, 0x9c3b2962,  868 },
1006
  { 0xa298f2c5, 0x01f45f42, 0x8349f3ba,  871 },
1007
  { 0xcb3f2f76, 0x42717713, 0x241c70a9,  874 },
1008
  { 0xfe0efb53, 0xd30dd4d7, 0xed238cd3,  877 },
1009
  { 0x9ec95d14, 0x63e8a506, 0xf4363804,  881 },
1010
  { 0xc67bb459, 0x7ce2ce48, 0xb143c605,  884 },
1011
  { 0xf81aa16f, 0xdc1b81da, 0xdd94b786,  887 },
1012
  { 0x9b10a4e5, 0xe9913128, 0xca7cf2b4,  891 },
1013
  { 0xc1d4ce1f, 0x63f57d72, 0xfd1c2f61,  894 },
1014
  { 0xf24a01a7, 0x3cf2dccf, 0xbc633b39,  897 },
1015
  { 0x976e4108, 0x8617ca01, 0xd5be0503,  901 },
1016
  { 0xbd49d14a, 0xa79dbc82, 0x4b2d8644,  904 },
1017
  { 0xec9c459d, 0x51852ba2, 0xddf8e7d6,  907 },
1018
  { 0x93e1ab82, 0x52f33b45, 0xcabb90e5,  911 },
1019
  { 0xb8da1662, 0xe7b00a17, 0x3d6a751f,  914 },
1020
  { 0xe7109bfb, 0xa19c0c9d, 0x0cc51267,  917 },
1021
  { 0x906a617d, 0x450187e2, 0x27fb2b80,  921 },
1022
  { 0xb484f9dc, 0x9641e9da, 0xb1f9f660,  924 },
1023
  { 0xe1a63853, 0xbbd26451, 0x5e7873f8,  927 },
1024
  { 0x8d07e334, 0x55637eb2, 0xdb0b487b,  931 },
1025
  { 0xb049dc01, 0x6abc5e5f, 0x91ce1a9a,  934 },
1026
  { 0xdc5c5301, 0xc56b75f7, 0x7641a140,  937 },
1027
  { 0x89b9b3e1, 0x1b6329ba, 0xa9e904c8,  941 },
1028
  { 0xac2820d9, 0x623bf429, 0x546345fa,  944 },
1029
  { 0xd732290f, 0xbacaf133, 0xa97c1779,  947 },
1030
  { 0x867f59a9, 0xd4bed6c0, 0x49ed8eab,  951 },
1031
  { 0xa81f3014, 0x49ee8c70, 0x5c68f256,  954 },
1032
  { 0xd226fc19, 0x5c6a2f8c, 0x73832eec,  957 },
1033
  { 0x83585d8f, 0xd9c25db7, 0xc831fd53,  961 },
1034
  { 0xa42e74f3, 0xd032f525, 0xba3e7ca8,  964 },
1035
  { 0xcd3a1230, 0xc43fb26f, 0x28ce1bd2,  967 },
1036
  { 0x80444b5e, 0x7aa7cf85, 0x7980d163,  971 },
1037
  { 0xa0555e36, 0x1951c366, 0xd7e105bc,  974 },
1038
  { 0xc86ab5c3, 0x9fa63440, 0x8dd9472b,  977 },
1039
  { 0xfa856334, 0x878fc150, 0xb14f98f6,  980 },
1040
  { 0x9c935e00, 0xd4b9d8d2, 0x6ed1bf9a,  984 },
1041
  { 0xc3b83581, 0x09e84f07, 0x0a862f80,  987 },
1042
  { 0xf4a642e1, 0x4c6262c8, 0xcd27bb61,  990 },
1043
  { 0x98e7e9cc, 0xcfbd7dbd, 0x8038d51c,  994 },
1044
  { 0xbf21e440, 0x03acdd2c, 0xe0470a63,  997 },
1045
  { 0xeeea5d50, 0x04981478, 0x1858ccfc, 1000 },
1046
  { 0x95527a52, 0x02df0ccb, 0x0f37801e, 1004 },
1047
  { 0xbaa718e6, 0x8396cffd, 0xd3056025, 1007 },
1048
  { 0xe950df20, 0x247c83fd, 0x47c6b82e, 1010 },
1049
  { 0x91d28b74, 0x16cdd27e, 0x4cdc331d, 1014 },
1050
  { 0xb6472e51, 0x1c81471d, 0xe0133fe4, 1017 },
1051
  { 0xe3d8f9e5, 0x63a198e5, 0x58180fdd, 1020 },
1052
  { 0x8e679c2f, 0x5e44ff8f, 0x570f09ea, 1024 },
1053
  { 0xb201833b, 0x35d63f73, 0x2cd2cc65, 1027 },
1054
  { 0xde81e40a, 0x034bcf4f, 0xf8077f7e, 1030 },
1055
  { 0x8b112e86, 0x420f6191, 0xfb04afaf, 1034 },
1056
  { 0xadd57a27, 0xd29339f6, 0x79c5db9a, 1037 },
1057
  { 0xd94ad8b1, 0xc7380874, 0x18375281, 1040 },
1058
  { 0x87cec76f, 0x1c830548, 0x8f229391, 1044 },
1059
  { 0xa9c2794a, 0xe3a3c69a, 0xb2eb3875, 1047 },
1060
  { 0xd433179d, 0x9c8cb841, 0x5fa60692, 1050 },
1061
  { 0x849feec2, 0x81d7f328, 0xdbc7c41b, 1054 },
1062
  { 0xa5c7ea73, 0x224deff3, 0x12b9b522, 1057 },
1063
  { 0xcf39e50f, 0xeae16bef, 0xd768226b, 1060 },
1064
  { 0x81842f29, 0xf2cce375, 0xe6a11583, 1064 },
1065
  { 0xa1e53af4, 0x6f801c53, 0x60495ae3, 1067 },
1066
  { 0xca5e89b1, 0x8b602368, 0x385bb19c, 1070 },
1067
  { 0xfcf62c1d, 0xee382c42, 0x46729e03, 1073 },
1068
  { 0x9e19db92, 0xb4e31ba9, 0x6c07a2c2, 1077 }
1069
  };
1070
 static short int Lhint[2098] = {
1071
     /*18,*/19,    19,    19,    19,    20,    20,    20,    21,    21,
1072
     21,    22,    22,    22,    23,    23,    23,    23,    24,    24,
1073
     24,    25,    25,    25,    26,    26,    26,    26,    27,    27,
1074
     27,    28,    28,    28,    29,    29,    29,    29,    30,    30,
1075
     30,    31,    31,    31,    32,    32,    32,    32,    33,    33,
1076
     33,    34,    34,    34,    35,    35,    35,    35,    36,    36,
1077
     36,    37,    37,    37,    38,    38,    38,    38,    39,    39,
1078
     39,    40,    40,    40,    41,    41,    41,    41,    42,    42,
1079
     42,    43,    43,    43,    44,    44,    44,    44,    45,    45,
1080
     45,    46,    46,    46,    47,    47,    47,    47,    48,    48,
1081
     48,    49,    49,    49,    50,    50,    50,    51,    51,    51,
1082
     51,    52,    52,    52,    53,    53,    53,    54,    54,    54,
1083
     54,    55,    55,    55,    56,    56,    56,    57,    57,    57,
1084
     57,    58,    58,    58,    59,    59,    59,    60,    60,    60,
1085
     60,    61,    61,    61,    62,    62,    62,    63,    63,    63,
1086
     63,    64,    64,    64,    65,    65,    65,    66,    66,    66,
1087
     66,    67,    67,    67,    68,    68,    68,    69,    69,    69,
1088
     69,    70,    70,    70,    71,    71,    71,    72,    72,    72,
1089
     72,    73,    73,    73,    74,    74,    74,    75,    75,    75,
1090
     75,    76,    76,    76,    77,    77,    77,    78,    78,    78,
1091
     78,    79,    79,    79,    80,    80,    80,    81,    81,    81,
1092
     82,    82,    82,    82,    83,    83,    83,    84,    84,    84,
1093
     85,    85,    85,    85,    86,    86,    86,    87,    87,    87,
1094
     88,    88,    88,    88,    89,    89,    89,    90,    90,    90,
1095
     91,    91,    91,    91,    92,    92,    92,    93,    93,    93,
1096
     94,    94,    94,    94,    95,    95,    95,    96,    96,    96,
1097
     97,    97,    97,    97,    98,    98,    98,    99,    99,    99,
1098
    100,   100,   100,   100,   101,   101,   101,   102,   102,   102,
1099
    103,   103,   103,   103,   104,   104,   104,   105,   105,   105,
1100
    106,   106,   106,   106,   107,   107,   107,   108,   108,   108,
1101
    109,   109,   109,   110,   110,   110,   110,   111,   111,   111,
1102
    112,   112,   112,   113,   113,   113,   113,   114,   114,   114,
1103
    115,   115,   115,   116,   116,   116,   116,   117,   117,   117,
1104
    118,   118,   118,   119,   119,   119,   119,   120,   120,   120,
1105
    121,   121,   121,   122,   122,   122,   122,   123,   123,   123,
1106
    124,   124,   124,   125,   125,   125,   125,   126,   126,   126,
1107
    127,   127,   127,   128,   128,   128,   128,   129,   129,   129,
1108
    130,   130,   130,   131,   131,   131,   131,   132,   132,   132,
1109
    133,   133,   133,   134,   134,   134,   134,   135,   135,   135,
1110
    136,   136,   136,   137,   137,   137,   137,   138,   138,   138,
1111
    139,   139,   139,   140,   140,   140,   141,   141,   141,   141,
1112
    142,   142,   142,   143,   143,   143,   144,   144,   144,   144,
1113
    145,   145,   145,   146,   146,   146,   147,   147,   147,   147,
1114
    148,   148,   148,   149,   149,   149,   150,   150,   150,   150,
1115
    151,   151,   151,   152,   152,   152,   153,   153,   153,   153,
1116
    154,   154,   154,   155,   155,   155,   156,   156,   156,   156,
1117
    157,   157,   157,   158,   158,   158,   159,   159,   159,   159,
1118
    160,   160,   160,   161,   161,   161,   162,   162,   162,   162,
1119
    163,   163,   163,   164,   164,   164,   165,   165,   165,   165,
1120
    166,   166,   166,   167,   167,   167,   168,   168,   168,   169,
1121
    169,   169,   169,   170,   170,   170,   171,   171,   171,   172,
1122
    172,   172,   172,   173,   173,   173,   174,   174,   174,   175,
1123
    175,   175,   175,   176,   176,   176,   177,   177,   177,   178,
1124
    178,   178,   178,   179,   179,   179,   180,   180,   180,   181,
1125
    181,   181,   181,   182,   182,   182,   183,   183,   183,   184,
1126
    184,   184,   184,   185,   185,   185,   186,   186,   186,   187,
1127
    187,   187,   187,   188,   188,   188,   189,   189,   189,   190,
1128
    190,   190,   190,   191,   191,   191,   192,   192,   192,   193,
1129
    193,   193,   193,   194,   194,   194,   195,   195,   195,   196,
1130
    196,   196,   197,   197,   197,   197,   198,   198,   198,   199,
1131
    199,   199,   200,   200,   200,   200,   201,   201,   201,   202,
1132
    202,   202,   203,   203,   203,   203,   204,   204,   204,   205,
1133
    205,   205,   206,   206,   206,   206,   207,   207,   207,   208,
1134
    208,   208,   209,   209,   209,   209,   210,   210,   210,   211,
1135
    211,   211,   212,   212,   212,   212,   213,   213,   213,   214,
1136
    214,   214,   215,   215,   215,   215,   216,   216,   216,   217,
1137
    217,   217,   218,   218,   218,   218,   219,   219,   219,   220,
1138
    220,   220,   221,   221,   221,   221,   222,   222,   222,   223,
1139
    223,   223,   224,   224,   224,   224,   225,   225,   225,   226,
1140
    226,   226,   227,   227,   227,   228,   228,   228,   228,   229,
1141
    229,   229,   230,   230,   230,   231,   231,   231,   231,   232,
1142
    232,   232,   233,   233,   233,   234,   234,   234,   234,   235,
1143
    235,   235,   236,   236,   236,   237,   237,   237,   237,   238,
1144
    238,   238,   239,   239,   239,   240,   240,   240,   240,   241,
1145
    241,   241,   242,   242,   242,   243,   243,   243,   243,   244,
1146
    244,   244,   245,   245,   245,   246,   246,   246,   246,   247,
1147
    247,   247,   248,   248,   248,   249,   249,   249,   249,   250,
1148
    250,   250,   251,   251,   251,   252,   252,   252,   252,   253,
1149
    253,   253,   254,   254,   254,   255,   255,   255,   256,   256,
1150
    256,   256,   257,   257,   257,   258,   258,   258,   259,   259,
1151
    259,   259,   260,   260,   260,   261,   261,   261,   262,   262,
1152
    262,   262,   263,   263,   263,   264,   264,   264,   265,   265,
1153
    265,   265,   266,   266,   266,   267,   267,   267,   268,   268,
1154
    268,   268,   269,   269,   269,   270,   270,   270,   271,   271,
1155
    271,   271,   272,   272,   272,   273,   273,   273,   274,   274,
1156
    274,   274,   275,   275,   275,   276,   276,   276,   277,   277,
1157
    277,   277,   278,   278,   278,   279,   279,   279,   280,   280,
1158
    280,   280,   281,   281,   281,   282,   282,   282,   283,   283,
1159
    283,   283,   284,   284,   284,   285,   285,   285,   286,   286,
1160
    286,   287,   287,   287,   287,   288,   288,   288,   289,   289,
1161
    289,   290,   290,   290,   290,   291,   291,   291,   292,   292,
1162
    292,   293,   293,   293,   293,   294,   294,   294,   295,   295,
1163
    295,   296,   296,   296,   296,   297,   297,   297,   298,   298,
1164
    298,   299,   299,   299,   299,   300,   300,   300,   301,   301,
1165
    301,   302,   302,   302,   302,   303,   303,   303,   304,   304,
1166
    304,   305,   305,   305,   305,   306,   306,   306,   307,   307,
1167
    307,   308,   308,   308,   308,   309,   309,   309,   310,   310,
1168
    310,   311,   311,   311,   311,   312,   312,   312,   313,   313,
1169
    313,   314,   314,   314,   315,   315,   315,   315,   316,   316,
1170
    316,   317,   317,   317,   318,   318,   318,   318,   319,   319,
1171
    319,   320,   320,   320,   321,   321,   321,   321,   322,   322,
1172
    322,   323,   323,   323,   324,   324,   324,   324,   325,   325,
1173
    325,   326,   326,   326,   327,   327,   327,   327,   328,   328,
1174
    328,   329,   329,   329,   330,   330,   330,   330,   331,   331,
1175
    331,   332,   332,   332,   333,   333,   333,   333,   334,   334,
1176
    334,   335,   335,   335,   336,   336,   336,   336,   337,   337,
1177
    337,   338,   338,   338,   339,   339,   339,   339,   340,   340,
1178
    340,   341,   341,   341,   342,   342,   342,   342,   343,   343,
1179
    343,   344,   344,   344,   345,   345,   345,   346,   346,   346,
1180
    346,   347,   347,   347,   348,   348,   348,   349,   349,   349,
1181
    349,   350,   350,   350,   351,   351,   351,   352,   352,   352,
1182
    352,   353,   353,   353,   354,   354,   354,   355,   355,   355,
1183
    355,   356,   356,   356,   357,   357,   357,   358,   358,   358,
1184
    358,   359,   359,   359,   360,   360,   360,   361,   361,   361,
1185
    361,   362,   362,   362,   363,   363,   363,   364,   364,   364,
1186
    364,   365,   365,   365,   366,   366,   366,   367,   367,   367,
1187
    367,   368,   368,   368,   369,   369,   369,   370,   370,   370,
1188
    370,   371,   371,   371,   372,   372,   372,   373,   373,   373,
1189
    374,   374,   374,   374,   375,   375,   375,   376,   376,   376,
1190
    377,   377,   377,   377,   378,   378,   378,   379,   379,   379,
1191
    380,   380,   380,   380,   381,   381,   381,   382,   382,   382,
1192
    383,   383,   383,   383,   384,   384,   384,   385,   385,   385,
1193
    386,   386,   386,   386,   387,   387,   387,   388,   388,   388,
1194
    389,   389,   389,   389,   390,   390,   390,   391,   391,   391,
1195
    392,   392,   392,   392,   393,   393,   393,   394,   394,   394,
1196
    395,   395,   395,   395,   396,   396,   396,   397,   397,   397,
1197
    398,   398,   398,   398,   399,   399,   399,   400,   400,   400,
1198
    401,   401,   401,   402,   402,   402,   402,   403,   403,   403,
1199
    404,   404,   404,   405,   405,   405,   405,   406,   406,   406,
1200
    407,   407,   407,   408,   408,   408,   408,   409,   409,   409,
1201
    410,   410,   410,   411,   411,   411,   411,   412,   412,   412,
1202
    413,   413,   413,   414,   414,   414,   414,   415,   415,   415,
1203
    416,   416,   416,   417,   417,   417,   417,   418,   418,   418,
1204
    419,   419,   419,   420,   420,   420,   420,   421,   421,   421,
1205
    422,   422,   422,   423,   423,   423,   423,   424,   424,   424,
1206
    425,   425,   425,   426,   426,   426,   426,   427,   427,   427,
1207
    428,   428,   428,   429,   429,   429,   429,   430,   430,   430,
1208
    431,   431,   431,   432,   432,   432,   433,   433,   433,   433,
1209
    434,   434,   434,   435,   435,   435,   436,   436,   436,   436,
1210
    437,   437,   437,   438,   438,   438,   439,   439,   439,   439,
1211
    440,   440,   440,   441,   441,   441,   442,   442,   442,   442,
1212
    443,   443,   443,   444,   444,   444,   445,   445,   445,   445,
1213
    446,   446,   446,   447,   447,   447,   448,   448,   448,   448,
1214
    449,   449,   449,   450,   450,   450,   451,   451,   451,   451,
1215
    452,   452,   452,   453,   453,   453,   454,   454,   454,   454,
1216
    455,   455,   455,   456,   456,   456,   457,   457,   457,   457,
1217
    458,   458,   458,   459,   459,   459,   460,   460,   460,   461,
1218
    461,   461,   461,   462,   462,   462,   463,   463,   463,   464,
1219
    464,   464,   464,   465,   465,   465,   466,   466,   466,   467,
1220
    467,   467,   467,   468,   468,   468,   469,   469,   469,   470,
1221
    470,   470,   470,   471,   471,   471,   472,   472,   472,   473,
1222
    473,   473,   473,   474,   474,   474,   475,   475,   475,   476,
1223
    476,   476,   476,   477,   477,   477,   478,   478,   478,   479,
1224
    479,   479,   479,   480,   480,   480,   481,   481,   481,   482,
1225
    482,   482,   482,   483,   483,   483,   484,   484,   484,   485,
1226
    485,   485,   485,   486,   486,   486,   487,   487,   487,   488,
1227
    488,   488,   488,   489,   489,   489,   490,   490,   490,   491,
1228
    491,   491,   492,   492,   492,   492,   493,   493,   493,   494,
1229
    494,   494,   495,   495,   495,   495,   496,   496,   496,   497,
1230
    497,   497,   498,   498,   498,   498,   499,   499,   499,   500,
1231
    500,   500,   501,   501,   501,   501,   502,   502,   502,   503,
1232
    503,   503,   504,   504,   504,   504,   505,   505,   505,   506,
1233
    506,   506,   507,   507,   507,   507,   508,   508,   508,   509,
1234
    509,   509,   510,   510,   510,   510,   511,   511,   511,   512,
1235
    512,   512,   513,   513,   513,   513,   514,   514,   514,   515,
1236
    515,   515,   516,   516,   516,   516,   517,   517,   517,   518,
1237
    518,   518,   519,   519,   519,   520,   520,   520,   520,   521,
1238
    521,   521,   522,   522,   522,   523,   523,   523,   523,   524,
1239
    524,   524,   525,   525,   525,   526,   526,   526,   526,   527,
1240
    527,   527,   528,   528,   528,   529,   529,   529,   529,   530,
1241
    530,   530,   531,   531,   531,   532,   532,   532,   532,   533,
1242
    533,   533,   534,   534,   534,   535,   535,   535,   535,   536,
1243
    536,   536,   537,   537,   537,   538,   538,   538,   538,   539,
1244
    539,   539,   540,   540,   540,   541,   541,   541,   541,   542,
1245
    542,   542,   543,   543,   543,   544,   544,   544,   544,   545,
1246
    545,   545,   546,   546,   546,   547,   547,   547,   548,   548,
1247
    548,   548,   549,   549,   549,   550,   550,   550,   551,   551,
1248
    551,   551,   552,   552,   552,   553,   553,   553,   554,   554,
1249
    554,   554,   555,   555,   555,   556,   556,   556,   557,   557,
1250
    557,   557,   558,   558,   558,   559,   559,   559,   560,   560,
1251
    560,   560,   561,   561,   561,   562,   562,   562,   563,   563,
1252
    563,   563,   564,   564,   564,   565,   565,   565,   566,   566,
1253
    566,   566,   567,   567,   567,   568,   568,   568,   569,   569,
1254
    569,   569,   570,   570,   570,   571,   571,   571,   572,   572,
1255
    572,   572,   573,   573,   573,   574,   574,   574,   575,   575,
1256
    575,   575,   576,   576,   576,   577,   577,   577,   578,   578,
1257
    578,   579,   579,   579,   579,   580,   580,   580,   581,   581,
1258
    581,   582,   582,   582,   582,   583,   583,   583,   584,   584,
1259
    584,   585,   585,   585,   585,   586,   586,   586,   587,   587,
1260
    587,   588,   588,   588,   588,   589,   589,   589,   590,   590,
1261
    590,   591,   591,   591,   591,   592,   592,   592,   593,   593,
1262
    593,   594,   594,   594,   594,   595,   595,   595,   596,   596,
1263
    596,   597,   597,   597,   597,   598,   598,   598,   599,   599,
1264
    599,   600,   600,   600,   600,   601,   601,   601,   602,   602,
1265
    602,   603,   603,   603,   603,   604,   604,   604,   605,   605,
1266
    605,   606,   606,   606,   607,   607,   607,   607,   608,   608,
1267
    608,   609,   609,   609,   610,   610,   610,   610,   611,   611,
1268
    611,   612,   612,   612,   613,   613,   613,   613,   614,   614,
1269
    614,   615,   615,   615,   616,   616,   616,   616,   617,   617,
1270
    617,   618,   618,   618,   619,   619,   619,   619,   620,   620,
1271
    620,   621,   621,   621,   622,   622,   622,   622,   623,   623,
1272
    623,   624,   624,   624,   625,   625,   625,   625,   626,   626,
1273
    626,   627,   627,   627,   628,   628,   628,   628,   629,   629,
1274
    629,   630,   630,   630,   631,   631,   631,   631,   632,   632,
1275
    632,   633,   633,   633,   634,   634,   634,   634,   635,   635,
1276
    635,   636,   636,   636,   637,   637,   637,   638,   638,   638,
1277
    638,   639,   639,   639,   640,   640,   640,   641,   641,   641,
1278
    641,   642,   642,   642,   643,   643,   643,   644,   644,   644,
1279
    644,   645,   645,   645,   646,   646,   646,   647,   647,   647,
1280
    647,   648,   648,   648,   649,   649,   649,   650,   650 };
1281
 static ULLong pfive[27] = {
1282
    5ll,
1283
    25ll,
1284
    125ll,
1285
    625ll,
1286
    3125ll,
1287
    15625ll,
1288
    78125ll,
1289
    390625ll,
1290
    1953125ll,
1291
    9765625ll,
1292
    48828125ll,
1293
    244140625ll,
1294
    1220703125ll,
1295
    6103515625ll,
1296
    30517578125ll,
1297
    152587890625ll,
1298
    762939453125ll,
1299
    3814697265625ll,
1300
    19073486328125ll,
1301
    95367431640625ll,
1302
    476837158203125ll,
1303
    2384185791015625ll,
1304
    11920928955078125ll,
1305
    59604644775390625ll,
1306
    298023223876953125ll,
1307
    1490116119384765625ll,
1308
    7450580596923828125ll
1309
    };
1310
1311
 static int pfivebits[25] = {3, 5, 7, 10, 12, 14, 17, 19, 21, 24, 26, 28, 31,
1312
           33, 35, 38, 40, 42, 45, 47, 49, 52, 54, 56, 59};
1313
#endif /*}*/
1314
#endif /*}} NO_LONG_LONG */
1315
1316
typedef union { double d; ULong L[2];
1317
#ifdef USE_BF96
1318
  ULLong LL;
1319
#endif
1320
  } U;
1321
1322
#ifdef IEEE_8087
1323
4.77M
#define word0(x) (x)->L[1]
1324
1.72M
#define word1(x) (x)->L[0]
1325
#else
1326
#define word0(x) (x)->L[0]
1327
#define word1(x) (x)->L[1]
1328
#endif
1329
1.91M
#define dval(x) (x)->d
1330
0
#define LLval(x) (x)->LL
1331
1332
#ifndef STRTOD_DIGLIM
1333
0
#define STRTOD_DIGLIM 40
1334
#endif
1335
1336
#ifdef DIGLIM_DEBUG
1337
extern int strtod_diglim;
1338
#else
1339
0
#define strtod_diglim STRTOD_DIGLIM
1340
#endif
1341
1342
/* The following definition of Storeinc is appropriate for MIPS processors.
1343
 * An alternative that might be better on some machines is
1344
 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
1345
 */
1346
#if defined(IEEE_8087) + defined(VAX)
1347
#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
1348
((unsigned short *)a)[0] = (unsigned short)c, a++)
1349
#else
1350
#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
1351
((unsigned short *)a)[1] = (unsigned short)c, a++)
1352
#endif
1353
1354
/* #define P DBL_MANT_DIG */
1355
/* Ten_pmax = floor(P*log(2)/log(5)) */
1356
/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
1357
/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
1358
/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
1359
1360
#ifdef IEEE_Arith
1361
37.6k
#define Exp_shift  20
1362
75.2k
#define Exp_shift1 20
1363
48.7k
#define Exp_msk1    0x100000
1364
#define Exp_msk11   0x100000
1365
3.87M
#define Exp_mask  0x7ff00000
1366
104k
#define P 53
1367
0
#define Nbits 53
1368
75.2k
#define Bias 1023
1369
0
#define Emax 1023
1370
0
#define Emin (-1022)
1371
0
#define Exp_1  0x3ff00000
1372
#define Exp_11 0x3ff00000
1373
0
#define Ebits 11
1374
37.6k
#define Frac_mask  0xfffff
1375
0
#define Frac_mask1 0xfffff
1376
0
#define Ten_pmax 22
1377
#define Bletch 0x10
1378
781k
#define Bndry_mask  0xfffff
1379
0
#define Bndry_mask1 0xfffff
1380
0
#define LSB 1
1381
1.91M
#define Sign_bit 0x80000000
1382
0
#define Log2P 1
1383
#define Tiny0 0
1384
0
#define Tiny1 1
1385
#define Quick_max 14
1386
#define Int_max 14
1387
#ifndef NO_IEEE_Scale
1388
#define Avoid_Underflow
1389
#ifdef Flush_Denorm /* debugging option */
1390
#undef Sudden_Underflow
1391
#endif
1392
#endif
1393
1394
#ifndef Flt_Rounds
1395
#ifdef FLT_ROUNDS
1396
153k
#define Flt_Rounds FLT_ROUNDS
1397
#else
1398
#define Flt_Rounds 1
1399
#endif
1400
#endif /*Flt_Rounds*/
1401
1402
#ifdef Honor_FLT_ROUNDS
1403
#undef Check_FLT_ROUNDS
1404
#define Check_FLT_ROUNDS
1405
#else
1406
153k
#define Rounding Flt_Rounds
1407
#endif
1408
1409
#else /* ifndef IEEE_Arith */
1410
#undef Check_FLT_ROUNDS
1411
#undef Honor_FLT_ROUNDS
1412
#undef SET_INEXACT
1413
#undef  Sudden_Underflow
1414
#define Sudden_Underflow
1415
#ifdef IBM
1416
#undef Flt_Rounds
1417
#define Flt_Rounds 0
1418
#define Exp_shift  24
1419
#define Exp_shift1 24
1420
#define Exp_msk1   0x1000000
1421
#define Exp_msk11  0x1000000
1422
#define Exp_mask  0x7f000000
1423
#define P 14
1424
#define Nbits 56
1425
#define Bias 65
1426
#define Emax 248
1427
#define Emin (-260)
1428
#define Exp_1  0x41000000
1429
#define Exp_11 0x41000000
1430
#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
1431
#define Frac_mask  0xffffff
1432
#define Frac_mask1 0xffffff
1433
#define Bletch 4
1434
#define Ten_pmax 22
1435
#define Bndry_mask  0xefffff
1436
#define Bndry_mask1 0xffffff
1437
#define LSB 1
1438
#define Sign_bit 0x80000000
1439
#define Log2P 4
1440
#define Tiny0 0x100000
1441
#define Tiny1 0
1442
#define Quick_max 14
1443
#define Int_max 15
1444
#else /* VAX */
1445
#undef Flt_Rounds
1446
#define Flt_Rounds 1
1447
#define Exp_shift  23
1448
#define Exp_shift1 7
1449
#define Exp_msk1    0x80
1450
#define Exp_msk11   0x800000
1451
#define Exp_mask  0x7f80
1452
#define P 56
1453
#define Nbits 56
1454
#define Bias 129
1455
#define Emax 126
1456
#define Emin (-129)
1457
#define Exp_1  0x40800000
1458
#define Exp_11 0x4080
1459
#define Ebits 8
1460
#define Frac_mask  0x7fffff
1461
#define Frac_mask1 0xffff007f
1462
#define Ten_pmax 24
1463
#define Bletch 2
1464
#define Bndry_mask  0xffff007f
1465
#define Bndry_mask1 0xffff007f
1466
#define LSB 0x10000
1467
#define Sign_bit 0x8000
1468
#define Log2P 1
1469
#define Tiny0 0x80
1470
#define Tiny1 0
1471
#define Quick_max 15
1472
#define Int_max 15
1473
#endif /* IBM, VAX */
1474
#endif /* IEEE_Arith */
1475
1476
#ifndef IEEE_Arith
1477
#define ROUND_BIASED
1478
#else
1479
#ifdef ROUND_BIASED_without_Round_Up
1480
#undef  ROUND_BIASED
1481
#define ROUND_BIASED
1482
#endif
1483
#endif
1484
1485
#ifdef RND_PRODQUOT
1486
#define rounded_product(a,b) a = rnd_prod(a, b)
1487
#define rounded_quotient(a,b) a = rnd_quot(a, b)
1488
extern double rnd_prod(double, double), rnd_quot(double, double);
1489
#else
1490
0
#define rounded_product(a,b) a *= b
1491
0
#define rounded_quotient(a,b) a /= b
1492
#endif
1493
1494
0
#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
1495
0
#define Big1 0xffffffff
1496
1497
#ifndef Pack_32
1498
#define Pack_32
1499
#endif
1500
1501
typedef struct BCinfo BCinfo;
1502
 struct
1503
BCinfo { int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk; };
1504
1505
4.76M
#define FFFFFFFF 0xffffffffUL
1506
1507
#ifdef MULTIPLE_THREADS
1508
#define MTa , PTI
1509
#define MTb , &TI
1510
#define MTd , ThInfo **PTI
1511
static unsigned int maxthreads = 0;
1512
#else
1513
#define MTa /*nothing*/
1514
#define MTb /*nothing*/
1515
#define MTd /*nothing*/
1516
#endif
1517
1518
2.13M
#define Kmax 7
1519
1520
#ifdef __cplusplus
1521
extern "C" double strtod(const char *s00, char **se);
1522
extern "C" char *dtoa(double d, int mode, int ndigits,
1523
      int *decpt, int *sign, char **rve);
1524
#endif
1525
1526
 struct
1527
Bigint {
1528
  struct Bigint *next;
1529
  int k, maxwds, sign, wds;
1530
  ULong x[1];
1531
  };
1532
1533
 typedef struct Bigint Bigint;
1534
 typedef struct
1535
ThInfo {
1536
  Bigint *Freelist[Kmax+1];
1537
  Bigint *P5s;
1538
  } ThInfo;
1539
1540
 static ThInfo TI0;
1541
1542
#ifdef MULTIPLE_THREADS
1543
 static ThInfo *TI1;
1544
 static int TI0_used;
1545
1546
 void
1547
set_max_dtoa_threads(unsigned int n)
1548
{
1549
  size_t L;
1550
1551
  if (n > maxthreads) {
1552
    L = n*sizeof(ThInfo);
1553
    if (TI1) {
1554
      TI1 = (ThInfo*)REALLOC(TI1, L);
1555
      memset(TI1 + maxthreads, 0, (n-maxthreads)*sizeof(ThInfo));
1556
      }
1557
    else {
1558
      TI1 = (ThInfo*)MALLOC(L);
1559
      if (TI0_used) {
1560
        memcpy(TI1, &TI0, sizeof(ThInfo));
1561
        if (n > 1)
1562
          memset(TI1 + 1, 0, L - sizeof(ThInfo));
1563
        memset(&TI0, 0, sizeof(ThInfo));
1564
        }
1565
      else
1566
        memset(TI1, 0, L);
1567
      }
1568
    maxthreads = n;
1569
    }
1570
  }
1571
1572
 static ThInfo*
1573
get_TI(void)
1574
{
1575
  unsigned int thno = dtoa_get_threadno();
1576
  if (thno < maxthreads)
1577
    return TI1 + thno;
1578
  if (thno == 0)
1579
    TI0_used = 1;
1580
  return &TI0;
1581
  }
1582
#define freelist TI->Freelist
1583
#define p5s TI->P5s
1584
#else
1585
2.85M
#define freelist TI0.Freelist
1586
35.0k
#define p5s TI0.P5s
1587
#endif
1588
1589
 static Bigint *
1590
Balloc(int k MTd)
1591
712k
{
1592
712k
  int x;
1593
712k
  Bigint *rv;
1594
712k
#ifndef Omit_Private_Memory
1595
712k
  unsigned int len;
1596
712k
#endif
1597
#ifdef MULTIPLE_THREADS
1598
  ThInfo *TI;
1599
1600
  if (!(TI = *PTI))
1601
    *PTI = TI = get_TI();
1602
  if (TI == &TI0)
1603
    ACQUIRE_DTOA_LOCK(0);
1604
#endif
1605
  /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
1606
  /* but this case seems very unlikely. */
1607
712k
  if (k <= Kmax && (rv = freelist[k]))
1608
712k
    freelist[k] = rv->next;
1609
26
  else {
1610
26
    x = 1 << k;
1611
#ifdef Omit_Private_Memory
1612
    rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
1613
#else
1614
26
    len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
1615
26
      /sizeof(double);
1616
26
    if (k <= Kmax && (unsigned long)(pmem_next - private_mem + len) <= PRIVATE_mem
1617
#ifdef MULTIPLE_THREADS
1618
      && TI == TI1
1619
#endif
1620
26
      ) {
1621
26
      rv = (Bigint*)pmem_next;
1622
26
      pmem_next += len;
1623
26
      }
1624
0
    else
1625
0
      rv = (Bigint*)MALLOC(len*sizeof(double));
1626
26
#endif
1627
26
    rv->k = k;
1628
26
    rv->maxwds = x;
1629
26
    }
1630
#ifdef MULTIPLE_THREADS
1631
  if (TI == &TI0)
1632
    FREE_DTOA_LOCK(0);
1633
#endif
1634
712k
  rv->sign = rv->wds = 0;
1635
712k
  return rv;
1636
712k
  }
1637
1638
 static void
1639
Bfree(Bigint *v MTd)
1640
712k
{
1641
#ifdef MULTIPLE_THREADS
1642
  ThInfo *TI;
1643
#endif
1644
712k
  if (v) {
1645
712k
    if (v->k > Kmax)
1646
0
      FREE((void*)v);
1647
712k
    else {
1648
#ifdef MULTIPLE_THREADS
1649
      if (!(TI = *PTI))
1650
        *PTI = TI = get_TI();
1651
      if (TI == &TI0)
1652
        ACQUIRE_DTOA_LOCK(0);
1653
#endif
1654
712k
      v->next = freelist[v->k];
1655
712k
      freelist[v->k] = v;
1656
#ifdef MULTIPLE_THREADS
1657
      if (TI == &TI0)
1658
        FREE_DTOA_LOCK(0);
1659
#endif
1660
712k
      }
1661
712k
    }
1662
712k
  }
1663
1664
0
#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
1665
0
y->wds*sizeof(Long) + 2*sizeof(int))
1666
1667
 static Bigint *
1668
multadd(Bigint *b, int m, int a MTd)  /* multiply by m and add a */
1669
893k
{
1670
893k
  int i, wds;
1671
893k
#ifdef ULLong
1672
893k
  ULong *x;
1673
893k
  ULLong carry, y;
1674
#else
1675
  ULong carry, *x, y;
1676
#ifdef Pack_32
1677
  ULong xi, z;
1678
#endif
1679
#endif
1680
893k
  Bigint *b1;
1681
1682
893k
  wds = b->wds;
1683
893k
  x = b->x;
1684
893k
  i = 0;
1685
893k
  carry = a;
1686
1.70M
  do {
1687
1.70M
#ifdef ULLong
1688
1.70M
    y = *x * (ULLong)m + carry;
1689
1.70M
    carry = y >> 32;
1690
1.70M
    *x++ = y & FFFFFFFF;
1691
#else
1692
#ifdef Pack_32
1693
    xi = *x;
1694
    y = (xi & 0xffff) * m + carry;
1695
    z = (xi >> 16) * m + (y >> 16);
1696
    carry = z >> 16;
1697
    *x++ = (z << 16) + (y & 0xffff);
1698
#else
1699
    y = *x * m + carry;
1700
    carry = y >> 16;
1701
    *x++ = y & 0xffff;
1702
#endif
1703
#endif
1704
1.70M
    }
1705
1.70M
    while(++i < wds);
1706
893k
  if (carry) {
1707
29.7k
    if (wds >= b->maxwds) {
1708
0
      b1 = Balloc(b->k+1 MTa);
1709
0
      Bcopy(b1, b);
1710
0
      Bfree(b MTa);
1711
0
      b = b1;
1712
0
      }
1713
29.7k
    b->x[wds++] = carry;
1714
29.7k
    b->wds = wds;
1715
29.7k
    }
1716
893k
  return b;
1717
893k
  }
1718
1719
 static Bigint *
1720
s2b(const char *s, int nd0, int nd, ULong y9, int dplen MTd)
1721
0
{
1722
0
  Bigint *b;
1723
0
  int i, k;
1724
0
  Long x, y;
1725
1726
0
  x = (nd + 8) / 9;
1727
0
  for(k = 0, y = 1; x > y; y <<= 1, k++) ;
1728
0
#ifdef Pack_32
1729
0
  b = Balloc(k MTa);
1730
0
  b->x[0] = y9;
1731
0
  b->wds = 1;
1732
#else
1733
  b = Balloc(k+1 MTa);
1734
  b->x[0] = y9 & 0xffff;
1735
  b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
1736
#endif
1737
1738
0
  i = 9;
1739
0
  if (9 < nd0) {
1740
0
    s += 9;
1741
0
    do b = multadd(b, 10, *s++ - '0' MTa);
1742
0
      while(++i < nd0);
1743
0
    s += dplen;
1744
0
    }
1745
0
  else
1746
0
    s += dplen + 9;
1747
0
  for(; i < nd; i++)
1748
0
    b = multadd(b, 10, *s++ - '0' MTa);
1749
0
  return b;
1750
0
  }
1751
1752
 static int
1753
hi0bits(ULong x)
1754
37.6k
{
1755
37.6k
  int k = 0;
1756
1757
37.6k
  if (!(x & 0xffff0000)) {
1758
33.2k
    k = 16;
1759
33.2k
    x <<= 16;
1760
33.2k
    }
1761
37.6k
  if (!(x & 0xff000000)) {
1762
34.3k
    k += 8;
1763
34.3k
    x <<= 8;
1764
34.3k
    }
1765
37.6k
  if (!(x & 0xf0000000)) {
1766
5.75k
    k += 4;
1767
5.75k
    x <<= 4;
1768
5.75k
    }
1769
37.6k
  if (!(x & 0xc0000000)) {
1770
31.0k
    k += 2;
1771
31.0k
    x <<= 2;
1772
31.0k
    }
1773
37.6k
  if (!(x & 0x80000000)) {
1774
6.80k
    k++;
1775
6.80k
    if (!(x & 0x40000000))
1776
0
      return 32;
1777
6.80k
    }
1778
37.6k
  return k;
1779
37.6k
  }
1780
1781
 static int
1782
lo0bits(ULong *y)
1783
37.6k
{
1784
37.6k
  int k;
1785
37.6k
  ULong x = *y;
1786
1787
37.6k
  if (x & 7) {
1788
31.7k
    if (x & 1)
1789
28.6k
      return 0;
1790
3.07k
    if (x & 2) {
1791
1.96k
      *y = x >> 1;
1792
1.96k
      return 1;
1793
1.96k
      }
1794
1.10k
    *y = x >> 2;
1795
1.10k
    return 2;
1796
3.07k
    }
1797
5.86k
  k = 0;
1798
5.86k
  if (!(x & 0xffff)) {
1799
1.59k
    k = 16;
1800
1.59k
    x >>= 16;
1801
1.59k
    }
1802
5.86k
  if (!(x & 0xff)) {
1803
3.33k
    k += 8;
1804
3.33k
    x >>= 8;
1805
3.33k
    }
1806
5.86k
  if (!(x & 0xf)) {
1807
2.33k
    k += 4;
1808
2.33k
    x >>= 4;
1809
2.33k
    }
1810
5.86k
  if (!(x & 0x3)) {
1811
4.35k
    k += 2;
1812
4.35k
    x >>= 2;
1813
4.35k
    }
1814
5.86k
  if (!(x & 1)) {
1815
2.62k
    k++;
1816
2.62k
    x >>= 1;
1817
2.62k
    if (!x)
1818
0
      return 32;
1819
2.62k
    }
1820
5.86k
  *y = x;
1821
5.86k
  return k;
1822
5.86k
  }
1823
1824
 static Bigint *
1825
i2b(int i MTd)
1826
66.7k
{
1827
66.7k
  Bigint *b;
1828
1829
66.7k
  b = Balloc(1 MTa);
1830
66.7k
  b->x[0] = i;
1831
66.7k
  b->wds = 1;
1832
66.7k
  return b;
1833
66.7k
  }
1834
1835
 static Bigint *
1836
mult(Bigint *a, Bigint *b MTd)
1837
42.1k
{
1838
42.1k
  Bigint *c;
1839
42.1k
  int k, wa, wb, wc;
1840
42.1k
  ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
1841
42.1k
  ULong y;
1842
42.1k
#ifdef ULLong
1843
42.1k
  ULLong carry, z;
1844
#else
1845
  ULong carry, z;
1846
#ifdef Pack_32
1847
  ULong z2;
1848
#endif
1849
#endif
1850
1851
42.1k
  if (a->wds < b->wds) {
1852
31.6k
    c = a;
1853
31.6k
    a = b;
1854
31.6k
    b = c;
1855
31.6k
    }
1856
42.1k
  k = a->k;
1857
42.1k
  wa = a->wds;
1858
42.1k
  wb = b->wds;
1859
42.1k
  wc = wa + wb;
1860
42.1k
  if (wc > a->maxwds)
1861
30.5k
    k++;
1862
42.1k
  c = Balloc(k MTa);
1863
179k
  for(x = c->x, xa = x + wc; x < xa; x++)
1864
137k
    *x = 0;
1865
42.1k
  xa = a->x;
1866
42.1k
  xae = xa + wa;
1867
42.1k
  xb = b->x;
1868
42.1k
  xbe = xb + wb;
1869
42.1k
  xc0 = c->x;
1870
42.1k
#ifdef ULLong
1871
90.1k
  for(; xb < xbe; xc0++) {
1872
47.9k
    if ((y = *xb++)) {
1873
47.9k
      x = xa;
1874
47.9k
      xc = xc0;
1875
47.9k
      carry = 0;
1876
141k
      do {
1877
141k
        z = *x++ * (ULLong)y + *xc + carry;
1878
141k
        carry = z >> 32;
1879
141k
        *xc++ = z & FFFFFFFF;
1880
141k
        }
1881
141k
        while(x < xae);
1882
47.9k
      *xc = carry;
1883
47.9k
      }
1884
47.9k
    }
1885
#else
1886
#ifdef Pack_32
1887
  for(; xb < xbe; xb++, xc0++) {
1888
    if ((y = *xb & 0xffff)) {
1889
      x = xa;
1890
      xc = xc0;
1891
      carry = 0;
1892
      do {
1893
        z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
1894
        carry = z >> 16;
1895
        z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
1896
        carry = z2 >> 16;
1897
        Storeinc(xc, z2, z);
1898
        }
1899
        while(x < xae);
1900
      *xc = carry;
1901
      }
1902
    if ((y = *xb >> 16)) {
1903
      x = xa;
1904
      xc = xc0;
1905
      carry = 0;
1906
      z2 = *xc;
1907
      do {
1908
        z = (*x & 0xffff) * y + (*xc >> 16) + carry;
1909
        carry = z >> 16;
1910
        Storeinc(xc, z, z2);
1911
        z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
1912
        carry = z2 >> 16;
1913
        }
1914
        while(x < xae);
1915
      *xc = z2;
1916
      }
1917
    }
1918
#else
1919
  for(; xb < xbe; xc0++) {
1920
    if (y = *xb++) {
1921
      x = xa;
1922
      xc = xc0;
1923
      carry = 0;
1924
      do {
1925
        z = *x++ * y + *xc + carry;
1926
        carry = z >> 16;
1927
        *xc++ = z & 0xffff;
1928
        }
1929
        while(x < xae);
1930
      *xc = carry;
1931
      }
1932
    }
1933
#endif
1934
#endif
1935
81.5k
  for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
1936
42.1k
  c->wds = wc;
1937
42.1k
  return c;
1938
42.1k
  }
1939
1940
 static Bigint *
1941
pow5mult(Bigint *b, int k MTd)
1942
37.6k
{
1943
37.6k
  Bigint *b1, *p5, *p51;
1944
#ifdef MULTIPLE_THREADS
1945
  ThInfo *TI;
1946
#endif
1947
37.6k
  int i;
1948
37.6k
  static int p05[3] = { 5, 25, 125 };
1949
1950
37.6k
  if ((i = k & 3))
1951
7.82k
    b = multadd(b, p05[i-1], 0 MTa);
1952
1953
37.6k
  if (!(k >>= 2))
1954
2.58k
    return b;
1955
#ifdef  MULTIPLE_THREADS
1956
  if (!(TI = *PTI))
1957
    *PTI = TI = get_TI();
1958
#endif
1959
35.0k
  if (!(p5 = p5s)) {
1960
    /* first time */
1961
#ifdef MULTIPLE_THREADS
1962
    if (!(TI = *PTI))
1963
      *PTI = TI = get_TI();
1964
    if (TI == &TI0)
1965
      ACQUIRE_DTOA_LOCK(1);
1966
    if (!(p5 = p5s)) {
1967
      p5 = p5s = i2b(625 MTa);
1968
      p5->next = 0;
1969
      }
1970
    if (TI == &TI0)
1971
      FREE_DTOA_LOCK(1);
1972
#else
1973
1
    p5 = p5s = i2b(625 MTa);
1974
1
    p5->next = 0;
1975
1
#endif
1976
1
    }
1977
104k
  for(;;) {
1978
104k
    if (k & 1) {
1979
41.7k
      b1 = mult(b, p5 MTa);
1980
41.7k
      Bfree(b MTa);
1981
41.7k
      b = b1;
1982
41.7k
      }
1983
104k
    if (!(k >>= 1))
1984
35.0k
      break;
1985
69.1k
    if (!(p51 = p5->next)) {
1986
#ifdef MULTIPLE_THREADS
1987
      if (!TI && !(TI = *PTI))
1988
        *PTI = TI = get_TI();
1989
      if (TI == &TI0)
1990
        ACQUIRE_DTOA_LOCK(1);
1991
      if (!(p51 = p5->next)) {
1992
        p51 = p5->next = mult(p5,p5 MTa);
1993
        p51->next = 0;
1994
        }
1995
      if (TI == &TI0)
1996
        FREE_DTOA_LOCK(1);
1997
#else
1998
6
      p51 = p5->next = mult(p5,p5);
1999
6
      p51->next = 0;
2000
6
#endif
2001
6
      }
2002
69.1k
    p5 = p51;
2003
69.1k
    }
2004
35.0k
  return b;
2005
37.6k
  }
2006
2007
 static Bigint *
2008
lshift(Bigint *b, int k MTd)
2009
107k
{
2010
107k
  int i, k1, n, n1;
2011
107k
  Bigint *b1;
2012
107k
  ULong *x, *x1, *xe, z;
2013
2014
107k
#ifdef Pack_32
2015
107k
  n = k >> 5;
2016
#else
2017
  n = k >> 4;
2018
#endif
2019
107k
  k1 = b->k;
2020
107k
  n1 = n + b->wds + 1;
2021
146k
  for(i = b->maxwds; n1 > i; i <<= 1)
2022
38.9k
    k1++;
2023
107k
  b1 = Balloc(k1 MTa);
2024
107k
  x1 = b1->x;
2025
127k
  for(i = 0; i < n; i++)
2026
20.2k
    *x1++ = 0;
2027
107k
  x = b->x;
2028
107k
  xe = x + b->wds;
2029
107k
#ifdef Pack_32
2030
107k
  if (k &= 0x1f) {
2031
106k
    k1 = 32 - k;
2032
106k
    z = 0;
2033
203k
    do {
2034
203k
      *x1++ = *x << k | z;
2035
203k
      z = *x++ >> k1;
2036
203k
      }
2037
203k
      while(x < xe);
2038
106k
    if ((*x1 = z))
2039
1.81k
      ++n1;
2040
106k
    }
2041
#else
2042
  if (k &= 0xf) {
2043
    k1 = 16 - k;
2044
    z = 0;
2045
    do {
2046
      *x1++ = *x << k  & 0xffff | z;
2047
      z = *x++ >> k1;
2048
      }
2049
      while(x < xe);
2050
    if (*x1 = z)
2051
      ++n1;
2052
    }
2053
#endif
2054
984
  else do
2055
3.34k
    *x1++ = *x++;
2056
3.34k
    while(x < xe);
2057
107k
  b1->wds = n1 - 1;
2058
107k
  Bfree(b MTa);
2059
107k
  return b1;
2060
107k
  }
2061
2062
 static int
2063
cmp(Bigint *a, Bigint *b)
2064
1.86M
{
2065
1.86M
  ULong *xa, *xa0, *xb, *xb0;
2066
1.86M
  int i, j;
2067
2068
1.86M
  i = a->wds;
2069
1.86M
  j = b->wds;
2070
#ifdef DEBUG
2071
  if (i > 1 && !a->x[i-1])
2072
    Bug("cmp called with a->x[a->wds-1] == 0");
2073
  if (j > 1 && !b->x[j-1])
2074
    Bug("cmp called with b->x[b->wds-1] == 0");
2075
#endif
2076
1.86M
  if (i -= j)
2077
407k
    return i;
2078
1.46M
  xa0 = a->x;
2079
1.46M
  xa = xa0 + j;
2080
1.46M
  xb0 = b->x;
2081
1.46M
  xb = xb0 + j;
2082
1.49M
  for(;;) {
2083
1.49M
    if (*--xa != *--xb)
2084
1.42M
      return *xa < *xb ? -1 : 1;
2085
72.9k
    if (xa <= xa0)
2086
36.6k
      break;
2087
72.9k
    }
2088
36.6k
  return 0;
2089
1.46M
  }
2090
2091
 static Bigint *
2092
diff(Bigint *a, Bigint *b MTd)
2093
458k
{
2094
458k
  Bigint *c;
2095
458k
  int i, wa, wb;
2096
458k
  ULong *xa, *xae, *xb, *xbe, *xc;
2097
458k
#ifdef ULLong
2098
458k
  ULLong borrow, y;
2099
#else
2100
  ULong borrow, y;
2101
#ifdef Pack_32
2102
  ULong z;
2103
#endif
2104
#endif
2105
2106
458k
  i = cmp(a,b);
2107
458k
  if (!i) {
2108
0
    c = Balloc(0 MTa);
2109
0
    c->wds = 1;
2110
0
    c->x[0] = 0;
2111
0
    return c;
2112
0
    }
2113
458k
  if (i < 0) {
2114
976
    c = a;
2115
976
    a = b;
2116
976
    b = c;
2117
976
    i = 1;
2118
976
    }
2119
457k
  else
2120
457k
    i = 0;
2121
458k
  c = Balloc(a->k MTa);
2122
458k
  c->sign = i;
2123
458k
  wa = a->wds;
2124
458k
  xa = a->x;
2125
458k
  xae = xa + wa;
2126
458k
  wb = b->wds;
2127
458k
  xb = b->x;
2128
458k
  xbe = xb + wb;
2129
458k
  xc = c->x;
2130
458k
  borrow = 0;
2131
458k
#ifdef ULLong
2132
756k
  do {
2133
756k
    y = (ULLong)*xa++ - *xb++ - borrow;
2134
756k
    borrow = y >> 32 & (ULong)1;
2135
756k
    *xc++ = y & FFFFFFFF;
2136
756k
    }
2137
756k
    while(xb < xbe);
2138
661k
  while(xa < xae) {
2139
203k
    y = *xa++ - borrow;
2140
203k
    borrow = y >> 32 & (ULong)1;
2141
203k
    *xc++ = y & FFFFFFFF;
2142
203k
    }
2143
#else
2144
#ifdef Pack_32
2145
  do {
2146
    y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
2147
    borrow = (y & 0x10000) >> 16;
2148
    z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
2149
    borrow = (z & 0x10000) >> 16;
2150
    Storeinc(xc, z, y);
2151
    }
2152
    while(xb < xbe);
2153
  while(xa < xae) {
2154
    y = (*xa & 0xffff) - borrow;
2155
    borrow = (y & 0x10000) >> 16;
2156
    z = (*xa++ >> 16) - borrow;
2157
    borrow = (z & 0x10000) >> 16;
2158
    Storeinc(xc, z, y);
2159
    }
2160
#else
2161
  do {
2162
    y = *xa++ - *xb++ - borrow;
2163
    borrow = (y & 0x10000) >> 16;
2164
    *xc++ = y & 0xffff;
2165
    }
2166
    while(xb < xbe);
2167
  while(xa < xae) {
2168
    y = *xa++ - borrow;
2169
    borrow = (y & 0x10000) >> 16;
2170
    *xc++ = y & 0xffff;
2171
    }
2172
#endif
2173
#endif
2174
458k
  while(!*--xc)
2175
0
    wa--;
2176
458k
  c->wds = wa;
2177
458k
  return c;
2178
458k
  }
2179
2180
 static double
2181
ulp(U *x)
2182
0
{
2183
0
  Long L;
2184
0
  U u;
2185
2186
0
  L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
2187
#ifndef Avoid_Underflow
2188
#ifndef Sudden_Underflow
2189
  if (L > 0) {
2190
#endif
2191
#endif
2192
#ifdef IBM
2193
    L |= Exp_msk1 >> 4;
2194
#endif
2195
0
    word0(&u) = L;
2196
0
    word1(&u) = 0;
2197
#ifndef Avoid_Underflow
2198
#ifndef Sudden_Underflow
2199
    }
2200
  else {
2201
    L = -L >> Exp_shift;
2202
    if (L < Exp_shift) {
2203
      word0(&u) = 0x80000 >> L;
2204
      word1(&u) = 0;
2205
      }
2206
    else {
2207
      word0(&u) = 0;
2208
      L -= Exp_shift;
2209
      word1(&u) = L >= 31 ? 1 : 1 << 31 - L;
2210
      }
2211
    }
2212
#endif
2213
#endif
2214
0
  return dval(&u);
2215
0
  }
2216
2217
 static double
2218
b2d(Bigint *a, int *e)
2219
0
{
2220
0
  ULong *xa, *xa0, w, y, z;
2221
0
  int k;
2222
0
  U d;
2223
#ifdef VAX
2224
  ULong d0, d1;
2225
#else
2226
0
#define d0 word0(&d)
2227
0
#define d1 word1(&d)
2228
0
#endif
2229
2230
0
  xa0 = a->x;
2231
0
  xa = xa0 + a->wds;
2232
0
  y = *--xa;
2233
#ifdef DEBUG
2234
  if (!y) Bug("zero y in b2d");
2235
#endif
2236
0
  k = hi0bits(y);
2237
0
  *e = 32 - k;
2238
0
#ifdef Pack_32
2239
0
  if (k < Ebits) {
2240
0
    d0 = Exp_1 | y >> (Ebits - k);
2241
0
    w = xa > xa0 ? *--xa : 0;
2242
0
    d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
2243
0
    goto ret_d;
2244
0
    }
2245
0
  z = xa > xa0 ? *--xa : 0;
2246
0
  if (k -= Ebits) {
2247
0
    d0 = Exp_1 | y << k | z >> (32 - k);
2248
0
    y = xa > xa0 ? *--xa : 0;
2249
0
    d1 = z << k | y >> (32 - k);
2250
0
    }
2251
0
  else {
2252
0
    d0 = Exp_1 | y;
2253
0
    d1 = z;
2254
0
    }
2255
#else
2256
  if (k < Ebits + 16) {
2257
    z = xa > xa0 ? *--xa : 0;
2258
    d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
2259
    w = xa > xa0 ? *--xa : 0;
2260
    y = xa > xa0 ? *--xa : 0;
2261
    d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
2262
    goto ret_d;
2263
    }
2264
  z = xa > xa0 ? *--xa : 0;
2265
  w = xa > xa0 ? *--xa : 0;
2266
  k -= Ebits + 16;
2267
  d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
2268
  y = xa > xa0 ? *--xa : 0;
2269
  d1 = w << k + 16 | y << k;
2270
#endif
2271
0
 ret_d:
2272
#ifdef VAX
2273
  word0(&d) = d0 >> 16 | d0 << 16;
2274
  word1(&d) = d1 >> 16 | d1 << 16;
2275
#else
2276
0
#undef d0
2277
0
#undef d1
2278
0
#endif
2279
0
  return dval(&d);
2280
0
  }
2281
2282
 static Bigint *
2283
d2b(U *d, int *e, int *bits MTd)
2284
37.6k
{
2285
37.6k
  Bigint *b;
2286
37.6k
  int de, k;
2287
37.6k
  ULong *x, y, z;
2288
37.6k
#ifndef Sudden_Underflow
2289
37.6k
  int i;
2290
37.6k
#endif
2291
#ifdef VAX
2292
  ULong d0, d1;
2293
  d0 = word0(d) >> 16 | word0(d) << 16;
2294
  d1 = word1(d) >> 16 | word1(d) << 16;
2295
#else
2296
112k
#define d0 word0(d)
2297
37.6k
#define d1 word1(d)
2298
37.6k
#endif
2299
2300
37.6k
#ifdef Pack_32
2301
37.6k
  b = Balloc(1 MTa);
2302
#else
2303
  b = Balloc(2 MTa);
2304
#endif
2305
37.6k
  x = b->x;
2306
2307
37.6k
  z = d0 & Frac_mask;
2308
37.6k
  d0 &= 0x7fffffff; /* clear sign bit, which we ignore */
2309
#ifdef Sudden_Underflow
2310
  de = (int)(d0 >> Exp_shift);
2311
#ifndef IBM
2312
  z |= Exp_msk11;
2313
#endif
2314
#else
2315
37.6k
  if ((de = (int)(d0 >> Exp_shift)))
2316
37.5k
    z |= Exp_msk1;
2317
37.6k
#endif
2318
37.6k
#ifdef Pack_32
2319
37.6k
  if ((y = d1)) {
2320
33.4k
    if ((k = lo0bits(&y))) {
2321
5.09k
      x[0] = y | z << (32 - k);
2322
5.09k
      z >>= k;
2323
5.09k
      }
2324
28.4k
    else
2325
28.4k
      x[0] = y;
2326
33.4k
#ifndef Sudden_Underflow
2327
33.4k
    i =
2328
33.4k
#endif
2329
33.4k
        b->wds = (x[1] = z) ? 2 : 1;
2330
33.4k
    }
2331
4.11k
  else {
2332
4.11k
    k = lo0bits(&z);
2333
4.11k
    x[0] = z;
2334
4.11k
#ifndef Sudden_Underflow
2335
4.11k
    i =
2336
4.11k
#endif
2337
4.11k
        b->wds = 1;
2338
4.11k
    k += 32;
2339
4.11k
    }
2340
#else
2341
  if (y = d1) {
2342
    if (k = lo0bits(&y))
2343
      if (k >= 16) {
2344
        x[0] = y | z << 32 - k & 0xffff;
2345
        x[1] = z >> k - 16 & 0xffff;
2346
        x[2] = z >> k;
2347
        i = 2;
2348
        }
2349
      else {
2350
        x[0] = y & 0xffff;
2351
        x[1] = y >> 16 | z << 16 - k & 0xffff;
2352
        x[2] = z >> k & 0xffff;
2353
        x[3] = z >> k+16;
2354
        i = 3;
2355
        }
2356
    else {
2357
      x[0] = y & 0xffff;
2358
      x[1] = y >> 16;
2359
      x[2] = z & 0xffff;
2360
      x[3] = z >> 16;
2361
      i = 3;
2362
      }
2363
    }
2364
  else {
2365
#ifdef DEBUG
2366
    if (!z)
2367
      Bug("Zero passed to d2b");
2368
#endif
2369
    k = lo0bits(&z);
2370
    if (k >= 16) {
2371
      x[0] = z;
2372
      i = 0;
2373
      }
2374
    else {
2375
      x[0] = z & 0xffff;
2376
      x[1] = z >> 16;
2377
      i = 1;
2378
      }
2379
    k += 32;
2380
    }
2381
  while(!x[i])
2382
    --i;
2383
  b->wds = i + 1;
2384
#endif
2385
37.6k
#ifndef Sudden_Underflow
2386
37.6k
  if (de) {
2387
37.5k
#endif
2388
#ifdef IBM
2389
    *e = (de - Bias - (P-1) << 2) + k;
2390
    *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
2391
#else
2392
37.5k
    *e = de - Bias - (P-1) + k;
2393
37.5k
    *bits = P - k;
2394
37.5k
#endif
2395
37.5k
#ifndef Sudden_Underflow
2396
37.5k
    }
2397
75
  else {
2398
75
    *e = de - Bias - (P-1) + 1 + k;
2399
75
#ifdef Pack_32
2400
75
    *bits = 32*i - hi0bits(x[i-1]);
2401
#else
2402
    *bits = (i+2)*16 - hi0bits(x[i]);
2403
#endif
2404
75
    }
2405
37.6k
#endif
2406
37.6k
  return b;
2407
37.6k
  }
2408
#undef d0
2409
#undef d1
2410
2411
 static double
2412
ratio(Bigint *a, Bigint *b)
2413
0
{
2414
0
  U da, db;
2415
0
  int k, ka, kb;
2416
2417
0
  dval(&da) = b2d(a, &ka);
2418
0
  dval(&db) = b2d(b, &kb);
2419
0
#ifdef Pack_32
2420
0
  k = ka - kb + 32*(a->wds - b->wds);
2421
#else
2422
  k = ka - kb + 16*(a->wds - b->wds);
2423
#endif
2424
#ifdef IBM
2425
  if (k > 0) {
2426
    word0(&da) += (k >> 2)*Exp_msk1;
2427
    if (k &= 3)
2428
      dval(&da) *= 1 << k;
2429
    }
2430
  else {
2431
    k = -k;
2432
    word0(&db) += (k >> 2)*Exp_msk1;
2433
    if (k &= 3)
2434
      dval(&db) *= 1 << k;
2435
    }
2436
#else
2437
0
  if (k > 0)
2438
0
    word0(&da) += k*Exp_msk1;
2439
0
  else {
2440
0
    k = -k;
2441
0
    word0(&db) += k*Exp_msk1;
2442
0
    }
2443
0
#endif
2444
0
  return dval(&da) / dval(&db);
2445
0
  }
2446
2447
 static const double
2448
tens[] = {
2449
    1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
2450
    1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
2451
    1e20, 1e21, 1e22
2452
#ifdef VAX
2453
    , 1e23, 1e24
2454
#endif
2455
    };
2456
2457
 static const double
2458
#ifdef IEEE_Arith
2459
bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
2460
static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
2461
#ifdef Avoid_Underflow
2462
    9007199254740992.*9007199254740992.e-256
2463
    /* = 2^106 * 1e-256 */
2464
#else
2465
    1e-256
2466
#endif
2467
    };
2468
/* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
2469
/* flag unnecessarily.  It leads to a song and dance at the end of strtod. */
2470
0
#define Scale_Bit 0x10
2471
0
#define n_bigtens 5
2472
#else
2473
#ifdef IBM
2474
bigtens[] = { 1e16, 1e32, 1e64 };
2475
static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
2476
#define n_bigtens 3
2477
#else
2478
bigtens[] = { 1e16, 1e32 };
2479
static const double tinytens[] = { 1e-16, 1e-32 };
2480
#define n_bigtens 2
2481
#endif
2482
#endif
2483
2484
#undef Need_Hexdig
2485
#ifdef INFNAN_CHECK
2486
#ifndef No_Hex_NaN
2487
#define Need_Hexdig
2488
#endif
2489
#endif
2490
2491
#ifndef Need_Hexdig
2492
#ifndef NO_HEX_FP
2493
#define Need_Hexdig
2494
#endif
2495
#endif
2496
2497
#ifdef Need_Hexdig /*{*/
2498
#if 0
2499
static unsigned char hexdig[256];
2500
2501
 static void
2502
htinit(unsigned char *h, unsigned char *s, int inc)
2503
{
2504
  int i, j;
2505
  for(i = 0; (j = s[i]) !=0; i++)
2506
    h[j] = i + inc;
2507
  }
2508
2509
 static void
2510
hexdig_init(void) /* Use of hexdig_init omitted 20121220 to avoid a */
2511
      /* race condition when multiple threads are used. */
2512
{
2513
#define USC (unsigned char *)
2514
  htinit(hexdig, USC "0123456789", 0x10);
2515
  htinit(hexdig, USC "abcdef", 0x10 + 10);
2516
  htinit(hexdig, USC "ABCDEF", 0x10 + 10);
2517
  }
2518
#else
2519
static unsigned char hexdig[256] = {
2520
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2521
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2522
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2523
  16,17,18,19,20,21,22,23,24,25,0,0,0,0,0,0,
2524
  0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0,
2525
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2526
  0,26,27,28,29,30,31,0,0,0,0,0,0,0,0,0,
2527
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2528
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2529
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2530
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2531
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2532
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2533
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2534
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2535
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
2536
  };
2537
#endif
2538
#endif /* } Need_Hexdig */
2539
2540
#ifdef INFNAN_CHECK
2541
2542
#ifndef NAN_WORD0
2543
0
#define NAN_WORD0 0x7ff80000
2544
#endif
2545
2546
#ifndef NAN_WORD1
2547
0
#define NAN_WORD1 0
2548
#endif
2549
2550
 static int
2551
match(const char **sp, const char *t)
2552
0
{
2553
0
  int c, d;
2554
0
  const char *s = *sp;
2555
2556
0
  while((d = *t++)) {
2557
0
    if ((c = *++s) >= 'A' && c <= 'Z')
2558
0
      c += 'a' - 'A';
2559
0
    if (c != d)
2560
0
      return 0;
2561
0
    }
2562
0
  *sp = s + 1;
2563
0
  return 1;
2564
0
  }
2565
2566
#ifndef No_Hex_NaN
2567
 static void
2568
hexnan(U *rvp, const char **sp)
2569
0
{
2570
0
  ULong c, x[2];
2571
0
  const char *s;
2572
0
  int c1, havedig, udx0, xshift;
2573
2574
  /**** if (!hexdig['0']) hexdig_init(); ****/
2575
0
  x[0] = x[1] = 0;
2576
0
  havedig = xshift = 0;
2577
0
  udx0 = 1;
2578
0
  s = *sp;
2579
  /* allow optional initial 0x or 0X */
2580
0
  while((c = *(const unsigned char*)(s+1)) && c <= ' ')
2581
0
    ++s;
2582
0
  if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))
2583
0
    s += 2;
2584
0
  while((c = *(const unsigned char*)++s)) {
2585
0
    if ((c1 = hexdig[c]))
2586
0
      c  = c1 & 0xf;
2587
0
    else if (c <= ' ') {
2588
0
      if (udx0 && havedig) {
2589
0
        udx0 = 0;
2590
0
        xshift = 1;
2591
0
        }
2592
0
      continue;
2593
0
      }
2594
#ifdef GDTOA_NON_PEDANTIC_NANCHECK
2595
    else if (/*(*/ c == ')' && havedig) {
2596
      *sp = s + 1;
2597
      break;
2598
      }
2599
    else
2600
      return; /* invalid form: don't change *sp */
2601
#else
2602
0
    else {
2603
0
      do {
2604
0
        if (/*(*/ c == ')') {
2605
0
          *sp = s + 1;
2606
0
          break;
2607
0
          }
2608
0
        } while((c = *++s));
2609
0
      break;
2610
0
      }
2611
0
#endif
2612
0
    havedig = 1;
2613
0
    if (xshift) {
2614
0
      xshift = 0;
2615
0
      x[0] = x[1];
2616
0
      x[1] = 0;
2617
0
      }
2618
0
    if (udx0)
2619
0
      x[0] = (x[0] << 4) | (x[1] >> 28);
2620
0
    x[1] = (x[1] << 4) | c;
2621
0
    }
2622
0
  if ((x[0] &= 0xfffff) || x[1]) {
2623
0
    word0(rvp) = Exp_mask | x[0];
2624
0
    word1(rvp) = x[1];
2625
0
    }
2626
0
  }
2627
#endif /*No_Hex_NaN*/
2628
#endif /* INFNAN_CHECK */
2629
2630
#ifdef Pack_32
2631
0
#define ULbits 32
2632
0
#define kshift 5
2633
37.6k
#define kmask 31
2634
#else
2635
#define ULbits 16
2636
#define kshift 4
2637
#define kmask 15
2638
#endif
2639
2640
#if !defined(NO_HEX_FP) || defined(Honor_FLT_ROUNDS) /*{*/
2641
 static Bigint *
2642
increment(Bigint *b MTd)
2643
0
{
2644
0
  ULong *x, *xe;
2645
0
  Bigint *b1;
2646
2647
0
  x = b->x;
2648
0
  xe = x + b->wds;
2649
0
  do {
2650
0
    if (*x < (ULong)0xffffffffL) {
2651
0
      ++*x;
2652
0
      return b;
2653
0
      }
2654
0
    *x++ = 0;
2655
0
    } while(x < xe);
2656
0
  {
2657
0
    if (b->wds >= b->maxwds) {
2658
0
      b1 = Balloc(b->k+1 MTa);
2659
0
      Bcopy(b1,b);
2660
0
      Bfree(b MTa);
2661
0
      b = b1;
2662
0
      }
2663
0
    b->x[b->wds++] = 1;
2664
0
    }
2665
0
  return b;
2666
0
  }
2667
2668
#endif /*}*/
2669
2670
#ifndef NO_HEX_FP /*{*/
2671
2672
 static void
2673
rshift(Bigint *b, int k)
2674
0
{
2675
0
  ULong *x, *x1, *xe, y;
2676
0
  int n;
2677
2678
0
  x = x1 = b->x;
2679
0
  n = k >> kshift;
2680
0
  if (n < b->wds) {
2681
0
    xe = x + b->wds;
2682
0
    x += n;
2683
0
    if (k &= kmask) {
2684
0
      n = 32 - k;
2685
0
      y = *x++ >> k;
2686
0
      while(x < xe) {
2687
0
        *x1++ = (y | (*x << n)) & 0xffffffff;
2688
0
        y = *x++ >> k;
2689
0
        }
2690
0
      if ((*x1 = y) !=0)
2691
0
        x1++;
2692
0
      }
2693
0
    else
2694
0
      while(x < xe)
2695
0
        *x1++ = *x++;
2696
0
    }
2697
0
  if ((b->wds = x1 - b->x) == 0)
2698
0
    b->x[0] = 0;
2699
0
  }
2700
2701
 static ULong
2702
any_on(Bigint *b, int k)
2703
0
{
2704
0
  int n, nwds;
2705
0
  ULong *x, *x0, x1, x2;
2706
2707
0
  x = b->x;
2708
0
  nwds = b->wds;
2709
0
  n = k >> kshift;
2710
0
  if (n > nwds)
2711
0
    n = nwds;
2712
0
  else if (n < nwds && (k &= kmask)) {
2713
0
    x1 = x2 = x[n];
2714
0
    x1 >>= k;
2715
0
    x1 <<= k;
2716
0
    if (x1 != x2)
2717
0
      return 1;
2718
0
    }
2719
0
  x0 = x;
2720
0
  x += n;
2721
0
  while(x > x0)
2722
0
    if (*--x)
2723
0
      return 1;
2724
0
  return 0;
2725
0
  }
2726
2727
enum {  /* rounding values: same as FLT_ROUNDS */
2728
  Round_zero = 0,
2729
  Round_near = 1,
2730
  Round_up = 2,
2731
  Round_down = 3
2732
  };
2733
2734
 void
2735
gethex(const char **sp, U *rvp, int rounding, int sign MTd)
2736
0
{
2737
0
  Bigint *b;
2738
0
  char d;
2739
0
  const unsigned char *decpt, *s0, *s, *s1;
2740
0
  Long e, e1;
2741
0
  ULong L, lostbits, *x;
2742
0
  int big, denorm, esign, havedig, k, n, nb, nbits, nz, up, zret;
2743
#ifdef IBM
2744
  int j;
2745
#endif
2746
0
  enum {
2747
0
#ifdef IEEE_Arith /*{{*/
2748
0
    emax = 0x7fe - Bias - P + 1,
2749
0
    emin = Emin - P + 1
2750
#else /*}{*/
2751
    emin = Emin - P,
2752
#ifdef VAX
2753
    emax = 0x7ff - Bias - P + 1
2754
#endif
2755
#ifdef IBM
2756
    emax = 0x7f - Bias - P
2757
#endif
2758
#endif /*}}*/
2759
0
    };
2760
0
#ifdef IEEE_Arith
2761
0
  int check_denorm = 0;
2762
0
#endif
2763
#ifdef USE_LOCALE
2764
  int i;
2765
#ifdef NO_LOCALE_CACHE
2766
  const unsigned char *decimalpoint = (unsigned char*)
2767
    localeconv()->decimal_point;
2768
#else
2769
  const unsigned char *decimalpoint;
2770
  static unsigned char *decimalpoint_cache;
2771
  if (!(s0 = decimalpoint_cache)) {
2772
    s0 = (unsigned char*)localeconv()->decimal_point;
2773
    if ((decimalpoint_cache = (unsigned char*)
2774
        MALLOC(strlen((const char*)s0) + 1))) {
2775
      strcpy((char*)decimalpoint_cache, (const char*)s0);
2776
      s0 = decimalpoint_cache;
2777
      }
2778
    }
2779
  decimalpoint = s0;
2780
#endif
2781
#endif
2782
2783
  /**** if (!hexdig['0']) hexdig_init(); ****/
2784
0
  havedig = 0;
2785
0
  s0 = *(const unsigned char **)sp + 2;
2786
0
  while(s0[havedig] == '0')
2787
0
    havedig++;
2788
0
  s0 += havedig;
2789
0
  s = s0;
2790
0
  decpt = 0;
2791
0
  zret = 0;
2792
0
  e = 0;
2793
0
  if (hexdig[*s])
2794
0
    havedig++;
2795
0
  else {
2796
0
    zret = 1;
2797
#ifdef USE_LOCALE
2798
    for(i = 0; decimalpoint[i]; ++i) {
2799
      if (s[i] != decimalpoint[i])
2800
        goto pcheck;
2801
      }
2802
    decpt = s += i;
2803
#else
2804
0
    if (*s != '.')
2805
0
      goto pcheck;
2806
0
    decpt = ++s;
2807
0
#endif
2808
0
    if (!hexdig[*s])
2809
0
      goto pcheck;
2810
0
    while(*s == '0')
2811
0
      s++;
2812
0
    if (hexdig[*s])
2813
0
      zret = 0;
2814
0
    havedig = 1;
2815
0
    s0 = s;
2816
0
    }
2817
0
  while(hexdig[*s])
2818
0
    s++;
2819
#ifdef USE_LOCALE
2820
  if (*s == *decimalpoint && !decpt) {
2821
    for(i = 1; decimalpoint[i]; ++i) {
2822
      if (s[i] != decimalpoint[i])
2823
        goto pcheck;
2824
      }
2825
    decpt = s += i;
2826
#else
2827
0
  if (*s == '.' && !decpt) {
2828
0
    decpt = ++s;
2829
0
#endif
2830
0
    while(hexdig[*s])
2831
0
      s++;
2832
0
    }/*}*/
2833
0
  if (decpt)
2834
0
    e = -(((Long)(s-decpt)) << 2);
2835
0
 pcheck:
2836
0
  s1 = s;
2837
0
  big = esign = 0;
2838
0
  switch(*s) {
2839
0
    case 'p':
2840
0
    case 'P':
2841
0
    switch(*++s) {
2842
0
      case '-':
2843
0
      esign = 1;
2844
      /* fall through */
2845
0
      case '+':
2846
0
      s++;
2847
0
      }
2848
0
    if ((n = hexdig[*s]) == 0 || n > 0x19) {
2849
0
      s = s1;
2850
0
      break;
2851
0
      }
2852
0
    e1 = n - 0x10;
2853
0
    while((n = hexdig[*++s]) !=0 && n <= 0x19) {
2854
0
      if (e1 & 0xf8000000)
2855
0
        big = 1;
2856
0
      e1 = 10*e1 + n - 0x10;
2857
0
      }
2858
0
    if (esign)
2859
0
      e1 = -e1;
2860
0
    e += e1;
2861
0
    }
2862
0
  *sp = (char*)s;
2863
0
  if (!havedig)
2864
0
    *sp = (char*)s0 - 1;
2865
0
  if (zret)
2866
0
    goto retz1;
2867
0
  if (big) {
2868
0
    if (esign) {
2869
0
#ifdef IEEE_Arith
2870
0
      switch(rounding) {
2871
0
        case Round_up:
2872
0
        if (sign)
2873
0
          break;
2874
0
        goto ret_tiny;
2875
0
        case Round_down:
2876
0
        if (!sign)
2877
0
          break;
2878
0
        goto ret_tiny;
2879
0
        }
2880
0
#endif
2881
0
      goto retz;
2882
0
#ifdef IEEE_Arith
2883
0
 ret_tinyf:
2884
0
      Bfree(b MTa);
2885
0
 ret_tiny:
2886
0
      Set_errno(ERANGE);
2887
0
      word0(rvp) = 0;
2888
0
      word1(rvp) = 1;
2889
0
      return;
2890
0
#endif /* IEEE_Arith */
2891
0
      }
2892
0
    switch(rounding) {
2893
0
      case Round_near:
2894
0
      goto ovfl1;
2895
0
      case Round_up:
2896
0
      if (!sign)
2897
0
        goto ovfl1;
2898
0
      goto ret_big;
2899
0
      case Round_down:
2900
0
      if (sign)
2901
0
        goto ovfl1;
2902
0
      goto ret_big;
2903
0
      }
2904
0
 ret_big:
2905
0
    word0(rvp) = Big0;
2906
0
    word1(rvp) = Big1;
2907
0
    return;
2908
0
    }
2909
0
  n = s1 - s0 - 1;
2910
0
  for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1)
2911
0
    k++;
2912
0
  b = Balloc(k MTa);
2913
0
  x = b->x;
2914
0
  havedig = n = nz = 0;
2915
0
  L = 0;
2916
#ifdef USE_LOCALE
2917
  for(i = 0; decimalpoint[i+1]; ++i);
2918
#endif
2919
0
  while(s1 > s0) {
2920
#ifdef USE_LOCALE
2921
    if (*--s1 == decimalpoint[i]) {
2922
      s1 -= i;
2923
      continue;
2924
      }
2925
#else
2926
0
    if (*--s1 == '.')
2927
0
      continue;
2928
0
#endif
2929
0
    if ((d = hexdig[*s1]))
2930
0
      havedig = 1;
2931
0
    else if (!havedig) {
2932
0
      e += 4;
2933
0
      continue;
2934
0
      }
2935
0
    if (n == ULbits) {
2936
0
      *x++ = L;
2937
0
      L = 0;
2938
0
      n = 0;
2939
0
      }
2940
0
    L |= (d & 0x0f) << n;
2941
0
    n += 4;
2942
0
    }
2943
0
  *x++ = L;
2944
0
  b->wds = n = x - b->x;
2945
0
  nb = ULbits*n - hi0bits(L);
2946
0
  nbits = Nbits;
2947
0
  lostbits = 0;
2948
0
  x = b->x;
2949
0
  if (nb > nbits) {
2950
0
    n = nb - nbits;
2951
0
    if (any_on(b,n)) {
2952
0
      lostbits = 1;
2953
0
      k = n - 1;
2954
0
      if (x[k>>kshift] & 1 << (k & kmask)) {
2955
0
        lostbits = 2;
2956
0
        if (k > 0 && any_on(b,k))
2957
0
          lostbits = 3;
2958
0
        }
2959
0
      }
2960
0
    rshift(b, n);
2961
0
    e += n;
2962
0
    }
2963
0
  else if (nb < nbits) {
2964
0
    n = nbits - nb;
2965
0
    b = lshift(b, n MTa);
2966
0
    e -= n;
2967
0
    x = b->x;
2968
0
    }
2969
0
  if (e > emax) {
2970
0
 ovfl:
2971
0
    Bfree(b MTa);
2972
0
 ovfl1:
2973
0
    Set_errno(ERANGE);
2974
#ifdef Honor_FLT_ROUNDS
2975
    switch (rounding) {
2976
      case Round_zero:
2977
      goto ret_big;
2978
      case Round_down:
2979
      if (!sign)
2980
        goto ret_big;
2981
      break;
2982
      case Round_up:
2983
      if (sign)
2984
        goto ret_big;
2985
      }
2986
#endif
2987
0
    word0(rvp) = Exp_mask;
2988
0
    word1(rvp) = 0;
2989
0
    return;
2990
0
    }
2991
0
  denorm = 0;
2992
0
  if (e < emin) {
2993
0
    denorm = 1;
2994
0
    n = emin - e;
2995
0
    if (n >= nbits) {
2996
0
#ifdef IEEE_Arith /*{*/
2997
0
      switch (rounding) {
2998
0
        case Round_near:
2999
0
        if (n == nbits && (n < 2 || lostbits || any_on(b,n-1)))
3000
0
          goto ret_tinyf;
3001
0
        break;
3002
0
        case Round_up:
3003
0
        if (!sign)
3004
0
          goto ret_tinyf;
3005
0
        break;
3006
0
        case Round_down:
3007
0
        if (sign)
3008
0
          goto ret_tinyf;
3009
0
        }
3010
0
#endif /* } IEEE_Arith */
3011
0
      Bfree(b MTa);
3012
0
 retz:
3013
0
      Set_errno(ERANGE);
3014
0
 retz1:
3015
0
      rvp->d = 0.;
3016
0
      return;
3017
0
      }
3018
0
    k = n - 1;
3019
0
#ifdef IEEE_Arith
3020
0
    if (!k) {
3021
0
      switch(rounding) {
3022
0
        case Round_near:
3023
0
        if (((b->x[0] & 3) == 3) || (lostbits && (b->x[0] & 1))) {
3024
0
          multadd(b, 1, 1 MTa);
3025
0
 emin_check:
3026
0
          if (b->x[1] == (1 << (Exp_shift + 1))) {
3027
0
            rshift(b,1);
3028
0
            e = emin;
3029
0
            goto normal;
3030
0
            }
3031
0
          }
3032
0
        break;
3033
0
        case Round_up:
3034
0
        if (!sign && (lostbits || (b->x[0] & 1))) {
3035
0
 incr_denorm:
3036
0
          multadd(b, 1, 2 MTa);
3037
0
          check_denorm = 1;
3038
0
          lostbits = 0;
3039
0
          goto emin_check;
3040
0
          }
3041
0
        break;
3042
0
        case Round_down:
3043
0
        if (sign && (lostbits || (b->x[0] & 1)))
3044
0
          goto incr_denorm;
3045
0
        break;
3046
0
        }
3047
0
      }
3048
0
#endif
3049
0
    if (lostbits)
3050
0
      lostbits = 1;
3051
0
    else if (k > 0)
3052
0
      lostbits = any_on(b,k);
3053
0
#ifdef IEEE_Arith
3054
0
    else if (check_denorm)
3055
0
      goto no_lostbits;
3056
0
#endif
3057
0
    if (x[k>>kshift] & 1 << (k & kmask))
3058
0
      lostbits |= 2;
3059
0
#ifdef IEEE_Arith
3060
0
 no_lostbits:
3061
0
#endif
3062
0
    nbits -= n;
3063
0
    rshift(b,n);
3064
0
    e = emin;
3065
0
    }
3066
0
  if (lostbits) {
3067
0
    up = 0;
3068
0
    switch(rounding) {
3069
0
      case Round_zero:
3070
0
      break;
3071
0
      case Round_near:
3072
0
      if (lostbits & 2
3073
0
       && (lostbits & 1) | (x[0] & 1))
3074
0
        up = 1;
3075
0
      break;
3076
0
      case Round_up:
3077
0
      up = 1 - sign;
3078
0
      break;
3079
0
      case Round_down:
3080
0
      up = sign;
3081
0
      }
3082
0
    if (up) {
3083
0
      k = b->wds;
3084
0
      b = increment(b MTa);
3085
0
      x = b->x;
3086
0
      if (!denorm && (b->wds > k
3087
0
       || ((n = nbits & kmask) !=0
3088
0
           && hi0bits(x[k-1]) < 32-n))) {
3089
0
        rshift(b,1);
3090
0
        if (++e > Emax)
3091
0
          goto ovfl;
3092
0
        }
3093
0
      }
3094
0
    }
3095
0
#ifdef IEEE_Arith
3096
0
  if (denorm)
3097
0
    word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0;
3098
0
  else {
3099
0
 normal:
3100
0
    word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20);
3101
0
    }
3102
0
  word1(rvp) = b->x[0];
3103
0
#endif
3104
#ifdef IBM
3105
  if ((j = e & 3)) {
3106
    k = b->x[0] & ((1 << j) - 1);
3107
    rshift(b,j);
3108
    if (k) {
3109
      switch(rounding) {
3110
        case Round_up:
3111
        if (!sign)
3112
          increment(b);
3113
        break;
3114
        case Round_down:
3115
        if (sign)
3116
          increment(b);
3117
        break;
3118
        case Round_near:
3119
        j = 1 << (j-1);
3120
        if (k & j && ((k & (j-1)) | lostbits))
3121
          increment(b);
3122
        }
3123
      }
3124
    }
3125
  e >>= 2;
3126
  word0(rvp) = b->x[1] | ((e + 65 + 13) << 24);
3127
  word1(rvp) = b->x[0];
3128
#endif
3129
#ifdef VAX
3130
  /* The next two lines ignore swap of low- and high-order 2 bytes. */
3131
  /* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */
3132
  /* word1(rvp) = b->x[0]; */
3133
  word0(rvp) = ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16);
3134
  word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16);
3135
#endif
3136
0
  Bfree(b MTa);
3137
0
  }
3138
#endif /*!NO_HEX_FP}*/
3139
3140
 static int
3141
dshift(Bigint *b, int p2)
3142
37.6k
{
3143
37.6k
  int rv = hi0bits(b->x[b->wds-1]) - 4;
3144
37.6k
  if (p2 > 0)
3145
32.0k
    rv -= p2;
3146
37.6k
  return rv & kmask;
3147
37.6k
  }
3148
3149
 static int
3150
quorem(Bigint *b, Bigint *S)
3151
493k
{
3152
493k
  int n;
3153
493k
  ULong *bx, *bxe, q, *sx, *sxe;
3154
493k
#ifdef ULLong
3155
493k
  ULLong borrow, carry, y, ys;
3156
#else
3157
  ULong borrow, carry, y, ys;
3158
#ifdef Pack_32
3159
  ULong si, z, zs;
3160
#endif
3161
#endif
3162
3163
493k
  n = S->wds;
3164
#ifdef DEBUG
3165
  /*debug*/ if (b->wds > n)
3166
  /*debug*/ Bug("oversize b in quorem");
3167
#endif
3168
493k
  if (b->wds < n)
3169
3.51k
    return 0;
3170
490k
  sx = S->x;
3171
490k
  sxe = sx + --n;
3172
490k
  bx = b->x;
3173
490k
  bxe = bx + n;
3174
490k
  q = *bxe / (*sxe + 1);  /* ensure q <= true quotient */
3175
#ifdef DEBUG
3176
#ifdef NO_STRTOD_BIGCOMP
3177
  /*debug*/ if (q > 9)
3178
#else
3179
  /* An oversized q is possible when quorem is called from bigcomp and */
3180
  /* the input is near, e.g., twice the smallest denormalized number. */
3181
  /*debug*/ if (q > 15)
3182
#endif
3183
  /*debug*/ Bug("oversized quotient in quorem");
3184
#endif
3185
490k
  if (q) {
3186
449k
    borrow = 0;
3187
449k
    carry = 0;
3188
955k
    do {
3189
955k
#ifdef ULLong
3190
955k
      ys = *sx++ * (ULLong)q + carry;
3191
955k
      carry = ys >> 32;
3192
955k
      y = *bx - (ys & FFFFFFFF) - borrow;
3193
955k
      borrow = y >> 32 & (ULong)1;
3194
955k
      *bx++ = y & FFFFFFFF;
3195
#else
3196
#ifdef Pack_32
3197
      si = *sx++;
3198
      ys = (si & 0xffff) * q + carry;
3199
      zs = (si >> 16) * q + (ys >> 16);
3200
      carry = zs >> 16;
3201
      y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
3202
      borrow = (y & 0x10000) >> 16;
3203
      z = (*bx >> 16) - (zs & 0xffff) - borrow;
3204
      borrow = (z & 0x10000) >> 16;
3205
      Storeinc(bx, z, y);
3206
#else
3207
      ys = *sx++ * q + carry;
3208
      carry = ys >> 16;
3209
      y = *bx - (ys & 0xffff) - borrow;
3210
      borrow = (y & 0x10000) >> 16;
3211
      *bx++ = y & 0xffff;
3212
#endif
3213
#endif
3214
955k
      }
3215
955k
      while(sx <= sxe);
3216
449k
    if (!*bxe) {
3217
231
      bx = b->x;
3218
231
      while(--bxe > bx && !*bxe)
3219
0
        --n;
3220
231
      b->wds = n;
3221
231
      }
3222
449k
    }
3223
490k
  if (cmp(b, S) >= 0) {
3224
9.03k
    q++;
3225
9.03k
    borrow = 0;
3226
9.03k
    carry = 0;
3227
9.03k
    bx = b->x;
3228
9.03k
    sx = S->x;
3229
25.3k
    do {
3230
25.3k
#ifdef ULLong
3231
25.3k
      ys = *sx++ + carry;
3232
25.3k
      carry = ys >> 32;
3233
25.3k
      y = *bx - (ys & FFFFFFFF) - borrow;
3234
25.3k
      borrow = y >> 32 & (ULong)1;
3235
25.3k
      *bx++ = y & FFFFFFFF;
3236
#else
3237
#ifdef Pack_32
3238
      si = *sx++;
3239
      ys = (si & 0xffff) + carry;
3240
      zs = (si >> 16) + (ys >> 16);
3241
      carry = zs >> 16;
3242
      y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
3243
      borrow = (y & 0x10000) >> 16;
3244
      z = (*bx >> 16) - (zs & 0xffff) - borrow;
3245
      borrow = (z & 0x10000) >> 16;
3246
      Storeinc(bx, z, y);
3247
#else
3248
      ys = *sx++ + carry;
3249
      carry = ys >> 16;
3250
      y = *bx - (ys & 0xffff) - borrow;
3251
      borrow = (y & 0x10000) >> 16;
3252
      *bx++ = y & 0xffff;
3253
#endif
3254
#endif
3255
25.3k
      }
3256
25.3k
      while(sx <= sxe);
3257
9.03k
    bx = b->x;
3258
9.03k
    bxe = bx + n;
3259
9.03k
    if (!*bxe) {
3260
9.50k
      while(--bxe > bx && !*bxe)
3261
733
        --n;
3262
8.77k
      b->wds = n;
3263
8.77k
      }
3264
9.03k
    }
3265
490k
  return q;
3266
493k
  }
3267
3268
#if defined(Avoid_Underflow) || !defined(NO_STRTOD_BIGCOMP) /*{*/
3269
 static double
3270
sulp(U *x, BCinfo *bc)
3271
0
{
3272
0
  U u;
3273
0
  double rv;
3274
0
  int i;
3275
3276
0
  rv = ulp(x);
3277
0
  if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
3278
0
    return rv; /* Is there an example where i <= 0 ? */
3279
0
  word0(&u) = Exp_1 + (i << Exp_shift);
3280
0
  word1(&u) = 0;
3281
0
  return rv * u.d;
3282
0
  }
3283
#endif /*}*/
3284
3285
#ifndef NO_STRTOD_BIGCOMP
3286
 static void
3287
bigcomp(U *rv, const char *s0, BCinfo *bc MTd)
3288
0
{
3289
0
  Bigint *b, *d;
3290
0
  int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase;
3291
3292
0
  dsign = bc->dsign;
3293
0
  nd = bc->nd;
3294
0
  nd0 = bc->nd0;
3295
0
  p5 = nd + bc->e0 - 1;
3296
0
  speccase = 0;
3297
0
#ifndef Sudden_Underflow
3298
0
  if (rv->d == 0.) { /* special case: value near underflow-to-zero */
3299
        /* threshold was rounded to zero */
3300
0
    b = i2b(1 MTa);
3301
0
    p2 = Emin - P + 1;
3302
0
    bbits = 1;
3303
0
#ifdef Avoid_Underflow
3304
0
    word0(rv) = (P+2) << Exp_shift;
3305
#else
3306
    word1(rv) = 1;
3307
#endif
3308
0
    i = 0;
3309
#ifdef Honor_FLT_ROUNDS
3310
    if (bc->rounding == 1)
3311
#endif
3312
0
      {
3313
0
      speccase = 1;
3314
0
      --p2;
3315
0
      dsign = 0;
3316
0
      goto have_i;
3317
0
      }
3318
0
    }
3319
0
  else
3320
0
#endif
3321
0
    b = d2b(rv, &p2, &bbits MTa);
3322
0
#ifdef Avoid_Underflow
3323
0
  p2 -= bc->scale;
3324
0
#endif
3325
  /* floor(log2(rv)) == bbits - 1 + p2 */
3326
  /* Check for denormal case. */
3327
0
  i = P - bbits;
3328
0
  if (i > (j = P - Emin - 1 + p2)) {
3329
#ifdef Sudden_Underflow
3330
    Bfree(b MTa);
3331
    b = i2b(1 MTa);
3332
    p2 = Emin;
3333
    i = P - 1;
3334
#ifdef Avoid_Underflow
3335
    word0(rv) = (1 + bc->scale) << Exp_shift;
3336
#else
3337
    word0(rv) = Exp_msk1;
3338
#endif
3339
    word1(rv) = 0;
3340
#else
3341
0
    i = j;
3342
0
#endif
3343
0
    }
3344
#ifdef Honor_FLT_ROUNDS
3345
  if (bc->rounding != 1) {
3346
    if (i > 0)
3347
      b = lshift(b, i MTa);
3348
    if (dsign)
3349
      b = increment(b MTa);
3350
    }
3351
  else
3352
#endif
3353
0
    {
3354
0
    b = lshift(b, ++i MTa);
3355
0
    b->x[0] |= 1;
3356
0
    }
3357
0
#ifndef Sudden_Underflow
3358
0
 have_i:
3359
0
#endif
3360
0
  p2 -= p5 + i;
3361
0
  d = i2b(1 MTa);
3362
  /* Arrange for convenient computation of quotients:
3363
   * shift left if necessary so divisor has 4 leading 0 bits.
3364
   */
3365
0
  if (p5 > 0)
3366
0
    d = pow5mult(d, p5 MTa);
3367
0
  else if (p5 < 0)
3368
0
    b = pow5mult(b, -p5 MTa);
3369
0
  if (p2 > 0) {
3370
0
    b2 = p2;
3371
0
    d2 = 0;
3372
0
    }
3373
0
  else {
3374
0
    b2 = 0;
3375
0
    d2 = -p2;
3376
0
    }
3377
0
  i = dshift(d, d2);
3378
0
  if ((b2 += i) > 0)
3379
0
    b = lshift(b, b2 MTa);
3380
0
  if ((d2 += i) > 0)
3381
0
    d = lshift(d, d2 MTa);
3382
3383
  /* Now b/d = exactly half-way between the two floating-point values */
3384
  /* on either side of the input string.  Compute first digit of b/d. */
3385
3386
0
  if (!(dig = quorem(b,d))) {
3387
0
    b = multadd(b, 10, 0 MTa);  /* very unlikely */
3388
0
    dig = quorem(b,d);
3389
0
    }
3390
3391
  /* Compare b/d with s0 */
3392
3393
0
  for(i = 0; i < nd0; ) {
3394
0
    if ((dd = s0[i++] - '0' - dig))
3395
0
      goto ret;
3396
0
    if (!b->x[0] && b->wds == 1) {
3397
0
      if (i < nd)
3398
0
        dd = 1;
3399
0
      goto ret;
3400
0
      }
3401
0
    b = multadd(b, 10, 0 MTa);
3402
0
    dig = quorem(b,d);
3403
0
    }
3404
0
  for(j = bc->dp1; i++ < nd;) {
3405
0
    if ((dd = s0[j++] - '0' - dig))
3406
0
      goto ret;
3407
0
    if (!b->x[0] && b->wds == 1) {
3408
0
      if (i < nd)
3409
0
        dd = 1;
3410
0
      goto ret;
3411
0
      }
3412
0
    b = multadd(b, 10, 0 MTa);
3413
0
    dig = quorem(b,d);
3414
0
    }
3415
0
  if (dig > 0 || b->x[0] || b->wds > 1)
3416
0
    dd = -1;
3417
0
 ret:
3418
0
  Bfree(b MTa);
3419
0
  Bfree(d MTa);
3420
#ifdef Honor_FLT_ROUNDS
3421
  if (bc->rounding != 1) {
3422
    if (dd < 0) {
3423
      if (bc->rounding == 0) {
3424
        if (!dsign)
3425
          goto retlow1;
3426
        }
3427
      else if (dsign)
3428
        goto rethi1;
3429
      }
3430
    else if (dd > 0) {
3431
      if (bc->rounding == 0) {
3432
        if (dsign)
3433
          goto rethi1;
3434
        goto ret1;
3435
        }
3436
      if (!dsign)
3437
        goto rethi1;
3438
      dval(rv) += 2.*sulp(rv,bc);
3439
      }
3440
    else {
3441
      bc->inexact = 0;
3442
      if (dsign)
3443
        goto rethi1;
3444
      }
3445
    }
3446
  else
3447
#endif
3448
0
  if (speccase) {
3449
0
    if (dd <= 0)
3450
0
      rv->d = 0.;
3451
0
    }
3452
0
  else if (dd < 0) {
3453
0
    if (!dsign) /* does not happen for round-near */
3454
0
retlow1:
3455
0
      dval(rv) -= sulp(rv,bc);
3456
0
    }
3457
0
  else if (dd > 0) {
3458
0
    if (dsign) {
3459
0
 rethi1:
3460
0
      dval(rv) += sulp(rv,bc);
3461
0
      }
3462
0
    }
3463
0
  else {
3464
    /* Exact half-way case:  apply round-even rule. */
3465
0
    if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {
3466
0
      i = 1 - j;
3467
0
      if (i <= 31) {
3468
0
        if (word1(rv) & (0x1 << i))
3469
0
          goto odd;
3470
0
        }
3471
0
      else if (word0(rv) & (0x1 << (i-32)))
3472
0
        goto odd;
3473
0
      }
3474
0
    else if (word1(rv) & 1) {
3475
0
 odd:
3476
0
      if (dsign)
3477
0
        goto rethi1;
3478
0
      goto retlow1;
3479
0
      }
3480
0
    }
3481
3482
#ifdef Honor_FLT_ROUNDS
3483
 ret1:
3484
#endif
3485
0
  return;
3486
0
  }
3487
#endif /* NO_STRTOD_BIGCOMP */
3488
3489
 double
3490
strtod__unused(const char *s00, char **se)
3491
0
{
3492
0
  int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;
3493
0
  int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign;
3494
0
  const char *s, *s0, *s1;
3495
0
  double aadj, aadj1;
3496
0
  Long L;
3497
0
  U aadj2, adj, rv, rv0;
3498
0
  ULong y, z;
3499
0
  BCinfo bc;
3500
0
  Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
3501
0
#ifdef USE_BF96
3502
0
  ULLong bhi, blo, brv, t00, t01, t02, t10, t11, terv, tg, tlo, yz;
3503
0
  const BF96 *p10;
3504
0
  int bexact, erv;
3505
0
#endif
3506
0
#ifdef Avoid_Underflow
3507
0
  ULong Lsb, Lsb1;
3508
0
#endif
3509
#ifdef SET_INEXACT
3510
  int oldinexact;
3511
#endif
3512
0
#ifndef NO_STRTOD_BIGCOMP
3513
0
  int req_bigcomp = 0;
3514
0
#endif
3515
#ifdef MULTIPLE_THREADS
3516
  ThInfo *TI = 0;
3517
#endif
3518
#ifdef Honor_FLT_ROUNDS /*{*/
3519
#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
3520
  bc.rounding = Flt_Rounds;
3521
#else /*}{*/
3522
  bc.rounding = 1;
3523
  switch(fegetround()) {
3524
    case FE_TOWARDZERO: bc.rounding = 0; break;
3525
    case FE_UPWARD: bc.rounding = 2; break;
3526
    case FE_DOWNWARD: bc.rounding = 3;
3527
    }
3528
#endif /*}}*/
3529
#endif /*}*/
3530
#ifdef USE_LOCALE
3531
  const char *s2;
3532
#endif
3533
3534
0
  sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;
3535
0
  dval(&rv) = 0.;
3536
0
  for(s = s00;;s++) switch(*s) {
3537
0
    case '-':
3538
0
      sign = 1;
3539
      /* fall through */
3540
0
    case '+':
3541
0
      if (*++s)
3542
0
        goto break2;
3543
      /* no break */
3544
0
    case 0:
3545
0
      goto ret0;
3546
0
    case '\t':
3547
0
    case '\n':
3548
0
    case '\v':
3549
0
    case '\f':
3550
0
    case '\r':
3551
0
    case ' ':
3552
0
      continue;
3553
0
    default:
3554
0
      goto break2;
3555
0
    }
3556
0
 break2:
3557
0
  if (*s == '0') {
3558
0
#ifndef NO_HEX_FP /*{*/
3559
0
    switch(s[1]) {
3560
0
      case 'x':
3561
0
      case 'X':
3562
#ifdef Honor_FLT_ROUNDS
3563
      gethex(&s, &rv, bc.rounding, sign MTb);
3564
#else
3565
0
      gethex(&s, &rv, 1, sign MTb);
3566
0
#endif
3567
0
      goto ret;
3568
0
      }
3569
0
#endif /*}*/
3570
0
    nz0 = 1;
3571
0
    while(*++s == '0') ;
3572
0
    if (!*s)
3573
0
      goto ret;
3574
0
    }
3575
0
  s0 = s;
3576
0
  nd = nf = 0;
3577
0
#ifdef USE_BF96
3578
0
  yz = 0;
3579
0
  for(; (c = *s) >= '0' && c <= '9'; nd++, s++)
3580
0
    if (nd < 19)
3581
0
      yz = 10*yz + c - '0';
3582
#else
3583
  y = z = 0;
3584
  for(; (c = *s) >= '0' && c <= '9'; nd++, s++)
3585
    if (nd < 9)
3586
      y = 10*y + c - '0';
3587
    else if (nd < DBL_DIG + 2)
3588
      z = 10*z + c - '0';
3589
#endif
3590
0
  nd0 = nd;
3591
0
  bc.dp0 = bc.dp1 = s - s0;
3592
0
  for(s1 = s; s1 > s0 && *--s1 == '0'; )
3593
0
    ++nz1;
3594
#ifdef USE_LOCALE
3595
  s1 = localeconv()->decimal_point;
3596
  if (c == *s1) {
3597
    c = '.';
3598
    if (*++s1) {
3599
      s2 = s;
3600
      for(;;) {
3601
        if (*++s2 != *s1) {
3602
          c = 0;
3603
          break;
3604
          }
3605
        if (!*++s1) {
3606
          s = s2;
3607
          break;
3608
          }
3609
        }
3610
      }
3611
    }
3612
#endif
3613
0
  if (c == '.') {
3614
0
    c = *++s;
3615
0
    bc.dp1 = s - s0;
3616
0
    bc.dplen = bc.dp1 - bc.dp0;
3617
0
    if (!nd) {
3618
0
      for(; c == '0'; c = *++s)
3619
0
        nz++;
3620
0
      if (c > '0' && c <= '9') {
3621
0
        bc.dp0 = s0 - s;
3622
0
        bc.dp1 = bc.dp0 + bc.dplen;
3623
0
        s0 = s;
3624
0
        nf += nz;
3625
0
        nz = 0;
3626
0
        goto have_dig;
3627
0
        }
3628
0
      goto dig_done;
3629
0
      }
3630
0
    for(; c >= '0' && c <= '9'; c = *++s) {
3631
0
 have_dig:
3632
0
      nz++;
3633
0
      if (c -= '0') {
3634
0
        nf += nz;
3635
0
        i = 1;
3636
0
#ifdef USE_BF96
3637
0
        for(; i < nz; ++i) {
3638
0
          if (++nd <= 19)
3639
0
            yz *= 10;
3640
0
          }
3641
0
        if (++nd <= 19)
3642
0
          yz = 10*yz + c;
3643
#else
3644
        for(; i < nz; ++i) {
3645
          if (nd++ < 9)
3646
            y *= 10;
3647
          else if (nd <= DBL_DIG + 2)
3648
            z *= 10;
3649
          }
3650
        if (nd++ < 9)
3651
          y = 10*y + c;
3652
        else if (nd <= DBL_DIG + 2)
3653
          z = 10*z + c;
3654
#endif
3655
0
        nz = nz1 = 0;
3656
0
        }
3657
0
      }
3658
0
    }
3659
0
 dig_done:
3660
0
  e = 0;
3661
0
  if (c == 'e' || c == 'E') {
3662
0
    if (!nd && !nz && !nz0) {
3663
0
      goto ret0;
3664
0
      }
3665
0
    s00 = s;
3666
0
    esign = 0;
3667
0
    switch(c = *++s) {
3668
0
      case '-':
3669
0
        esign = 1;
3670
          /* fall through */
3671
0
      case '+':
3672
0
        c = *++s;
3673
0
      }
3674
0
    if (c >= '0' && c <= '9') {
3675
0
      while(c == '0')
3676
0
        c = *++s;
3677
0
      if (c > '0' && c <= '9') {
3678
0
        L = c - '0';
3679
0
        while((c = *++s) >= '0' && c <= '9') {
3680
0
          if (L <= 19999)
3681
0
            L = 10*L + c - '0';
3682
0
          }
3683
0
        if (L > 19999)
3684
          /* Avoid confusion from exponents
3685
           * so large that e might overflow.
3686
           */
3687
0
          e = 19999; /* safe for 16 bit ints */
3688
0
        else
3689
0
          e = (int)L;
3690
0
        if (esign)
3691
0
          e = -e;
3692
0
        }
3693
0
      else
3694
0
        e = 0;
3695
0
      }
3696
0
    else
3697
0
      s = s00;
3698
0
    }
3699
0
  if (!nd) {
3700
0
    if (!nz && !nz0) {
3701
0
#ifdef INFNAN_CHECK /*{*/
3702
      /* Check for Nan and Infinity */
3703
0
      if (!bc.dplen)
3704
0
       switch(c) {
3705
0
        case 'i':
3706
0
        case 'I':
3707
0
        if (match(&s,"nf")) {
3708
0
          --s;
3709
0
          if (!match(&s,"inity"))
3710
0
            ++s;
3711
0
          word0(&rv) = 0x7ff00000;
3712
0
          word1(&rv) = 0;
3713
0
          goto ret;
3714
0
          }
3715
0
        break;
3716
0
        case 'n':
3717
0
        case 'N':
3718
0
        if (match(&s, "an")) {
3719
0
          word0(&rv) = NAN_WORD0;
3720
0
          word1(&rv) = NAN_WORD1;
3721
0
#ifndef No_Hex_NaN
3722
0
          if (*s == '(') /*)*/
3723
0
            hexnan(&rv, &s);
3724
0
#endif
3725
0
          goto ret;
3726
0
          }
3727
0
        }
3728
0
#endif /*} INFNAN_CHECK */
3729
0
 ret0:
3730
0
      s = s00;
3731
0
      sign = 0;
3732
0
      }
3733
0
    goto ret;
3734
0
    }
3735
0
  bc.e0 = e1 = e -= nf;
3736
3737
  /* Now we have nd0 digits, starting at s0, followed by a
3738
   * decimal point, followed by nd-nd0 digits.  The number we're
3739
   * after is the integer represented by those digits times
3740
   * 10**e */
3741
3742
0
  if (!nd0)
3743
0
    nd0 = nd;
3744
#ifndef USE_BF96
3745
  k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2;
3746
  dval(&rv) = y;
3747
  if (k > 9) {
3748
#ifdef SET_INEXACT
3749
    if (k > DBL_DIG)
3750
      oldinexact = get_inexact();
3751
#endif
3752
    dval(&rv) = tens[k - 9] * dval(&rv) + z;
3753
    }
3754
#endif
3755
0
  bd0 = 0;
3756
0
  if (nd <= DBL_DIG
3757
0
#ifndef RND_PRODQUOT
3758
0
#ifndef Honor_FLT_ROUNDS
3759
0
    && Flt_Rounds == 1
3760
0
#endif
3761
0
#endif
3762
0
      ) {
3763
0
#ifdef USE_BF96
3764
0
    dval(&rv) = yz;
3765
0
#endif
3766
0
    if (!e)
3767
0
      goto ret;
3768
0
#ifndef ROUND_BIASED_without_Round_Up
3769
0
    if (e > 0) {
3770
0
      if (e <= Ten_pmax) {
3771
#ifdef SET_INEXACT
3772
        bc.inexact = 0;
3773
        oldinexact = 1;
3774
#endif
3775
#ifdef VAX
3776
        goto vax_ovfl_check;
3777
#else
3778
#ifdef Honor_FLT_ROUNDS
3779
        /* round correctly FLT_ROUNDS = 2 or 3 */
3780
        if (sign) {
3781
          rv.d = -rv.d;
3782
          sign = 0;
3783
          }
3784
#endif
3785
0
        /* rv = */ rounded_product(dval(&rv), tens[e]);
3786
0
        goto ret;
3787
0
#endif
3788
0
        }
3789
0
      i = DBL_DIG - nd;
3790
0
      if (e <= Ten_pmax + i) {
3791
        /* A fancier test would sometimes let us do
3792
         * this for larger i values.
3793
         */
3794
#ifdef SET_INEXACT
3795
        bc.inexact = 0;
3796
        oldinexact = 1;
3797
#endif
3798
#ifdef Honor_FLT_ROUNDS
3799
        /* round correctly FLT_ROUNDS = 2 or 3 */
3800
        if (sign) {
3801
          rv.d = -rv.d;
3802
          sign = 0;
3803
          }
3804
#endif
3805
0
        e -= i;
3806
0
        dval(&rv) *= tens[i];
3807
#ifdef VAX
3808
        /* VAX exponent range is so narrow we must
3809
         * worry about overflow here...
3810
         */
3811
 vax_ovfl_check:
3812
        word0(&rv) -= P*Exp_msk1;
3813
        /* rv = */ rounded_product(dval(&rv), tens[e]);
3814
        if ((word0(&rv) & Exp_mask)
3815
         > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
3816
          goto ovfl;
3817
        word0(&rv) += P*Exp_msk1;
3818
#else
3819
0
        /* rv = */ rounded_product(dval(&rv), tens[e]);
3820
0
#endif
3821
0
        goto ret;
3822
0
        }
3823
0
      }
3824
0
#ifndef Inaccurate_Divide
3825
0
    else if (e >= -Ten_pmax) {
3826
#ifdef SET_INEXACT
3827
        bc.inexact = 0;
3828
        oldinexact = 1;
3829
#endif
3830
#ifdef Honor_FLT_ROUNDS
3831
      /* round correctly FLT_ROUNDS = 2 or 3 */
3832
      if (sign) {
3833
        rv.d = -rv.d;
3834
        sign = 0;
3835
        }
3836
#endif
3837
0
      /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
3838
0
      goto ret;
3839
0
      }
3840
0
#endif
3841
0
#endif /* ROUND_BIASED_without_Round_Up */
3842
0
    }
3843
0
#ifdef USE_BF96
3844
0
  k = nd < 19 ? nd : 19;
3845
0
#endif
3846
0
  e1 += nd - k; /* scale factor = 10^e1 */
3847
3848
0
#ifdef IEEE_Arith
3849
#ifdef SET_INEXACT
3850
  bc.inexact = 1;
3851
#ifndef USE_BF96
3852
  if (k <= DBL_DIG)
3853
#endif
3854
    oldinexact = get_inexact();
3855
#endif
3856
#ifdef Honor_FLT_ROUNDS
3857
  if (bc.rounding >= 2) {
3858
    if (sign)
3859
      bc.rounding = bc.rounding == 2 ? 0 : 2;
3860
    else
3861
      if (bc.rounding != 2)
3862
        bc.rounding = 0;
3863
    }
3864
#endif
3865
0
#endif /*IEEE_Arith*/
3866
3867
0
#ifdef USE_BF96 /*{*/
3868
0
  Debug(++dtoa_stats[0]);
3869
0
  i = e1 + 342;
3870
0
  if (i < 0)
3871
0
    goto undfl;
3872
0
  if (i > 650)
3873
0
    goto ovfl;
3874
0
  p10 = &pten[i];
3875
0
  brv = yz;
3876
  /* shift brv left, with i =  number of bits shifted */
3877
0
  i = 0;
3878
0
  if (!(brv & 0xffffffff00000000ull)) {
3879
0
    i = 32;
3880
0
    brv <<= 32;
3881
0
    }
3882
0
  if (!(brv & 0xffff000000000000ull)) {
3883
0
    i += 16;
3884
0
    brv <<= 16;
3885
0
    }
3886
0
  if (!(brv & 0xff00000000000000ull)) {
3887
0
    i += 8;
3888
0
    brv <<= 8;
3889
0
    }
3890
0
  if (!(brv & 0xf000000000000000ull)) {
3891
0
    i += 4;
3892
0
    brv <<= 4;
3893
0
    }
3894
0
  if (!(brv & 0xc000000000000000ull)) {
3895
0
    i += 2;
3896
0
    brv <<= 2;
3897
0
    }
3898
0
  if (!(brv & 0x8000000000000000ull)) {
3899
0
    i += 1;
3900
0
    brv <<= 1;
3901
0
    }
3902
0
  erv = (64 + 0x3fe) + p10->e - i;
3903
0
  if (erv <= 0 && nd > 19)
3904
0
    goto many_digits; /* denormal: may need to look at all digits */
3905
0
  bhi = brv >> 32;
3906
0
  blo = brv & 0xffffffffull;
3907
  /* Unsigned 32-bit ints lie in [0,2^32-1] and */
3908
  /* unsigned 64-bit ints lie in [0, 2^64-1].  The product of two unsigned */
3909
  /* 32-bit ints is <= 2^64 - 2*2^32-1 + 1 = 2^64 - 1 - 2*(2^32 - 1), so */
3910
  /* we can add two unsigned 32-bit ints to the product of two such ints, */
3911
  /* and 64 bits suffice to contain the result. */
3912
0
  t01 = bhi * p10->b1;
3913
0
  t10 = blo * p10->b0 + (t01 & 0xffffffffull);
3914
0
  t00 = bhi * p10->b0 + (t01 >> 32) + (t10 >> 32);
3915
0
  if (t00 & 0x8000000000000000ull) {
3916
0
    if ((t00 & 0x3ff) && (~t00 & 0x3fe)) { /* unambiguous result? */
3917
0
      if (nd > 19 && ((t00 + (1<<i) + 2) & 0x400) ^ (t00 & 0x400))
3918
0
        goto many_digits;
3919
0
      if (erv <= 0)
3920
0
        goto denormal;
3921
#ifdef Honor_FLT_ROUNDS
3922
      switch(bc.rounding) {
3923
        case 0: goto noround;
3924
        case 2: goto roundup;
3925
        }
3926
#endif
3927
0
      if (t00 & 0x400 && t00 & 0xbff)
3928
0
        goto roundup;
3929
0
      goto noround;
3930
0
      }
3931
0
    }
3932
0
  else {
3933
0
    if ((t00 & 0x1ff) && (~t00 & 0x1fe)) { /* unambiguous result? */
3934
0
      if (nd > 19 && ((t00 + (1<<i) + 2) & 0x200) ^ (t00 & 0x200))
3935
0
        goto many_digits;
3936
0
      if (erv <= 1)
3937
0
        goto denormal1;
3938
#ifdef Honor_FLT_ROUNDS
3939
      switch(bc.rounding) {
3940
        case 0: goto noround1;
3941
        case 2: goto roundup1;
3942
        }
3943
#endif
3944
0
      if (t00 & 0x200)
3945
0
        goto roundup1;
3946
0
      goto noround1;
3947
0
      }
3948
0
    }
3949
  /* 3 multiplies did not suffice; try a 96-bit approximation */
3950
0
  Debug(++dtoa_stats[1]);
3951
0
  t02 = bhi * p10->b2;
3952
0
  t11 = blo * p10->b1 + (t02 & 0xffffffffull);
3953
0
  bexact = 1;
3954
0
  if (e1 < 0 || e1 > 41 || (t10 | t11) & 0xffffffffull || nd > 19)
3955
0
    bexact = 0;
3956
0
  tlo = (t10 & 0xffffffffull) + (t02 >> 32) + (t11 >> 32);
3957
0
  if (!bexact && (tlo + 0x10) >> 32 > tlo >> 32)
3958
0
    goto many_digits;
3959
0
  t00 += tlo >> 32;
3960
0
  if (t00 & 0x8000000000000000ull) {
3961
0
    if (erv <= 0) { /* denormal result */
3962
0
      if (nd >= 20 || !((tlo & 0xfffffff0) | (t00 & 0x3ff)))
3963
0
        goto many_digits;
3964
0
 denormal:
3965
0
      if (erv <= -52) {
3966
#ifdef Honor_FLT_ROUNDS
3967
        switch(bc.rounding) {
3968
          case 0: goto undfl;
3969
          case 2: goto tiniest;
3970
          }
3971
#endif
3972
0
        if (erv < -52 || !(t00 & 0x7fffffffffffffffull))
3973
0
          goto undfl;
3974
0
        goto tiniest;
3975
0
        }
3976
0
      tg = 1ull << (11 - erv);
3977
0
      t00 &= ~(tg - 1); /* clear low bits */
3978
#ifdef Honor_FLT_ROUNDS
3979
      switch(bc.rounding) {
3980
        case 0: goto noround_den;
3981
        case 2: goto roundup_den;
3982
        }
3983
#endif
3984
0
      if (t00 & tg) {
3985
#ifdef Honor_FLT_ROUNDS
3986
 roundup_den:
3987
#endif
3988
0
        t00 += tg << 1;
3989
0
        if (!(t00 & 0x8000000000000000ull)) {
3990
0
          if (++erv > 0)
3991
0
            goto smallest_normal;
3992
0
          t00 = 0x8000000000000000ull;
3993
0
          }
3994
0
        }
3995
#ifdef Honor_FLT_ROUNDS
3996
 noround_den:
3997
#endif
3998
0
      LLval(&rv) = t00 >> (12 - erv);
3999
0
      Set_errno(ERANGE);
4000
0
      goto ret;
4001
0
      }
4002
0
    if (bexact) {
4003
#ifdef SET_INEXACT
4004
      if (!(t00 & 0x7ff) && !(tlo & 0xffffffffull)) {
4005
        bc.inexact = 0;
4006
        goto noround;
4007
        }
4008
#endif
4009
#ifdef Honor_FLT_ROUNDS
4010
      switch(bc.rounding) {
4011
        case 2:
4012
        if (t00 & 0x7ff)
4013
          goto roundup;
4014
        case 0: goto noround;
4015
        }
4016
#endif
4017
0
      if (t00 & 0x400 && (tlo & 0xffffffff) | (t00 & 0xbff))
4018
0
        goto roundup;
4019
0
      goto noround;
4020
0
      }
4021
0
    if ((tlo & 0xfffffff0) | (t00 & 0x3ff)
4022
0
     && (nd <= 19 ||  ((t00 + (1ull << i)) & 0xfffffffffffffc00ull)
4023
0
        == (t00 & 0xfffffffffffffc00ull))) {
4024
      /* Unambiguous result. */
4025
      /* If nd > 19, then incrementing the 19th digit */
4026
      /* does not affect rv. */
4027
#ifdef Honor_FLT_ROUNDS
4028
      switch(bc.rounding) {
4029
        case 0: goto noround;
4030
        case 2: goto roundup;
4031
        }
4032
#endif
4033
0
      if (t00 & 0x400) { /* round up */
4034
0
 roundup:
4035
0
        t00 += 0x800;
4036
0
        if (!(t00 & 0x8000000000000000ull)) {
4037
          /* rounded up to a power of 2 */
4038
0
          if (erv >= 0x7fe)
4039
0
            goto ovfl;
4040
0
          terv = erv + 1;
4041
0
          LLval(&rv) = terv << 52;
4042
0
          goto ret;
4043
0
          }
4044
0
        }
4045
0
 noround:
4046
0
      if (erv >= 0x7ff)
4047
0
        goto ovfl;
4048
0
      terv = erv;
4049
0
      LLval(&rv) = (terv << 52) | ((t00 & 0x7ffffffffffff800ull) >> 11);
4050
0
      goto ret;
4051
0
      }
4052
0
    }
4053
0
  else {
4054
0
    if (erv <= 1) { /* denormal result */
4055
0
      if (nd >= 20 || !((tlo & 0xfffffff0) | (t00 & 0x1ff)))
4056
0
        goto many_digits;
4057
0
 denormal1:
4058
0
      if (erv <= -51) {
4059
#ifdef Honor_FLT_ROUNDS
4060
        switch(bc.rounding) {
4061
          case 0: goto undfl;
4062
          case 2: goto tiniest;
4063
          }
4064
#endif
4065
0
        if (erv < -51 || !(t00 & 0x3fffffffffffffffull))
4066
0
          goto undfl;
4067
0
 tiniest:
4068
0
        LLval(&rv) = 1;
4069
0
        Set_errno(ERANGE);
4070
0
        goto ret;
4071
0
        }
4072
0
      tg = 1ull << (11 - erv);
4073
#ifdef Honor_FLT_ROUNDS
4074
      switch(bc.rounding) {
4075
        case 0: goto noround1_den;
4076
        case 2: goto roundup1_den;
4077
        }
4078
#endif
4079
0
      if (t00 & tg) {
4080
#ifdef Honor_FLT_ROUNDS
4081
 roundup1_den:
4082
#endif
4083
0
        if (0x8000000000000000ull & (t00 += (tg<<1)) && erv == 1) {
4084
4085
0
 smallest_normal:
4086
0
          LLval(&rv) = 0x0010000000000000ull;
4087
0
          goto ret;
4088
0
          }
4089
0
        }
4090
#ifdef Honor_FLT_ROUNDS
4091
 noround1_den:
4092
#endif
4093
0
      if (erv <= -52)
4094
0
        goto undfl;
4095
0
      LLval(&rv) = t00 >> (12 - erv);
4096
0
      Set_errno(ERANGE);
4097
0
      goto ret;
4098
0
      }
4099
0
    if (bexact) {
4100
#ifdef SET_INEXACT
4101
      if (!(t00 & 0x3ff) && !(tlo & 0xffffffffull)) {
4102
        bc.inexact = 0;
4103
        goto noround1;
4104
        }
4105
#endif
4106
#ifdef Honor_FLT_ROUNDS
4107
      switch(bc.rounding) {
4108
        case 2:
4109
        if (t00 & 0x3ff)
4110
          goto roundup1;
4111
        case 0: goto noround1;
4112
        }
4113
#endif
4114
0
      if (t00 & 0x200 && (t00 & 0x5ff || tlo))
4115
0
        goto roundup1;
4116
0
      goto noround1;
4117
0
      }
4118
0
    if ((tlo & 0xfffffff0) | (t00 & 0x1ff)
4119
0
     && (nd <= 19 ||  ((t00 + (1ull << i)) & 0x7ffffffffffffe00ull)
4120
0
        == (t00 & 0x7ffffffffffffe00ull))) {
4121
      /* Unambiguous result. */
4122
#ifdef Honor_FLT_ROUNDS
4123
      switch(bc.rounding) {
4124
        case 0: goto noround1;
4125
        case 2: goto roundup1;
4126
        }
4127
#endif
4128
0
      if (t00 & 0x200) { /* round up */
4129
0
 roundup1:
4130
0
        t00 += 0x400;
4131
0
        if (!(t00 & 0x4000000000000000ull)) {
4132
          /* rounded up to a power of 2 */
4133
0
          if (erv >= 0x7ff)
4134
0
            goto ovfl;
4135
0
          terv = erv;
4136
0
          LLval(&rv) = terv << 52;
4137
0
          goto ret;
4138
0
          }
4139
0
        }
4140
0
 noround1:
4141
0
      if (erv >= 0x800)
4142
0
        goto ovfl;
4143
0
      terv = erv - 1;
4144
0
      LLval(&rv) = (terv << 52) | ((t00 & 0x3ffffffffffffc00ull) >> 10);
4145
0
      goto ret;
4146
0
      }
4147
0
    }
4148
0
 many_digits:
4149
0
  Debug(++dtoa_stats[2]);
4150
0
  if (nd > 17) {
4151
0
    if (nd > 18) {
4152
0
      yz /= 100;
4153
0
      e1 += 2;
4154
0
      }
4155
0
    else {
4156
0
      yz /= 10;
4157
0
      e1 += 1;
4158
0
      }
4159
0
    y = yz / 100000000;
4160
0
    }
4161
0
  else if (nd > 9) {
4162
0
    i = nd - 9;
4163
0
    y = (yz >> i) / pfive[i-1];
4164
0
    }
4165
0
  else
4166
0
    y = yz;
4167
0
  dval(&rv) = yz;
4168
0
#endif /*}*/
4169
4170
0
#ifdef IEEE_Arith
4171
0
#ifdef Avoid_Underflow
4172
0
  bc.scale = 0;
4173
0
#endif
4174
0
#endif /*IEEE_Arith*/
4175
4176
  /* Get starting approximation = rv * 10**e1 */
4177
4178
0
  if (e1 > 0) {
4179
0
    if ((i = e1 & 15))
4180
0
      dval(&rv) *= tens[i];
4181
0
    if (e1 &= ~15) {
4182
0
      if (e1 > DBL_MAX_10_EXP) {
4183
0
 ovfl:
4184
        /* Can't trust HUGE_VAL */
4185
0
#ifdef IEEE_Arith
4186
#ifdef Honor_FLT_ROUNDS
4187
        switch(bc.rounding) {
4188
          case 0: /* toward 0 */
4189
          case 3: /* toward -infinity */
4190
          word0(&rv) = Big0;
4191
          word1(&rv) = Big1;
4192
          break;
4193
          default:
4194
          word0(&rv) = Exp_mask;
4195
          word1(&rv) = 0;
4196
          }
4197
#else /*Honor_FLT_ROUNDS*/
4198
0
        word0(&rv) = Exp_mask;
4199
0
        word1(&rv) = 0;
4200
0
#endif /*Honor_FLT_ROUNDS*/
4201
#ifdef SET_INEXACT
4202
        /* set overflow bit */
4203
        dval(&rv0) = 1e300;
4204
        dval(&rv0) *= dval(&rv0);
4205
#endif
4206
#else /*IEEE_Arith*/
4207
        word0(&rv) = Big0;
4208
        word1(&rv) = Big1;
4209
#endif /*IEEE_Arith*/
4210
0
 range_err:
4211
0
        if (bd0) {
4212
0
          Bfree(bb MTb);
4213
0
          Bfree(bd MTb);
4214
0
          Bfree(bs MTb);
4215
0
          Bfree(bd0 MTb);
4216
0
          Bfree(delta MTb);
4217
0
          }
4218
0
        Set_errno(ERANGE);
4219
0
        goto ret;
4220
0
        }
4221
0
      e1 >>= 4;
4222
0
      for(j = 0; e1 > 1; j++, e1 >>= 1)
4223
0
        if (e1 & 1)
4224
0
          dval(&rv) *= bigtens[j];
4225
    /* The last multiplication could overflow. */
4226
0
      word0(&rv) -= P*Exp_msk1;
4227
0
      dval(&rv) *= bigtens[j];
4228
0
      if ((z = word0(&rv) & Exp_mask)
4229
0
       > Exp_msk1*(DBL_MAX_EXP+Bias-P))
4230
0
        goto ovfl;
4231
0
      if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
4232
        /* set to largest number */
4233
        /* (Can't trust DBL_MAX) */
4234
0
        word0(&rv) = Big0;
4235
0
        word1(&rv) = Big1;
4236
0
        }
4237
0
      else
4238
0
        word0(&rv) += P*Exp_msk1;
4239
0
      }
4240
0
    }
4241
0
  else if (e1 < 0) {
4242
0
    e1 = -e1;
4243
0
    if ((i = e1 & 15))
4244
0
      dval(&rv) /= tens[i];
4245
0
    if (e1 >>= 4) {
4246
0
      if (e1 >= 1 << n_bigtens)
4247
0
        goto undfl;
4248
0
#ifdef Avoid_Underflow
4249
0
      if (e1 & Scale_Bit)
4250
0
        bc.scale = 2*P;
4251
0
      for(j = 0; e1 > 0; j++, e1 >>= 1)
4252
0
        if (e1 & 1)
4253
0
          dval(&rv) *= tinytens[j];
4254
0
      if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
4255
0
            >> Exp_shift)) > 0) {
4256
        /* scaled rv is denormal; clear j low bits */
4257
0
        if (j >= 32) {
4258
0
          if (j > 54)
4259
0
            goto undfl;
4260
0
          word1(&rv) = 0;
4261
0
          if (j >= 53)
4262
0
           word0(&rv) = (P+2)*Exp_msk1;
4263
0
          else
4264
0
           word0(&rv) &= 0xffffffff << (j-32);
4265
0
          }
4266
0
        else
4267
0
          word1(&rv) &= 0xffffffff << j;
4268
0
        }
4269
#else
4270
      for(j = 0; e1 > 1; j++, e1 >>= 1)
4271
        if (e1 & 1)
4272
          dval(&rv) *= tinytens[j];
4273
      /* The last multiplication could underflow. */
4274
      dval(&rv0) = dval(&rv);
4275
      dval(&rv) *= tinytens[j];
4276
      if (!dval(&rv)) {
4277
        dval(&rv) = 2.*dval(&rv0);
4278
        dval(&rv) *= tinytens[j];
4279
#endif
4280
0
        if (!dval(&rv)) {
4281
0
 undfl:
4282
0
          dval(&rv) = 0.;
4283
#ifdef Honor_FLT_ROUNDS
4284
          if (bc.rounding == 2)
4285
            word1(&rv) = 1;
4286
#endif
4287
0
          goto range_err;
4288
0
          }
4289
#ifndef Avoid_Underflow
4290
        word0(&rv) = Tiny0;
4291
        word1(&rv) = Tiny1;
4292
        /* The refinement below will clean
4293
         * this approximation up.
4294
         */
4295
        }
4296
#endif
4297
0
      }
4298
0
    }
4299
4300
  /* Now the hard part -- adjusting rv to the correct value.*/
4301
4302
  /* Put digits into bd: true value = bd * 10^e */
4303
4304
0
  bc.nd = nd - nz1;
4305
0
#ifndef NO_STRTOD_BIGCOMP
4306
0
  bc.nd0 = nd0; /* Only needed if nd > strtod_diglim, but done here */
4307
      /* to silence an erroneous warning about bc.nd0 */
4308
      /* possibly not being initialized. */
4309
0
  if (nd > strtod_diglim) {
4310
    /* ASSERT(strtod_diglim >= 18); 18 == one more than the */
4311
    /* minimum number of decimal digits to distinguish double values */
4312
    /* in IEEE arithmetic. */
4313
0
    i = j = 18;
4314
0
    if (i > nd0)
4315
0
      j += bc.dplen;
4316
0
    for(;;) {
4317
0
      if (--j < bc.dp1 && j >= bc.dp0)
4318
0
        j = bc.dp0 - 1;
4319
0
      if (s0[j] != '0')
4320
0
        break;
4321
0
      --i;
4322
0
      }
4323
0
    e += nd - i;
4324
0
    nd = i;
4325
0
    if (nd0 > nd)
4326
0
      nd0 = nd;
4327
0
    if (nd < 9) { /* must recompute y */
4328
0
      y = 0;
4329
0
      for(i = 0; i < nd0; ++i)
4330
0
        y = 10*y + s0[i] - '0';
4331
0
      for(j = bc.dp1; i < nd; ++i)
4332
0
        y = 10*y + s0[j++] - '0';
4333
0
      }
4334
0
    }
4335
0
#endif
4336
0
  bd0 = s2b(s0, nd0, nd, y, bc.dplen MTb);
4337
4338
0
  for(;;) {
4339
0
    bd = Balloc(bd0->k MTb);
4340
0
    Bcopy(bd, bd0);
4341
0
    bb = d2b(&rv, &bbe, &bbbits MTb); /* rv = bb * 2^bbe */
4342
0
    bs = i2b(1 MTb);
4343
4344
0
    if (e >= 0) {
4345
0
      bb2 = bb5 = 0;
4346
0
      bd2 = bd5 = e;
4347
0
      }
4348
0
    else {
4349
0
      bb2 = bb5 = -e;
4350
0
      bd2 = bd5 = 0;
4351
0
      }
4352
0
    if (bbe >= 0)
4353
0
      bb2 += bbe;
4354
0
    else
4355
0
      bd2 -= bbe;
4356
0
    bs2 = bb2;
4357
#ifdef Honor_FLT_ROUNDS
4358
    if (bc.rounding != 1)
4359
      bs2++;
4360
#endif
4361
0
#ifdef Avoid_Underflow
4362
0
    Lsb = LSB;
4363
0
    Lsb1 = 0;
4364
0
    j = bbe - bc.scale;
4365
0
    i = j + bbbits - 1; /* logb(rv) */
4366
0
    j = P + 1 - bbbits;
4367
0
    if (i < Emin) { /* denormal */
4368
0
      i = Emin - i;
4369
0
      j -= i;
4370
0
      if (i < 32)
4371
0
        Lsb <<= i;
4372
0
      else if (i < 52)
4373
0
        Lsb1 = Lsb << (i-32);
4374
0
      else
4375
0
        Lsb1 = Exp_mask;
4376
0
      }
4377
#else /*Avoid_Underflow*/
4378
#ifdef Sudden_Underflow
4379
#ifdef IBM
4380
    j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
4381
#else
4382
    j = P + 1 - bbbits;
4383
#endif
4384
#else /*Sudden_Underflow*/
4385
    j = bbe;
4386
    i = j + bbbits - 1; /* logb(rv) */
4387
    if (i < Emin) /* denormal */
4388
      j += P - Emin;
4389
    else
4390
      j = P + 1 - bbbits;
4391
#endif /*Sudden_Underflow*/
4392
#endif /*Avoid_Underflow*/
4393
0
    bb2 += j;
4394
0
    bd2 += j;
4395
0
#ifdef Avoid_Underflow
4396
0
    bd2 += bc.scale;
4397
0
#endif
4398
0
    i = bb2 < bd2 ? bb2 : bd2;
4399
0
    if (i > bs2)
4400
0
      i = bs2;
4401
0
    if (i > 0) {
4402
0
      bb2 -= i;
4403
0
      bd2 -= i;
4404
0
      bs2 -= i;
4405
0
      }
4406
0
    if (bb5 > 0) {
4407
0
      bs = pow5mult(bs, bb5 MTb);
4408
0
      bb1 = mult(bs, bb MTb);
4409
0
      Bfree(bb MTb);
4410
0
      bb = bb1;
4411
0
      }
4412
0
    if (bb2 > 0)
4413
0
      bb = lshift(bb, bb2 MTb);
4414
0
    if (bd5 > 0)
4415
0
      bd = pow5mult(bd, bd5 MTb);
4416
0
    if (bd2 > 0)
4417
0
      bd = lshift(bd, bd2 MTb);
4418
0
    if (bs2 > 0)
4419
0
      bs = lshift(bs, bs2 MTb);
4420
0
    delta = diff(bb, bd MTb);
4421
0
    bc.dsign = delta->sign;
4422
0
    delta->sign = 0;
4423
0
    i = cmp(delta, bs);
4424
0
#ifndef NO_STRTOD_BIGCOMP /*{*/
4425
0
    if (bc.nd > nd && i <= 0) {
4426
0
      if (bc.dsign) {
4427
        /* Must use bigcomp(). */
4428
0
        req_bigcomp = 1;
4429
0
        break;
4430
0
        }
4431
#ifdef Honor_FLT_ROUNDS
4432
      if (bc.rounding != 1) {
4433
        if (i < 0) {
4434
          req_bigcomp = 1;
4435
          break;
4436
          }
4437
        }
4438
      else
4439
#endif
4440
0
        i = -1; /* Discarded digits make delta smaller. */
4441
0
      }
4442
0
#endif /*}*/
4443
#ifdef Honor_FLT_ROUNDS /*{*/
4444
    if (bc.rounding != 1) {
4445
      if (i < 0) {
4446
        /* Error is less than an ulp */
4447
        if (!delta->x[0] && delta->wds <= 1) {
4448
          /* exact */
4449
#ifdef SET_INEXACT
4450
          bc.inexact = 0;
4451
#endif
4452
          break;
4453
          }
4454
        if (bc.rounding) {
4455
          if (bc.dsign) {
4456
            adj.d = 1.;
4457
            goto apply_adj;
4458
            }
4459
          }
4460
        else if (!bc.dsign) {
4461
          adj.d = -1.;
4462
          if (!word1(&rv)
4463
           && !(word0(&rv) & Frac_mask)) {
4464
            y = word0(&rv) & Exp_mask;
4465
#ifdef Avoid_Underflow
4466
            if (!bc.scale || y > 2*P*Exp_msk1)
4467
#else
4468
            if (y)
4469
#endif
4470
              {
4471
              delta = lshift(delta,Log2P MTb);
4472
              if (cmp(delta, bs) <= 0)
4473
              adj.d = -0.5;
4474
              }
4475
            }
4476
 apply_adj:
4477
#ifdef Avoid_Underflow /*{*/
4478
          if (bc.scale && (y = word0(&rv) & Exp_mask)
4479
            <= 2*P*Exp_msk1)
4480
            word0(&adj) += (2*P+1)*Exp_msk1 - y;
4481
#else
4482
#ifdef Sudden_Underflow
4483
          if ((word0(&rv) & Exp_mask) <=
4484
              P*Exp_msk1) {
4485
            word0(&rv) += P*Exp_msk1;
4486
            dval(&rv) += adj.d*ulp(dval(&rv));
4487
            word0(&rv) -= P*Exp_msk1;
4488
            }
4489
          else
4490
#endif /*Sudden_Underflow*/
4491
#endif /*Avoid_Underflow}*/
4492
          dval(&rv) += adj.d*ulp(&rv);
4493
          }
4494
        break;
4495
        }
4496
      adj.d = ratio(delta, bs);
4497
      if (adj.d < 1.)
4498
        adj.d = 1.;
4499
      if (adj.d <= 0x7ffffffe) {
4500
        /* adj = rounding ? ceil(adj) : floor(adj); */
4501
        y = adj.d;
4502
        if (y != adj.d) {
4503
          if (!((bc.rounding>>1) ^ bc.dsign))
4504
            y++;
4505
          adj.d = y;
4506
          }
4507
        }
4508
#ifdef Avoid_Underflow /*{*/
4509
      if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
4510
        word0(&adj) += (2*P+1)*Exp_msk1 - y;
4511
#else
4512
#ifdef Sudden_Underflow
4513
      if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
4514
        word0(&rv) += P*Exp_msk1;
4515
        adj.d *= ulp(dval(&rv));
4516
        if (bc.dsign)
4517
          dval(&rv) += adj.d;
4518
        else
4519
          dval(&rv) -= adj.d;
4520
        word0(&rv) -= P*Exp_msk1;
4521
        goto cont;
4522
        }
4523
#endif /*Sudden_Underflow*/
4524
#endif /*Avoid_Underflow}*/
4525
      adj.d *= ulp(&rv);
4526
      if (bc.dsign) {
4527
        if (word0(&rv) == Big0 && word1(&rv) == Big1)
4528
          goto ovfl;
4529
        dval(&rv) += adj.d;
4530
        }
4531
      else
4532
        dval(&rv) -= adj.d;
4533
      goto cont;
4534
      }
4535
#endif /*}Honor_FLT_ROUNDS*/
4536
4537
0
    if (i < 0) {
4538
      /* Error is less than half an ulp -- check for
4539
       * special case of mantissa a power of two.
4540
       */
4541
0
      if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
4542
0
#ifdef IEEE_Arith /*{*/
4543
0
#ifdef Avoid_Underflow
4544
0
       || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
4545
#else
4546
       || (word0(&rv) & Exp_mask) <= Exp_msk1
4547
#endif
4548
0
#endif /*}*/
4549
0
        ) {
4550
#ifdef SET_INEXACT
4551
        if (!delta->x[0] && delta->wds <= 1)
4552
          bc.inexact = 0;
4553
#endif
4554
0
        break;
4555
0
        }
4556
0
      if (!delta->x[0] && delta->wds <= 1) {
4557
        /* exact result */
4558
#ifdef SET_INEXACT
4559
        bc.inexact = 0;
4560
#endif
4561
0
        break;
4562
0
        }
4563
0
      delta = lshift(delta,Log2P MTb);
4564
0
      if (cmp(delta, bs) > 0)
4565
0
        goto drop_down;
4566
0
      break;
4567
0
      }
4568
0
    if (i == 0) {
4569
      /* exactly half-way between */
4570
0
      if (bc.dsign) {
4571
0
        if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
4572
0
         &&  word1(&rv) == (
4573
0
#ifdef Avoid_Underflow
4574
0
      (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
4575
0
    ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
4576
0
#endif
4577
0
               0xffffffff)) {
4578
          /*boundary case -- increment exponent*/
4579
0
          if (word0(&rv) == Big0 && word1(&rv) == Big1)
4580
0
            goto ovfl;
4581
0
          word0(&rv) = (word0(&rv) & Exp_mask)
4582
0
            + Exp_msk1
4583
#ifdef IBM
4584
            | Exp_msk1 >> 4
4585
#endif
4586
0
            ;
4587
0
          word1(&rv) = 0;
4588
0
#ifdef Avoid_Underflow
4589
0
          bc.dsign = 0;
4590
0
#endif
4591
0
          break;
4592
0
          }
4593
0
        }
4594
0
      else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
4595
0
 drop_down:
4596
        /* boundary case -- decrement exponent */
4597
#ifdef Sudden_Underflow /*{{*/
4598
        L = word0(&rv) & Exp_mask;
4599
#ifdef IBM
4600
        if (L <  Exp_msk1)
4601
#else
4602
#ifdef Avoid_Underflow
4603
        if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
4604
#else
4605
        if (L <= Exp_msk1)
4606
#endif /*Avoid_Underflow*/
4607
#endif /*IBM*/
4608
          {
4609
          if (bc.nd >nd) {
4610
            bc.uflchk = 1;
4611
            break;
4612
            }
4613
          goto undfl;
4614
          }
4615
        L -= Exp_msk1;
4616
#else /*Sudden_Underflow}{*/
4617
0
#ifdef Avoid_Underflow
4618
0
        if (bc.scale) {
4619
0
          L = word0(&rv) & Exp_mask;
4620
0
          if (L <= (2*P+1)*Exp_msk1) {
4621
0
            if (L > (P+2)*Exp_msk1)
4622
              /* round even ==> */
4623
              /* accept rv */
4624
0
              break;
4625
            /* rv = smallest denormal */
4626
0
            if (bc.nd >nd) {
4627
0
              bc.uflchk = 1;
4628
0
              break;
4629
0
              }
4630
0
            goto undfl;
4631
0
            }
4632
0
          }
4633
0
#endif /*Avoid_Underflow*/
4634
0
        L = (word0(&rv) & Exp_mask) - Exp_msk1;
4635
0
#endif /*Sudden_Underflow}}*/
4636
0
        word0(&rv) = L | Bndry_mask1;
4637
0
        word1(&rv) = 0xffffffff;
4638
#ifdef IBM
4639
        goto cont;
4640
#else
4641
0
#ifndef NO_STRTOD_BIGCOMP
4642
0
        if (bc.nd > nd)
4643
0
          goto cont;
4644
0
#endif
4645
0
        break;
4646
0
#endif
4647
0
        }
4648
0
#ifndef ROUND_BIASED
4649
0
#ifdef Avoid_Underflow
4650
0
      if (Lsb1) {
4651
0
        if (!(word0(&rv) & Lsb1))
4652
0
          break;
4653
0
        }
4654
0
      else if (!(word1(&rv) & Lsb))
4655
0
        break;
4656
#else
4657
      if (!(word1(&rv) & LSB))
4658
        break;
4659
#endif
4660
0
#endif
4661
0
      if (bc.dsign)
4662
0
#ifdef Avoid_Underflow
4663
0
        dval(&rv) += sulp(&rv, &bc);
4664
#else
4665
        dval(&rv) += ulp(&rv);
4666
#endif
4667
0
#ifndef ROUND_BIASED
4668
0
      else {
4669
0
#ifdef Avoid_Underflow
4670
0
        dval(&rv) -= sulp(&rv, &bc);
4671
#else
4672
        dval(&rv) -= ulp(&rv);
4673
#endif
4674
0
#ifndef Sudden_Underflow
4675
0
        if (!dval(&rv)) {
4676
0
          if (bc.nd >nd) {
4677
0
            bc.uflchk = 1;
4678
0
            break;
4679
0
            }
4680
0
          goto undfl;
4681
0
          }
4682
0
#endif
4683
0
        }
4684
0
#ifdef Avoid_Underflow
4685
0
      bc.dsign = 1 - bc.dsign;
4686
0
#endif
4687
0
#endif
4688
0
      break;
4689
0
      }
4690
0
    if ((aadj = ratio(delta, bs)) <= 2.) {
4691
0
      if (bc.dsign)
4692
0
        aadj = aadj1 = 1.;
4693
0
      else if (word1(&rv) || word0(&rv) & Bndry_mask) {
4694
0
#ifndef Sudden_Underflow
4695
0
        if (word1(&rv) == Tiny1 && !word0(&rv)) {
4696
0
          if (bc.nd >nd) {
4697
0
            bc.uflchk = 1;
4698
0
            break;
4699
0
            }
4700
0
          goto undfl;
4701
0
          }
4702
0
#endif
4703
0
        aadj = 1.;
4704
0
        aadj1 = -1.;
4705
0
        }
4706
0
      else {
4707
        /* special case -- power of FLT_RADIX to be */
4708
        /* rounded down... */
4709
4710
0
        if (aadj < 2./FLT_RADIX)
4711
0
          aadj = 1./FLT_RADIX;
4712
0
        else
4713
0
          aadj *= 0.5;
4714
0
        aadj1 = -aadj;
4715
0
        }
4716
0
      }
4717
0
    else {
4718
0
      aadj *= 0.5;
4719
0
      aadj1 = bc.dsign ? aadj : -aadj;
4720
#ifdef Check_FLT_ROUNDS
4721
      switch(bc.rounding) {
4722
        case 2: /* towards +infinity */
4723
          aadj1 -= 0.5;
4724
          break;
4725
        case 0: /* towards 0 */
4726
        case 3: /* towards -infinity */
4727
          aadj1 += 0.5;
4728
        }
4729
#else
4730
0
      if (Flt_Rounds == 0)
4731
0
        aadj1 += 0.5;
4732
0
#endif /*Check_FLT_ROUNDS*/
4733
0
      }
4734
0
    y = word0(&rv) & Exp_mask;
4735
4736
    /* Check for overflow */
4737
4738
0
    if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
4739
0
      dval(&rv0) = dval(&rv);
4740
0
      word0(&rv) -= P*Exp_msk1;
4741
0
      adj.d = aadj1 * ulp(&rv);
4742
0
      dval(&rv) += adj.d;
4743
0
      if ((word0(&rv) & Exp_mask) >=
4744
0
          Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
4745
0
        if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
4746
0
          goto ovfl;
4747
0
        word0(&rv) = Big0;
4748
0
        word1(&rv) = Big1;
4749
0
        goto cont;
4750
0
        }
4751
0
      else
4752
0
        word0(&rv) += P*Exp_msk1;
4753
0
      }
4754
0
    else {
4755
0
#ifdef Avoid_Underflow
4756
0
      if (bc.scale && y <= 2*P*Exp_msk1) {
4757
0
        if (aadj <= 0x7fffffff) {
4758
0
          if ((z = aadj) <= 0)
4759
0
            z = 1;
4760
0
          aadj = z;
4761
0
          aadj1 = bc.dsign ? aadj : -aadj;
4762
0
          }
4763
0
        dval(&aadj2) = aadj1;
4764
0
        word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
4765
0
        aadj1 = dval(&aadj2);
4766
0
        adj.d = aadj1 * ulp(&rv);
4767
0
        dval(&rv) += adj.d;
4768
0
        if (rv.d == 0.)
4769
#ifdef NO_STRTOD_BIGCOMP
4770
          goto undfl;
4771
#else
4772
0
          {
4773
0
          req_bigcomp = 1;
4774
0
          break;
4775
0
          }
4776
0
#endif
4777
0
        }
4778
0
      else {
4779
0
        adj.d = aadj1 * ulp(&rv);
4780
0
        dval(&rv) += adj.d;
4781
0
        }
4782
#else
4783
#ifdef Sudden_Underflow
4784
      if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
4785
        dval(&rv0) = dval(&rv);
4786
        word0(&rv) += P*Exp_msk1;
4787
        adj.d = aadj1 * ulp(&rv);
4788
        dval(&rv) += adj.d;
4789
#ifdef IBM
4790
        if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)
4791
#else
4792
        if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
4793
#endif
4794
          {
4795
          if (word0(&rv0) == Tiny0
4796
           && word1(&rv0) == Tiny1) {
4797
            if (bc.nd >nd) {
4798
              bc.uflchk = 1;
4799
              break;
4800
              }
4801
            goto undfl;
4802
            }
4803
          word0(&rv) = Tiny0;
4804
          word1(&rv) = Tiny1;
4805
          goto cont;
4806
          }
4807
        else
4808
          word0(&rv) -= P*Exp_msk1;
4809
        }
4810
      else {
4811
        adj.d = aadj1 * ulp(&rv);
4812
        dval(&rv) += adj.d;
4813
        }
4814
#else /*Sudden_Underflow*/
4815
      /* Compute adj so that the IEEE rounding rules will
4816
       * correctly round rv + adj in some half-way cases.
4817
       * If rv * ulp(rv) is denormalized (i.e.,
4818
       * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
4819
       * trouble from bits lost to denormalization;
4820
       * example: 1.2e-307 .
4821
       */
4822
      if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
4823
        aadj1 = (double)(int)(aadj + 0.5);
4824
        if (!bc.dsign)
4825
          aadj1 = -aadj1;
4826
        }
4827
      adj.d = aadj1 * ulp(&rv);
4828
      dval(&rv) += adj.d;
4829
#endif /*Sudden_Underflow*/
4830
#endif /*Avoid_Underflow*/
4831
0
      }
4832
0
    z = word0(&rv) & Exp_mask;
4833
0
#ifndef SET_INEXACT
4834
0
    if (bc.nd == nd) {
4835
0
#ifdef Avoid_Underflow
4836
0
    if (!bc.scale)
4837
0
#endif
4838
0
    if (y == z) {
4839
      /* Can we stop now? */
4840
0
      L = (Long)aadj;
4841
0
      aadj -= L;
4842
      /* The tolerances below are conservative. */
4843
0
      if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
4844
0
        if (aadj < .4999999 || aadj > .5000001)
4845
0
          break;
4846
0
        }
4847
0
      else if (aadj < .4999999/FLT_RADIX)
4848
0
        break;
4849
0
      }
4850
0
    }
4851
0
#endif
4852
0
 cont:
4853
0
    Bfree(bb MTb);
4854
0
    Bfree(bd MTb);
4855
0
    Bfree(bs MTb);
4856
0
    Bfree(delta MTb);
4857
0
    }
4858
0
  Bfree(bb MTb);
4859
0
  Bfree(bd MTb);
4860
0
  Bfree(bs MTb);
4861
0
  Bfree(bd0 MTb);
4862
0
  Bfree(delta MTb);
4863
0
#ifndef NO_STRTOD_BIGCOMP
4864
0
  if (req_bigcomp) {
4865
0
    bd0 = 0;
4866
0
    bc.e0 += nz1;
4867
0
    bigcomp(&rv, s0, &bc MTb);
4868
0
    y = word0(&rv) & Exp_mask;
4869
0
    if (y == Exp_mask)
4870
0
      goto ovfl;
4871
0
    if (y == 0 && rv.d == 0.)
4872
0
      goto undfl;
4873
0
    }
4874
0
#endif
4875
0
#ifdef Avoid_Underflow
4876
0
  if (bc.scale) {
4877
0
    word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
4878
0
    word1(&rv0) = 0;
4879
0
    dval(&rv) *= dval(&rv0);
4880
0
#ifndef NO_ERRNO
4881
    /* try to avoid the bug of testing an 8087 register value */
4882
0
#ifdef IEEE_Arith
4883
0
    if (!(word0(&rv) & Exp_mask))
4884
#else
4885
    if (word0(&rv) == 0 && word1(&rv) == 0)
4886
#endif
4887
0
      Set_errno(ERANGE);
4888
0
#endif
4889
0
    }
4890
0
#endif /* Avoid_Underflow */
4891
0
 ret:
4892
#ifdef SET_INEXACT
4893
  if (bc.inexact) {
4894
    if (!(word0(&rv) & Exp_mask)) {
4895
      /* set underflow and inexact bits */
4896
      dval(&rv0) = 1e-300;
4897
      dval(&rv0) *= dval(&rv0);
4898
      }
4899
    else if (!oldinexact) {
4900
      word0(&rv0) = Exp_1 + (70 << Exp_shift);
4901
      word1(&rv0) = 0;
4902
      dval(&rv0) += 1.;
4903
      }
4904
    }
4905
  else if (!oldinexact)
4906
    clear_inexact();
4907
#endif
4908
0
  if (se)
4909
0
    *se = (char *)s;
4910
0
  return sign ? -dval(&rv) : dval(&rv);
4911
0
  }
4912
4913
#ifndef MULTIPLE_THREADS
4914
 static char *dtoa_result;
4915
#endif
4916
4917
 static char *
4918
rv_alloc(int i MTd)
4919
0
{
4920
0
  int j, k, *r;
4921
4922
0
  j = sizeof(ULong);
4923
0
  for(k = 0;
4924
0
    sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (size_t)i;
4925
0
    j <<= 1)
4926
0
      k++;
4927
0
  r = (int*)Balloc(k MTa);
4928
0
  *r = k;
4929
0
  return
4930
0
#ifndef MULTIPLE_THREADS
4931
0
  dtoa_result =
4932
0
#endif
4933
0
    (char *)(r+1);
4934
0
  }
4935
4936
 static char *
4937
nrv_alloc(const char *s, char *s0, size_t s0len, char **rve, int n MTd)
4938
19.0k
{
4939
19.0k
  char *rv, *t;
4940
4941
19.0k
  if (!s0)
4942
0
    s0 = rv_alloc(n MTa);
4943
19.0k
  else if (s0len <= (size_t)n) {
4944
0
    rv = 0;
4945
0
    t = rv + n;
4946
0
    goto rve_chk;
4947
0
    }
4948
19.0k
  t = rv = s0;
4949
38.1k
  while((*t = *s++))
4950
19.0k
    ++t;
4951
19.0k
 rve_chk:
4952
19.0k
  if (rve)
4953
19.0k
    *rve = t;
4954
19.0k
  return rv;
4955
19.0k
  }
4956
4957
/* freedtoa(s) must be used to free values s returned by dtoa
4958
 * when MULTIPLE_THREADS is #defined.  It should be used in all cases,
4959
 * but for consistency with earlier versions of dtoa, it is optional
4960
 * when MULTIPLE_THREADS is not defined.
4961
 */
4962
4963
 void
4964
freedtoa(char *s)
4965
0
{
4966
#ifdef MULTIPLE_THREADS
4967
  ThInfo *TI = 0;
4968
#endif
4969
0
  Bigint *b = (Bigint *)((int *)s - 1);
4970
0
  b->maxwds = 1 << (b->k = *(int*)b);
4971
0
  Bfree(b MTb);
4972
0
#ifndef MULTIPLE_THREADS
4973
0
  if (s == dtoa_result)
4974
0
    dtoa_result = 0;
4975
0
#endif
4976
0
  }
4977
4978
/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
4979
 *
4980
 * Inspired by "How to Print Floating-Point Numbers Accurately" by
4981
 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
4982
 *
4983
 * Modifications:
4984
 *  1. Rather than iterating, we use a simple numeric overestimate
4985
 *     to determine k = floor(log10(d)).  We scale relevant
4986
 *     quantities using O(log2(k)) rather than O(k) multiplications.
4987
 *  2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
4988
 *     try to generate digits strictly left to right.  Instead, we
4989
 *     compute with fewer bits and propagate the carry if necessary
4990
 *     when rounding the final digit up.  This is often faster.
4991
 *  3. Under the assumption that input will be rounded nearest,
4992
 *     mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
4993
 *     That is, we allow equality in stopping tests when the
4994
 *     round-nearest rule will give the same floating-point value
4995
 *     as would satisfaction of the stopping test with strict
4996
 *     inequality.
4997
 *  4. We remove common factors of powers of 2 from relevant
4998
 *     quantities.
4999
 *  5. When converting floating-point integers less than 1e16,
5000
 *     we use floating-point arithmetic rather than resorting
5001
 *     to multiple-precision integers.
5002
 *  6. When asked to produce fewer than 15 digits, we first try
5003
 *     to get by with floating-point arithmetic; we resort to
5004
 *     multiple-precision integer arithmetic only if we cannot
5005
 *     guarantee that the floating-point calculation has given
5006
 *     the correctly rounded result.  For k requested digits and
5007
 *     "uniformly" distributed input, the probability is
5008
 *     something like 10^(k-15) that we must resort to the Long
5009
 *     calculation.
5010
 */
5011
5012
 char *
5013
dtoa_r(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve, char *buf, size_t blen)
5014
1.91M
{
5015
 /* Arguments ndigits, decpt, sign are similar to those
5016
  of ecvt and fcvt; trailing zeros are suppressed from
5017
  the returned string.  If not null, *rve is set to point
5018
  to the end of the return value.  If d is +-Infinity or NaN,
5019
  then *decpt is set to 9999.
5020
5021
  mode:
5022
    0 ==> shortest string that yields d when read in
5023
      and rounded to nearest.
5024
    1 ==> like 0, but with Steele & White stopping rule;
5025
      e.g. with IEEE P754 arithmetic , mode 0 gives
5026
      1e23 whereas mode 1 gives 9.999999999999999e22.
5027
    2 ==> max(1,ndigits) significant digits.  This gives a
5028
      return value similar to that of ecvt, except
5029
      that trailing zeros are suppressed.
5030
    3 ==> through ndigits past the decimal point.  This
5031
      gives a return value similar to that from fcvt,
5032
      except that trailing zeros are suppressed, and
5033
      ndigits can be negative.
5034
    4,5 ==> similar to 2 and 3, respectively, but (in
5035
      round-nearest mode) with the tests of mode 0 to
5036
      possibly return a shorter string that rounds to d.
5037
      With IEEE arithmetic and compilation with
5038
      -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
5039
      as modes 2 and 3 when FLT_ROUNDS != 1.
5040
    6-9 ==> Debugging modes similar to mode - 4:  don't try
5041
      fast floating-point estimate (if applicable).
5042
5043
    Values of mode other than 0-9 are treated as mode 0.
5044
5045
  When not NULL, buf is an output buffer of length blen, which must
5046
  be large enough to accommodate suppressed trailing zeros and a trailing
5047
  null byte.  If blen is too small, rv = NULL is returned, in which case
5048
  if rve is not NULL, a subsequent call with blen >= (*rve - rv) + 1
5049
  should succeed in returning buf.
5050
5051
  When buf is NULL, sufficient space is allocated for the return value,
5052
  which, when done using, the caller should pass to freedtoa().
5053
5054
  USE_BF is automatically defined when neither NO_LONG_LONG nor NO_BF96
5055
  is defined.
5056
  */
5057
5058
#ifdef MULTIPLE_THREADS
5059
  ThInfo *TI = 0;
5060
#endif
5061
1.91M
  int bbits, b2, b5, be, dig, i, ilim, ilim1,
5062
1.91M
    j, j1, k, leftright, m2, m5, s2, s5, spec_case;
5063
1.91M
#if !defined(Sudden_Underflow) || defined(USE_BF96)
5064
1.91M
  int denorm;
5065
1.91M
#endif
5066
1.91M
  Bigint *b, *b1, *delta, *mlo, *mhi, *S;
5067
1.91M
  U u;
5068
1.91M
  char *s;
5069
#ifdef SET_INEXACT
5070
  int inexact, oldinexact;
5071
#endif
5072
1.91M
#ifdef USE_BF96 /*{{*/
5073
1.91M
  BF96 *p10;
5074
1.91M
  ULLong dbhi, dbits, dblo, den, hb, rb, rblo, res, res0, res3, reslo, sres,
5075
1.91M
    sulp, tv0, tv1, tv2, tv3, ulp, ulplo, ulpmask, ures, ureslo, zb;
5076
1.91M
  int eulp, k1, n2, ulpadj, ulpshift;
5077
#else /*}{*/
5078
#ifndef Sudden_Underflow
5079
  ULong x;
5080
#endif
5081
  Long L;
5082
  U d2, eps;
5083
  double ds;
5084
  int ieps, ilim0, k0, k_check, try_quick;
5085
#ifndef No_leftright
5086
#ifdef IEEE_Arith
5087
  U eps1;
5088
#endif
5089
#endif
5090
#endif /*}}*/
5091
#ifdef Honor_FLT_ROUNDS /*{*/
5092
  int Rounding;
5093
#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
5094
  Rounding = Flt_Rounds;
5095
#else /*}{*/
5096
  Rounding = 1;
5097
  switch(fegetround()) {
5098
    case FE_TOWARDZERO: Rounding = 0; break;
5099
    case FE_UPWARD: Rounding = 2; break;
5100
    case FE_DOWNWARD: Rounding = 3;
5101
    }
5102
#endif /*}}*/
5103
#endif /*}*/
5104
5105
1.91M
  u.d = dd;
5106
1.91M
  if (word0(&u) & Sign_bit) {
5107
    /* set sign for everything, including 0's and NaNs */
5108
817
    *sign = 1;
5109
817
    word0(&u) &= ~Sign_bit; /* clear sign bit */
5110
817
    }
5111
1.91M
  else
5112
1.91M
    *sign = 0;
5113
5114
1.91M
#if defined(IEEE_Arith) + defined(VAX)
5115
1.91M
#ifdef IEEE_Arith
5116
1.91M
  if ((word0(&u) & Exp_mask) == Exp_mask)
5117
#else
5118
  if (word0(&u)  == 0x8000)
5119
#endif
5120
0
    {
5121
    /* Infinity or NaN */
5122
0
    *decpt = 9999;
5123
0
#ifdef IEEE_Arith
5124
0
    if (!word1(&u) && !(word0(&u) & 0xfffff))
5125
0
      return nrv_alloc("Infinity", buf, blen, rve, 8 MTb);
5126
0
#endif
5127
0
    return nrv_alloc("NaN", buf, blen, rve, 3 MTb);
5128
0
    }
5129
1.91M
#endif
5130
#ifdef IBM
5131
  dval(&u) += 0; /* normalize */
5132
#endif
5133
1.91M
  if (!dval(&u)) {
5134
19.0k
    *decpt = 1;
5135
19.0k
    return nrv_alloc("0", buf, blen, rve, 1 MTb);
5136
19.0k
    }
5137
5138
#ifdef SET_INEXACT
5139
#ifndef USE_BF96
5140
  try_quick =
5141
#endif
5142
  oldinexact = get_inexact();
5143
  inexact = 1;
5144
#endif
5145
#ifdef Honor_FLT_ROUNDS
5146
  if (Rounding >= 2) {
5147
    if (*sign)
5148
      Rounding = Rounding == 2 ? 0 : 2;
5149
    else
5150
      if (Rounding != 2)
5151
        Rounding = 0;
5152
    }
5153
#endif
5154
1.89M
#ifdef USE_BF96 /*{{*/
5155
1.89M
  dbits = (u.LL & 0xfffffffffffffull) << 11;  /* fraction bits */
5156
1.89M
  if ((be = u.LL >> 52)) /* biased exponent; nonzero ==> normal */ {
5157
1.89M
    dbits |= 0x8000000000000000ull;
5158
1.89M
    denorm = ulpadj = 0;
5159
1.89M
    }
5160
2.31k
  else {
5161
2.31k
    denorm = 1;
5162
2.31k
    ulpadj = be + 1;
5163
2.31k
    dbits <<= 1;
5164
2.31k
    if (!(dbits & 0xffffffff00000000ull)) {
5165
1.42k
      dbits <<= 32;
5166
1.42k
      be -= 32;
5167
1.42k
      }
5168
2.31k
    if (!(dbits & 0xffff000000000000ull)) {
5169
712
      dbits <<= 16;
5170
712
      be -= 16;
5171
712
      }
5172
2.31k
    if (!(dbits & 0xff00000000000000ull)) {
5173
1.10k
      dbits <<= 8;
5174
1.10k
      be -= 8;
5175
1.10k
      }
5176
2.31k
    if (!(dbits & 0xf000000000000000ull)) {
5177
1.22k
      dbits <<= 4;
5178
1.22k
      be -= 4;
5179
1.22k
      }
5180
2.31k
    if (!(dbits & 0xc000000000000000ull)) {
5181
930
      dbits <<= 2;
5182
930
      be -= 2;
5183
930
      }
5184
2.31k
    if (!(dbits & 0x8000000000000000ull)) {
5185
996
      dbits <<= 1;
5186
996
      be -= 1;
5187
996
      }
5188
2.31k
    assert(be >= -51);
5189
2.31k
    ulpadj -= be;
5190
2.31k
    }
5191
1.89M
  j = Lhint[be + 51];
5192
1.89M
  p10 = &pten[j];
5193
1.89M
  dbhi = dbits >> 32;
5194
1.89M
  dblo = dbits & 0xffffffffull;
5195
1.89M
  i = be - 0x3fe;
5196
1.89M
  if (i < p10->e
5197
1.75M
  || (i == p10->e && (dbhi < p10->b0 || (dbhi == p10->b0 && dblo < p10->b1))))
5198
225k
    --j;
5199
1.89M
  k = j - 342;
5200
5201
  /* now 10^k <= dd < 10^(k+1) */
5202
5203
#else /*}{*/
5204
5205
  b = d2b(&u, &be, &bbits MTb);
5206
#ifdef Sudden_Underflow
5207
  i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
5208
#else
5209
  if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
5210
#endif
5211
    dval(&d2) = dval(&u);
5212
    word0(&d2) &= Frac_mask1;
5213
    word0(&d2) |= Exp_11;
5214
#ifdef IBM
5215
    if (j = 11 - hi0bits(word0(&d2) & Frac_mask))
5216
      dval(&d2) /= 1 << j;
5217
#endif
5218
5219
    /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
5220
     * log10(x)  =  log(x) / log(10)
5221
     *    ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
5222
     * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
5223
     *
5224
     * This suggests computing an approximation k to log10(d) by
5225
     *
5226
     * k = (i - Bias)*0.301029995663981
5227
     *  + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
5228
     *
5229
     * We want k to be too large rather than too small.
5230
     * The error in the first-order Taylor series approximation
5231
     * is in our favor, so we just round up the constant enough
5232
     * to compensate for any error in the multiplication of
5233
     * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
5234
     * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
5235
     * adding 1e-13 to the constant term more than suffices.
5236
     * Hence we adjust the constant term to 0.1760912590558.
5237
     * (We could get a more accurate k by invoking log10,
5238
     *  but this is probably not worthwhile.)
5239
     */
5240
5241
    i -= Bias;
5242
#ifdef IBM
5243
    i <<= 2;
5244
    i += j;
5245
#endif
5246
#ifndef Sudden_Underflow
5247
    denorm = 0;
5248
    }
5249
  else {
5250
    /* d is denormalized */
5251
5252
    i = bbits + be + (Bias + (P-1) - 1);
5253
    x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
5254
          : word1(&u) << (32 - i);
5255
    dval(&d2) = x;
5256
    word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
5257
    i -= (Bias + (P-1) - 1) + 1;
5258
    denorm = 1;
5259
    }
5260
#endif
5261
  ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
5262
  k = (int)ds;
5263
  if (ds < 0. && ds != k)
5264
    k--;  /* want k = floor(ds) */
5265
  k_check = 1;
5266
  if (k >= 0 && k <= Ten_pmax) {
5267
    if (dval(&u) < tens[k])
5268
      k--;
5269
    k_check = 0;
5270
    }
5271
  j = bbits - i - 1;
5272
  if (j >= 0) {
5273
    b2 = 0;
5274
    s2 = j;
5275
    }
5276
  else {
5277
    b2 = -j;
5278
    s2 = 0;
5279
    }
5280
  if (k >= 0) {
5281
    b5 = 0;
5282
    s5 = k;
5283
    s2 += k;
5284
    }
5285
  else {
5286
    b2 -= k;
5287
    b5 = -k;
5288
    s5 = 0;
5289
    }
5290
#endif /*}}*/
5291
1.89M
  if (mode < 0 || mode > 9)
5292
0
    mode = 0;
5293
5294
#ifndef USE_BF96
5295
#ifndef SET_INEXACT
5296
#ifdef Check_FLT_ROUNDS
5297
  try_quick = Rounding == 1;
5298
#else
5299
  try_quick = 1;
5300
#endif
5301
#endif /*SET_INEXACT*/
5302
#endif /*USE_BF96*/
5303
5304
1.89M
  if (mode > 5) {
5305
0
    mode -= 4;
5306
#ifndef USE_BF96
5307
    try_quick = 0;
5308
#endif
5309
0
    }
5310
1.89M
  leftright = 1;
5311
1.89M
  ilim = ilim1 = -1;  /* Values for cases 0 and 1; done here to */
5312
        /* silence erroneous "gcc -Wall" warning. */
5313
1.89M
  switch(mode) {
5314
830k
    case 0:
5315
830k
    case 1:
5316
830k
      i = 18;
5317
830k
      ndigits = 0;
5318
830k
      break;
5319
1.06M
    case 2:
5320
1.06M
      leftright = 0;
5321
      /* fall through */
5322
1.06M
    case 4:
5323
1.06M
      if (ndigits <= 0)
5324
0
        ndigits = 1;
5325
1.06M
      ilim = ilim1 = i = ndigits;
5326
1.06M
      break;
5327
0
    case 3:
5328
0
      leftright = 0;
5329
      /* fall through */
5330
0
    case 5:
5331
0
      i = ndigits + k + 1;
5332
0
      ilim = i;
5333
0
      ilim1 = i - 1;
5334
0
      if (i <= 0)
5335
0
        i = 1;
5336
1.89M
    }
5337
1.89M
  if (!buf) {
5338
0
    buf = rv_alloc(i MTb);
5339
0
    blen = sizeof(Bigint) + ((1 << ((int*)buf)[-1]) - 1)*sizeof(ULong) - sizeof(int);
5340
0
    }
5341
1.89M
  else if (blen <= (size_t)i) {
5342
119
    buf = 0;
5343
119
    if (rve)
5344
119
      *rve = buf + i;
5345
119
    return buf;
5346
119
    }
5347
1.89M
  s = buf;
5348
5349
  /* Check for special case that d is a normalized power of 2. */
5350
5351
1.89M
  spec_case = 0;
5352
1.89M
  if (mode < 2 || (leftright
5353
#ifdef Honor_FLT_ROUNDS
5354
      && Rounding == 1
5355
#endif
5356
1.06M
        )) {
5357
830k
    if (!word1(&u) && !(word0(&u) & Bndry_mask)
5358
11.2k
#ifndef Sudden_Underflow
5359
11.2k
     && word0(&u) & (Exp_mask & ~Exp_msk1)
5360
830k
#endif
5361
830k
        ) {
5362
      /* The special case */
5363
11.2k
      spec_case = 1;
5364
11.2k
      }
5365
830k
    }
5366
5367
1.89M
#ifdef USE_BF96 /*{*/
5368
1.89M
  b = 0;
5369
1.89M
  if (ilim < 0 && (mode == 3 || mode == 5)) {
5370
0
    S = mhi = 0;
5371
0
    goto no_digits;
5372
0
    }
5373
1.89M
  i = 1;
5374
1.89M
  j = 52 + 0x3ff - be;
5375
1.89M
  ulpshift = 0;
5376
1.89M
  ulplo = 0;
5377
  /* Can we do an exact computation with 64-bit integer arithmetic? */
5378
1.89M
  if (k < 0) {
5379
267k
    if (k < -25)
5380
3.49k
      goto toobig;
5381
263k
    res = dbits >> 11;
5382
263k
    n2 = pfivebits[k1 = -(k + 1)] + 53;
5383
263k
    j1 = j;
5384
263k
    if (n2 > 61) {
5385
5.93k
      ulpshift = n2 - 61;
5386
5.93k
      if (res & (ulpmask = (1ull << ulpshift) - 1))
5387
5.58k
        goto toobig;
5388
358
      j -= ulpshift;
5389
358
      res >>= ulpshift;
5390
358
      }
5391
    /* Yes. */
5392
258k
    res *= ulp = pfive[k1];
5393
258k
    if (ulpshift) {
5394
358
      ulplo = ulp;
5395
358
      ulp >>= ulpshift;
5396
358
      }
5397
258k
    j += k;
5398
258k
    if (ilim == 0) {
5399
0
      S = mhi = 0;
5400
0
      if (res > (5ull << j))
5401
0
        goto one_digit;
5402
0
      goto no_digits;
5403
0
      }
5404
258k
    goto no_div;
5405
258k
    }
5406
1.62M
  if (ilim == 0 && j + k >= 0) {
5407
0
    S = mhi = 0;
5408
0
    if ((dbits >> 11) > (pfive[k-1] << j))
5409
0
      goto one_digit;
5410
0
    goto no_digits;
5411
0
    }
5412
1.62M
  if (k <= dtoa_divmax && j + k >= 0) {
5413
    /* Another "yes" case -- we will use exact integer arithmetic. */
5414
1.54M
 use_exact:
5415
1.54M
    Debug(++dtoa_stats[3]);
5416
1.54M
    res = dbits >> 11;  /* residual */
5417
1.54M
    ulp = 1;
5418
1.54M
    if (k <= 0)
5419
622k
      goto no_div;
5420
927k
    j1 = j + k + 1;
5421
927k
    den = pfive[k-i] << (j1 - i);
5422
1.03M
    for(;;) {
5423
1.03M
      dig = res / den;
5424
1.03M
      *s++ = '0' + dig;
5425
1.03M
      if (!(res -= dig*den)) {
5426
#ifdef SET_INEXACT
5427
        inexact = 0;
5428
        oldinexact = 1;
5429
#endif
5430
6.87k
        goto retc;
5431
6.87k
        }
5432
1.02M
      if (ilim < 0) {
5433
848k
        ures = den - res;
5434
848k
        if (2*res <= ulp
5435
0
        && (spec_case ? 4*res <= ulp : (2*res < ulp || dig & 1)))
5436
0
          goto ulp_reached;
5437
848k
        if (2*ures < ulp)
5438
0
          goto Roundup;
5439
848k
        }
5440
177k
      else if (i == ilim) {
5441
153k
        switch(Rounding) {
5442
0
          case 0: goto retc;
5443
0
          case 2: goto Roundup;
5444
153k
          }
5445
153k
        ures = 2*res;
5446
153k
        if (ures > den
5447
142k
        || (ures == den && dig & 1)
5448
141k
        || (spec_case && res <= ulp && 2*res >= ulp))
5449
11.7k
          goto Roundup;
5450
141k
        goto retc;
5451
153k
        }
5452
872k
      if (j1 < ++i) {
5453
224
        res *= 10;
5454
224
        ulp *= 10;
5455
224
        }
5456
872k
      else {
5457
872k
        if (i > k)
5458
767k
          break;
5459
105k
        den = pfive[k-i] << (j1 - i);
5460
105k
        }
5461
872k
      }
5462
1.64M
 no_div:
5463
18.3M
    for(;;) {
5464
18.3M
      dig = den = res >> j;
5465
18.3M
      *s++ = '0' + dig;
5466
18.3M
      if (!(res -= den << j)) {
5467
#ifdef SET_INEXACT
5468
        inexact = 0;
5469
        oldinexact = 1;
5470
#endif
5471
803k
        goto retc;
5472
803k
        }
5473
17.5M
      if (ilim < 0) {
5474
26.1k
        ures = (1ull << j) - res;
5475
26.1k
        if (2*res <= ulp
5476
1.28k
        && (spec_case ? 4*res <= ulp : (2*res < ulp || dig & 1))) {
5477
1.28k
 ulp_reached:
5478
1.28k
          if (ures < res
5479
1.07k
          || (ures == res && dig & 1))
5480
214
            goto Roundup;
5481
1.07k
          goto retc;
5482
1.28k
          }
5483
24.8k
        if (2*ures < ulp)
5484
6.91k
          goto Roundup;
5485
24.8k
        }
5486
17.5M
      --j;
5487
17.5M
      if (i == ilim) {
5488
#ifdef Honor_FLT_ROUNDS
5489
        switch(Rounding) {
5490
          case 0: goto retc;
5491
          case 2: goto Roundup;
5492
          }
5493
#endif
5494
836k
        hb = 1ull << j;
5495
836k
        if (res & hb && (dig & 1 || res & (hb-1)))
5496
135k
          goto Roundup;
5497
700k
        if (spec_case && res <= ulp && 2*res >= ulp) {
5498
184k
 Roundup:
5499
187k
          while(*--s == '9')
5500
6.23k
            if (s == buf) {
5501
2.60k
              ++k;
5502
2.60k
              *s++ = '1';
5503
2.60k
              goto ret1;
5504
2.60k
              }
5505
181k
          ++*s++;
5506
181k
          goto ret1;
5507
184k
          }
5508
700k
        goto retc;
5509
700k
        }
5510
16.6M
      ++i;
5511
16.6M
      res *= 5;
5512
16.6M
      if (ulpshift) {
5513
606
        ulplo = 5*(ulplo & ulpmask);
5514
606
        ulp = 5*ulp + (ulplo >> ulpshift);
5515
606
        }
5516
16.6M
      else
5517
16.6M
        ulp *= 5;
5518
16.6M
      }
5519
1.64M
    }
5520
92.7k
 toobig:
5521
92.7k
  if (ilim > 28)
5522
0
    goto Fast_failed1;
5523
  /* Scale by 10^-k */
5524
92.7k
  p10 = &pten[342-k];
5525
92.7k
  tv0 = p10->b2 * dblo; /* rarely matters, but does, e.g., for 9.862818194192001e18 */
5526
92.7k
  tv1 = p10->b1 * dblo + (tv0 >> 32);
5527
92.7k
  tv2 = p10->b2 * dbhi + (tv1 & 0xffffffffull);
5528
92.7k
  tv3 = p10->b0 * dblo + (tv1>>32) + (tv2>>32);
5529
92.7k
  res3 = p10->b1 * dbhi + (tv3 & 0xffffffffull);
5530
92.7k
  res = p10->b0 * dbhi + (tv3>>32) + (res3>>32);
5531
92.7k
  be += p10->e - 0x3fe;
5532
92.7k
  eulp = j1 = be - 54 + ulpadj;
5533
92.7k
  if (!(res & 0x8000000000000000ull)) {
5534
40.1k
    --be;
5535
40.1k
    res3 <<= 1;
5536
40.1k
    res = (res << 1) | ((res3 & 0x100000000ull) >> 32);
5537
40.1k
    }
5538
92.7k
  res0 = res; /* save for Fast_failed */
5539
92.7k
#if !defined(SET_INEXACT) && !defined(NO_DTOA_64) /*{*/
5540
92.7k
  if (ilim > 19)
5541
7.32k
    goto Fast_failed;
5542
85.4k
  Debug(++dtoa_stats[4]);
5543
85.4k
  assert(be >= 0 && be <= 4); /* be = 0 is rare, but possible, e.g., for 1e20 */
5544
85.4k
  res >>= 4 - be;
5545
85.4k
  ulp = p10->b0;  /* ulp */
5546
85.4k
  ulp = (ulp << 29) | (p10->b1 >> 3);
5547
  /* scaled ulp = ulp * 2^(eulp - 60) */
5548
  /* We maintain 61 bits of the scaled ulp. */
5549
85.4k
  if (ilim == 0) {
5550
0
    if (!(res & 0x7fffffffffffffeull)
5551
0
     || !((~res) & 0x7fffffffffffffeull))
5552
0
      goto Fast_failed1;
5553
0
    S = mhi = 0;
5554
0
    if (res >= 0x5000000000000000ull)
5555
0
      goto one_digit;
5556
0
    goto no_digits;
5557
0
    }
5558
85.4k
  rb = 1; /* upper bound on rounding error */
5559
774k
  for(;;++i) {
5560
774k
    dig = res >> 60;
5561
774k
    *s++ = '0' + dig;
5562
774k
    res &= 0xfffffffffffffffull;
5563
774k
    if (ilim < 0) {
5564
610k
      ures = 0x1000000000000000ull - res;
5565
610k
      if (eulp > 0) {
5566
2.15k
        assert(eulp <= 4);
5567
2.15k
        sulp = ulp << (eulp - 1);
5568
2.15k
        if (res <= ures) {
5569
1.62k
          if (res + rb > ures - rb)
5570
229
            goto Fast_failed;
5571
1.39k
          if (res < sulp)
5572
1.39k
            goto retc;
5573
1.39k
          }
5574
534
        else {
5575
534
          if (res - rb <= ures + rb)
5576
206
            goto Fast_failed;
5577
328
          if (ures < sulp)
5578
328
            goto Roundup;
5579
328
          }
5580
2.15k
        }
5581
608k
      else {
5582
608k
        zb = -(1ull << (eulp + 63));
5583
608k
        if (!(zb & res)) {
5584
37.7k
          sres = res << (1 - eulp);
5585
37.7k
          if (sres < ulp && (!spec_case || 2*sres < ulp)) {
5586
3.52k
            if ((res+rb) << (1 - eulp) >= ulp)
5587
1.93k
              goto Fast_failed;
5588
1.59k
            if (ures < res) {
5589
477
              if (ures + rb >= res - rb)
5590
219
                goto Fast_failed;
5591
258
              goto Roundup;
5592
477
              }
5593
1.11k
            if (ures - rb < res + rb)
5594
480
              goto Fast_failed;
5595
639
            goto retc;
5596
1.11k
            }
5597
37.7k
          }
5598
604k
        if (!(zb & ures) && ures << -eulp < ulp) {
5599
48.8k
          if (ures << (1 - eulp) < ulp)
5600
20.0k
            goto  Roundup;
5601
28.7k
          goto Fast_failed;
5602
48.8k
          }
5603
604k
        }
5604
610k
      }
5605
164k
    else if (i == ilim) {
5606
30.9k
      ures = 0x1000000000000000ull - res;
5607
30.9k
      if (ures < res) {
5608
13.0k
        if (ures <= rb || res - rb <= ures + rb) {
5609
6.58k
          if (j + k >= 0 && k >= 0 && k <= 27)
5610
6.01k
            goto use_exact1;
5611
570
          goto Fast_failed;
5612
6.58k
          }
5613
#ifdef Honor_FLT_ROUNDS
5614
        if (Rounding == 0)
5615
          goto retc;
5616
#endif
5617
6.44k
        goto Roundup;
5618
13.0k
        }
5619
17.9k
      if (res <= rb || ures - rb <= res + rb) {
5620
2.46k
        if (j + k >= 0 && k >= 0 && k <= 27) {
5621
6.28k
 use_exact1:
5622
6.28k
          s = buf;
5623
6.28k
          i = 1;
5624
6.28k
          goto use_exact;
5625
276
          }
5626
2.18k
        goto Fast_failed;
5627
2.46k
        }
5628
#ifdef Honor_FLT_ROUNDS
5629
      if (Rounding == 2)
5630
        goto Roundup;
5631
#endif
5632
15.4k
      goto retc;
5633
17.9k
      }
5634
689k
    rb *= 10;
5635
689k
    if (rb >= 0x1000000000000000ull)
5636
0
      goto Fast_failed;
5637
689k
    res *= 10;
5638
689k
    ulp *= 5;
5639
689k
    if (ulp & 0x8000000000000000ull) {
5640
216k
      eulp += 4;
5641
216k
      ulp >>= 3;
5642
216k
      }
5643
472k
    else {
5644
472k
      eulp += 3;
5645
472k
      ulp >>= 2;
5646
472k
      }
5647
689k
    }
5648
0
#endif /*}*/
5649
0
#ifndef NO_BF96
5650
41.9k
 Fast_failed:
5651
41.9k
#endif
5652
41.9k
  Debug(++dtoa_stats[5]);
5653
41.9k
  s = buf;
5654
41.9k
  i = 4 - be;
5655
41.9k
  res = res0 >> i;
5656
41.9k
  reslo = 0xffffffffull & res3;
5657
41.9k
  if (i)
5658
12.8k
    reslo = (res0 << (64 - i)) >> 32 | (reslo >> i);
5659
41.9k
  rb = 0;
5660
41.9k
  rblo = 4; /* roundoff bound */
5661
41.9k
  ulp = p10->b0;  /* ulp */
5662
41.9k
  ulp = (ulp << 29) | (p10->b1 >> 3);
5663
41.9k
  eulp = j1;
5664
658k
  for(i = 1;;++i) {
5665
658k
    dig = res >> 60;
5666
658k
    *s++ = '0' + dig;
5667
658k
    res &= 0xfffffffffffffffull;
5668
#ifdef SET_INEXACT
5669
    if (!res && !reslo) {
5670
      if (!(res3 & 0xffffffffull)) {
5671
        inexact = 0;
5672
        oldinexact = 1;
5673
        }
5674
      goto retc;
5675
      }
5676
#endif
5677
658k
    if (ilim < 0) {
5678
481k
      ures = 0x1000000000000000ull - res;
5679
481k
      ureslo = 0;
5680
481k
      if (reslo) {
5681
480k
        ureslo = 0x100000000ull - reslo;
5682
480k
        --ures;
5683
480k
        }
5684
481k
      if (eulp > 0) {
5685
1.31k
        assert(eulp <= 4);
5686
1.31k
        sulp = (ulp << (eulp - 1)) - rb;
5687
1.31k
        if (res <= ures) {
5688
658
          if (res < sulp) {
5689
658
            if (res+rb < ures-rb)
5690
438
              goto retc;
5691
658
            }
5692
658
          }
5693
658
        else if (ures < sulp) {
5694
658
          if (res-rb > ures+rb)
5695
658
            goto Roundup;
5696
658
          }
5697
220
        goto Fast_failed1;
5698
1.31k
        }
5699
479k
      else {
5700
479k
        zb = -(1ull << (eulp + 60));
5701
479k
        if (!(zb & (res + rb))) {
5702
30.3k
          sres = (res - rb) << (1 - eulp);
5703
30.3k
          if (sres < ulp && (!spec_case || 2*sres < ulp)) {
5704
29.5k
            sres = res << (1 - eulp);
5705
29.5k
            if ((j = eulp + 31) > 0)
5706
28.3k
              sres += (rblo + reslo) >> j;
5707
1.24k
            else
5708
1.24k
              sres += (rblo + reslo) << -j;
5709
29.5k
            if (sres + (rb << (1 - eulp)) >= ulp)
5710
27.9k
              goto Fast_failed1;
5711
1.59k
            if (sres >= ulp)
5712
0
              goto more96;
5713
1.59k
            if (ures < res
5714
971
            || (ures == res && ureslo < reslo)) {
5715
624
              if (ures + rb >= res - rb)
5716
0
                goto Fast_failed1;
5717
624
              goto Roundup;
5718
624
              }
5719
971
            if (ures - rb <= res + rb)
5720
466
              goto Fast_failed1;
5721
505
            goto retc;
5722
971
            }
5723
30.3k
          }
5724
450k
        if (!(zb & ures) && (ures-rb) << (1 - eulp) < ulp) {
5725
955
          if ((ures + rb) << (1 - eulp) < ulp)
5726
432
            goto Roundup;
5727
523
          goto Fast_failed1;
5728
955
          }
5729
450k
        }
5730
481k
      }
5731
177k
    else if (i == ilim) {
5732
10.0k
      ures = 0x1000000000000000ull - res;
5733
10.0k
      sres = ureslo = 0;
5734
10.0k
      if (reslo) {
5735
9.59k
        ureslo = 0x100000000ull - reslo;
5736
9.59k
        --ures;
5737
9.59k
        sres = (reslo + rblo) >> 31;
5738
9.59k
        }
5739
10.0k
      sres += 2*rb;
5740
10.0k
      if (ures <= res) {
5741
7.16k
        if (ures <=sres || res - ures <= sres)
5742
6.47k
          goto Fast_failed1;
5743
#ifdef Honor_FLT_ROUNDS
5744
        if (Rounding == 0)
5745
          goto retc;
5746
#endif
5747
691
        goto Roundup;
5748
7.16k
        }
5749
2.91k
      if (res <= sres || ures - res <= sres)
5750
1.96k
        goto Fast_failed1;
5751
#ifdef Honor_FLT_ROUNDS
5752
      if (Rounding == 2)
5753
        goto Roundup;
5754
#endif
5755
950
      goto retc;
5756
2.91k
      }
5757
617k
 more96:
5758
617k
    rblo *= 10;
5759
617k
    rb = 10*rb + (rblo >> 32);
5760
617k
    rblo &= 0xffffffffull;
5761
617k
    if (rb >= 0x1000000000000000ull)
5762
0
      goto Fast_failed1;
5763
617k
    reslo *= 10;
5764
617k
    res = 10*res + (reslo >> 32);
5765
617k
    reslo &= 0xffffffffull;
5766
617k
    ulp *= 5;
5767
617k
    if (ulp & 0x8000000000000000ull) {
5768
201k
      eulp += 4;
5769
201k
      ulp >>= 3;
5770
201k
      }
5771
415k
    else {
5772
415k
      eulp += 3;
5773
415k
      ulp >>= 2;
5774
415k
      }
5775
617k
    }
5776
37.6k
 Fast_failed1:
5777
37.6k
  Debug(++dtoa_stats[6]);
5778
37.6k
  S = mhi = mlo = 0;
5779
37.6k
#ifdef USE_BF96
5780
37.6k
  b = d2b(&u, &be, &bbits MTb);
5781
37.6k
#endif
5782
37.6k
  s = buf;
5783
37.6k
  i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
5784
37.6k
  i -= Bias;
5785
37.6k
  if (ulpadj)
5786
75
    i -= ulpadj - 1;
5787
37.6k
  j = bbits - i - 1;
5788
37.6k
  if (j >= 0) {
5789
2.45k
    b2 = 0;
5790
2.45k
    s2 = j;
5791
2.45k
    }
5792
35.1k
  else {
5793
35.1k
    b2 = -j;
5794
35.1k
    s2 = 0;
5795
35.1k
    }
5796
37.6k
  if (k >= 0) {
5797
36.8k
    b5 = 0;
5798
36.8k
    s5 = k;
5799
36.8k
    s2 += k;
5800
36.8k
    }
5801
796
  else {
5802
796
    b2 -= k;
5803
796
    b5 = -k;
5804
796
    s5 = 0;
5805
796
    }
5806
37.6k
#endif /*}*/
5807
5808
#ifdef Honor_FLT_ROUNDS
5809
  if (mode > 1 && Rounding != 1)
5810
    leftright = 0;
5811
#endif
5812
5813
#ifndef USE_BF96 /*{*/
5814
  if (ilim >= 0 && ilim <= Quick_max && try_quick) {
5815
5816
    /* Try to get by with floating-point arithmetic. */
5817
5818
    i = 0;
5819
    dval(&d2) = dval(&u);
5820
    j1 = -(k0 = k);
5821
    ilim0 = ilim;
5822
    ieps = 2; /* conservative */
5823
    if (k > 0) {
5824
      ds = tens[k&0xf];
5825
      j = k >> 4;
5826
      if (j & Bletch) {
5827
        /* prevent overflows */
5828
        j &= Bletch - 1;
5829
        dval(&u) /= bigtens[n_bigtens-1];
5830
        ieps++;
5831
        }
5832
      for(; j; j >>= 1, i++)
5833
        if (j & 1) {
5834
          ieps++;
5835
          ds *= bigtens[i];
5836
          }
5837
      dval(&u) /= ds;
5838
      }
5839
    else if (j1 > 0) {
5840
      dval(&u) *= tens[j1 & 0xf];
5841
      for(j = j1 >> 4; j; j >>= 1, i++)
5842
        if (j & 1) {
5843
          ieps++;
5844
          dval(&u) *= bigtens[i];
5845
          }
5846
      }
5847
    if (k_check && dval(&u) < 1. && ilim > 0) {
5848
      if (ilim1 <= 0)
5849
        goto fast_failed;
5850
      ilim = ilim1;
5851
      k--;
5852
      dval(&u) *= 10.;
5853
      ieps++;
5854
      }
5855
    dval(&eps) = ieps*dval(&u) + 7.;
5856
    word0(&eps) -= (P-1)*Exp_msk1;
5857
    if (ilim == 0) {
5858
      S = mhi = 0;
5859
      dval(&u) -= 5.;
5860
      if (dval(&u) > dval(&eps))
5861
        goto one_digit;
5862
      if (dval(&u) < -dval(&eps))
5863
        goto no_digits;
5864
      goto fast_failed;
5865
      }
5866
#ifndef No_leftright
5867
    if (leftright) {
5868
      /* Use Steele & White method of only
5869
       * generating digits needed.
5870
       */
5871
      dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
5872
#ifdef IEEE_Arith
5873
      if (j1 >= 307) {
5874
        eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */
5875
        word0(&eps1) -= Exp_msk1 * (Bias+P-1);
5876
        dval(&eps1) *= tens[j1 & 0xf];
5877
        for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++)
5878
          if (j & 1)
5879
            dval(&eps1) *= bigtens[i];
5880
        if (eps.d < eps1.d)
5881
          eps.d = eps1.d;
5882
        if (10. - u.d < 10.*eps.d && eps.d < 1.) {
5883
          /* eps.d < 1. excludes trouble with the tiniest denormal */
5884
          *s++ = '1';
5885
          ++k;
5886
          goto ret1;
5887
          }
5888
        }
5889
#endif
5890
      for(i = 0;;) {
5891
        L = dval(&u);
5892
        dval(&u) -= L;
5893
        *s++ = '0' + (int)L;
5894
        if (1. - dval(&u) < dval(&eps))
5895
          goto bump_up;
5896
        if (dval(&u) < dval(&eps))
5897
          goto retc;
5898
        if (++i >= ilim)
5899
          break;
5900
        dval(&eps) *= 10.;
5901
        dval(&u) *= 10.;
5902
        }
5903
      }
5904
    else {
5905
#endif
5906
      /* Generate ilim digits, then fix them up. */
5907
      dval(&eps) *= tens[ilim-1];
5908
      for(i = 1;; i++, dval(&u) *= 10.) {
5909
        L = (Long)(dval(&u));
5910
        if (!(dval(&u) -= L))
5911
          ilim = i;
5912
        *s++ = '0' + (int)L;
5913
        if (i == ilim) {
5914
          if (dval(&u) > 0.5 + dval(&eps))
5915
            goto bump_up;
5916
          else if (dval(&u) < 0.5 - dval(&eps))
5917
            goto retc;
5918
          break;
5919
          }
5920
        }
5921
#ifndef No_leftright
5922
      }
5923
#endif
5924
 fast_failed:
5925
    s = buf;
5926
    dval(&u) = dval(&d2);
5927
    k = k0;
5928
    ilim = ilim0;
5929
    }
5930
5931
  /* Do we have a "small" integer? */
5932
5933
  if (be >= 0 && k <= Int_max) {
5934
    /* Yes. */
5935
    ds = tens[k];
5936
    if (ndigits < 0 && ilim <= 0) {
5937
      S = mhi = 0;
5938
      if (ilim < 0 || dval(&u) <= 5*ds)
5939
        goto no_digits;
5940
      goto one_digit;
5941
      }
5942
    for(i = 1;; i++, dval(&u) *= 10.) {
5943
      L = (Long)(dval(&u) / ds);
5944
      dval(&u) -= L*ds;
5945
#ifdef Check_FLT_ROUNDS
5946
      /* If FLT_ROUNDS == 2, L will usually be high by 1 */
5947
      if (dval(&u) < 0) {
5948
        L--;
5949
        dval(&u) += ds;
5950
        }
5951
#endif
5952
      *s++ = '0' + (int)L;
5953
      if (!dval(&u)) {
5954
#ifdef SET_INEXACT
5955
        inexact = 0;
5956
#endif
5957
        break;
5958
        }
5959
      if (i == ilim) {
5960
#ifdef Honor_FLT_ROUNDS
5961
        if (mode > 1)
5962
        switch(Rounding) {
5963
          case 0: goto retc;
5964
          case 2: goto bump_up;
5965
          }
5966
#endif
5967
        dval(&u) += dval(&u);
5968
#ifdef ROUND_BIASED
5969
        if (dval(&u) >= ds)
5970
#else
5971
        if (dval(&u) > ds || (dval(&u) == ds && L & 1))
5972
#endif
5973
          {
5974
 bump_up:
5975
          while(*--s == '9')
5976
            if (s == buf) {
5977
              k++;
5978
              *s = '0';
5979
              break;
5980
              }
5981
          ++*s++;
5982
          }
5983
        break;
5984
        }
5985
      }
5986
    goto retc;
5987
    }
5988
5989
#endif /*}*/
5990
37.6k
  m2 = b2;
5991
37.6k
  m5 = b5;
5992
37.6k
  mhi = mlo = 0;
5993
37.6k
  if (leftright) {
5994
29.1k
    i =
5995
29.1k
#ifndef Sudden_Underflow
5996
29.1k
      denorm ? be + (Bias + (P-1) - 1 + 1) :
5997
29.1k
#endif
5998
#ifdef IBM
5999
      1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
6000
#else
6001
29.1k
      1 + P - bbits;
6002
29.1k
#endif
6003
29.1k
    b2 += i;
6004
29.1k
    s2 += i;
6005
29.1k
    mhi = i2b(1 MTb);
6006
29.1k
    }
6007
37.6k
  if (m2 > 0 && s2 > 0) {
6008
35.9k
    i = m2 < s2 ? m2 : s2;
6009
35.9k
    b2 -= i;
6010
35.9k
    m2 -= i;
6011
35.9k
    s2 -= i;
6012
35.9k
    }
6013
37.6k
  if (b5 > 0) {
6014
796
    if (leftright) {
6015
395
      if (m5 > 0) {
6016
395
        mhi = pow5mult(mhi, m5 MTb);
6017
395
        b1 = mult(mhi, b MTb);
6018
395
        Bfree(b MTb);
6019
395
        b = b1;
6020
395
        }
6021
395
      if ((j = b5 - m5))
6022
0
        b = pow5mult(b, j MTb);
6023
395
      }
6024
401
    else
6025
401
      b = pow5mult(b, b5 MTb);
6026
796
    }
6027
37.6k
  S = i2b(1 MTb);
6028
37.6k
  if (s5 > 0)
6029
36.8k
    S = pow5mult(S, s5 MTb);
6030
6031
37.6k
  if (spec_case) {
6032
0
    b2 += Log2P;
6033
0
    s2 += Log2P;
6034
0
    }
6035
6036
  /* Arrange for convenient computation of quotients:
6037
   * shift left if necessary so divisor has 4 leading 0 bits.
6038
   *
6039
   * Perhaps we should just compute leading 28 bits of S once
6040
   * and for all and pass them and a shift to quorem, so it
6041
   * can do shifts and ors to compute the numerator for q.
6042
   */
6043
37.6k
  i = dshift(S, s2);
6044
37.6k
  b2 += i;
6045
37.6k
  m2 += i;
6046
37.6k
  s2 += i;
6047
37.6k
  if (b2 > 0)
6048
37.1k
    b = lshift(b, b2 MTb);
6049
37.6k
  if (s2 > 0)
6050
37.2k
    S = lshift(S, s2 MTb);
6051
#ifndef USE_BF96
6052
  if (k_check) {
6053
    if (cmp(b,S) < 0) {
6054
      k--;
6055
      b = multadd(b, 10, 0 MTb);  /* we botched the k estimate */
6056
      if (leftright)
6057
        mhi = multadd(mhi, 10, 0 MTb);
6058
      ilim = ilim1;
6059
      }
6060
    }
6061
#endif
6062
37.6k
  if (ilim <= 0 && (mode == 3 || mode == 5)) {
6063
0
    if (ilim < 0 || cmp(b,S = multadd(S,5,0 MTb)) <= 0) {
6064
      /* no digits, fcvt style */
6065
0
 no_digits:
6066
0
      k = -1 - ndigits;
6067
0
      goto ret;
6068
0
      }
6069
0
 one_digit:
6070
0
    *s++ = '1';
6071
0
    ++k;
6072
0
    goto ret;
6073
0
    }
6074
37.6k
  if (leftright) {
6075
29.1k
    if (m2 > 0)
6076
29.1k
      mhi = lshift(mhi, m2 MTb);
6077
6078
    /* Compute mlo -- check for special case
6079
     * that d is a normalized power of 2.
6080
     */
6081
6082
29.1k
    mlo = mhi;
6083
29.1k
    if (spec_case) {
6084
0
      mhi = Balloc(mhi->k MTb);
6085
0
      Bcopy(mhi, mlo);
6086
0
      mhi = lshift(mhi, Log2P MTb);
6087
0
      }
6088
6089
458k
    for(i = 1;;i++) {
6090
458k
      dig = quorem(b,S) + '0';
6091
      /* Do we yet have the shortest decimal string
6092
       * that will round to d?
6093
       */
6094
458k
      j = cmp(b, mlo);
6095
458k
      delta = diff(S, mhi MTb);
6096
458k
      j1 = delta->sign ? 1 : cmp(b, delta);
6097
458k
      Bfree(delta MTb);
6098
458k
#ifndef ROUND_BIASED
6099
458k
      if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
6100
#ifdef Honor_FLT_ROUNDS
6101
        && (mode <= 1 || Rounding >= 1)
6102
#endif
6103
458k
                   ) {
6104
247
        if (dig == '9')
6105
0
          goto round_9_up;
6106
247
        if (j > 0)
6107
247
          dig++;
6108
#ifdef SET_INEXACT
6109
        else if (!b->x[0] && b->wds <= 1)
6110
          inexact = 0;
6111
#endif
6112
247
        *s++ = dig;
6113
247
        goto ret;
6114
247
        }
6115
458k
#endif
6116
458k
      if (j < 0 || (j == 0 && mode != 1
6117
28.4k
#ifndef ROUND_BIASED
6118
28.4k
              && !(word1(&u) & 1)
6119
457k
#endif
6120
457k
          )) {
6121
2.31k
        if (!b->x[0] && b->wds <= 1) {
6122
#ifdef SET_INEXACT
6123
          inexact = 0;
6124
#endif
6125
205
          goto accept_dig;
6126
205
          }
6127
#ifdef Honor_FLT_ROUNDS
6128
        if (mode > 1)
6129
         switch(Rounding) {
6130
          case 0: goto accept_dig;
6131
          case 2: goto keep_dig;
6132
          }
6133
#endif /*Honor_FLT_ROUNDS*/
6134
2.10k
        if (j1 > 0) {
6135
1.46k
          b = lshift(b, 1 MTb);
6136
1.46k
          j1 = cmp(b, S);
6137
#ifdef ROUND_BIASED
6138
          if (j1 >= 0 /*)*/
6139
#else
6140
1.46k
          if ((j1 > 0 || (j1 == 0 && dig & 1))
6141
516
#endif
6142
516
          && dig++ == '9')
6143
0
            goto round_9_up;
6144
1.46k
          }
6145
2.31k
 accept_dig:
6146
2.31k
        *s++ = dig;
6147
2.31k
        goto ret;
6148
2.10k
        }
6149
456k
      if (j1 > 0) {
6150
#ifdef Honor_FLT_ROUNDS
6151
        if (!Rounding && mode > 1)
6152
          goto accept_dig;
6153
#endif
6154
26.6k
        if (dig == '9') { /* possible if i == 1 */
6155
0
 round_9_up:
6156
0
          *s++ = '9';
6157
0
          goto roundoff;
6158
0
          }
6159
26.6k
        *s++ = dig + 1;
6160
26.6k
        goto ret;
6161
26.6k
        }
6162
#ifdef Honor_FLT_ROUNDS
6163
 keep_dig:
6164
#endif
6165
429k
      *s++ = dig;
6166
429k
      if (i == ilim)
6167
0
        break;
6168
429k
      b = multadd(b, 10, 0 MTb);
6169
429k
      if (mlo == mhi)
6170
429k
        mlo = mhi = multadd(mhi, 10, 0 MTb);
6171
0
      else {
6172
0
        mlo = multadd(mlo, 10, 0 MTb);
6173
0
        mhi = multadd(mhi, 10, 0 MTb);
6174
0
        }
6175
429k
      }
6176
29.1k
    }
6177
8.44k
  else
6178
35.1k
    for(i = 1;; i++) {
6179
35.1k
      dig = quorem(b,S) + '0';
6180
35.1k
      *s++ = dig;
6181
35.1k
      if (!b->x[0] && b->wds <= 1) {
6182
#ifdef SET_INEXACT
6183
        inexact = 0;
6184
#endif
6185
6.06k
        goto ret;
6186
6.06k
        }
6187
29.0k
      if (i >= ilim)
6188
2.38k
        break;
6189
26.6k
      b = multadd(b, 10, 0 MTb);
6190
26.6k
      }
6191
6192
  /* Round off last digit */
6193
6194
#ifdef Honor_FLT_ROUNDS
6195
  if (mode > 1)
6196
    switch(Rounding) {
6197
      case 0: goto ret;
6198
      case 2: goto roundoff;
6199
      }
6200
#endif
6201
2.38k
  b = lshift(b, 1 MTb);
6202
2.38k
  j = cmp(b, S);
6203
#ifdef ROUND_BIASED
6204
  if (j >= 0)
6205
#else
6206
2.38k
  if (j > 0 || (j == 0 && dig & 1))
6207
625
#endif
6208
625
    {
6209
625
 roundoff:
6210
836
    while(*--s == '9')
6211
211
      if (s == buf) {
6212
0
        k++;
6213
0
        *s++ = '1';
6214
0
        goto ret;
6215
0
        }
6216
625
    ++*s++;
6217
625
    }
6218
37.6k
 ret:
6219
37.6k
  Bfree(S MTb);
6220
37.6k
  if (mhi) {
6221
29.1k
    if (mlo && mlo != mhi)
6222
0
      Bfree(mlo MTb);
6223
29.1k
    Bfree(mhi MTb);
6224
29.1k
    }
6225
1.71M
 retc:
6226
1.75M
  while(s > buf && s[-1] == '0')
6227
46.5k
    --s;
6228
1.89M
 ret1:
6229
1.89M
  if (b)
6230
37.6k
    Bfree(b MTb);
6231
1.89M
  *s = 0;
6232
1.89M
  *decpt = k + 1;
6233
1.89M
  if (rve)
6234
1.89M
    *rve = s;
6235
#ifdef SET_INEXACT
6236
  if (inexact) {
6237
    if (!oldinexact) {
6238
      word0(&u) = Exp_1 + (70 << Exp_shift);
6239
      word1(&u) = 0;
6240
      dval(&u) += 1.;
6241
      }
6242
    }
6243
  else if (!oldinexact)
6244
    clear_inexact();
6245
#endif
6246
1.89M
  return buf;
6247
1.71M
  }
6248
6249
 char *
6250
dtoa(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve)
6251
0
{
6252
  /*  Sufficient space is allocated to the return value
6253
    to hold the suppressed trailing zeros.
6254
    See dtoa_r() above for details on the other arguments.
6255
  */
6256
0
#ifndef MULTIPLE_THREADS
6257
0
  if (dtoa_result)
6258
0
    freedtoa(dtoa_result);
6259
0
#endif
6260
0
  return dtoa_r(dd, mode, ndigits, decpt, sign, rve, 0, 0);
6261
0
  }
6262
6263
#ifdef __cplusplus
6264
}
6265
#endif