Coverage Report

Created: 2025-10-10 06:16

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