Coverage Report

Created: 2025-07-07 10:01

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