Coverage Report

Created: 2026-09-01 07:05

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-2026  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
568M
#define __XS__a , DTOA
48
#define __XS__d , ThInfo* DTOA
49
50
0
#define FREE fxDTOAFree
51
#define INFNAN_CHECK
52
76.5M
#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
44.0M
#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
96.2k
#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
214M
#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
130M
#define word0(x) (x)->L[1]
1381
48.1M
#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
242M
#define dval(x) (x)->d
1387
#define LLval(x) (x)->LL
1388
1389
#ifndef STRTOD_DIGLIM
1390
2.47M
#define STRTOD_DIGLIM 40
1391
#endif
1392
1393
#ifdef DIGLIM_DEBUG
1394
extern int strtod_diglim;
1395
#else
1396
2.47M
#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
14.6M
#define Exp_shift  20
1419
23.8M
#define Exp_shift1 20
1420
21.8M
#define Exp_msk1    0x100000
1421
#define Exp_msk11   0x100000
1422
45.4M
#define Exp_mask  0x7ff00000
1423
39.1M
#define P 53
1424
#define Nbits 53
1425
28.6M
#define Bias 1023
1426
#define Emax 1023
1427
2.63M
#define Emin (-1022)
1428
1.24M
#define Exp_1  0x3ff00000
1429
11.9M
#define Exp_11 0x3ff00000
1430
3.14M
#define Ebits 11
1431
14.5M
#define Frac_mask  0xfffff
1432
11.9M
#define Frac_mask1 0xfffff
1433
11.8M
#define Ten_pmax 22
1434
412k
#define Bletch 0x10
1435
11.2M
#define Bndry_mask  0xfffff
1436
26.0k
#define Bndry_mask1 0xfffff
1437
#define LSB 1
1438
16.1M
#define Sign_bit 0x80000000
1439
1.82M
#define Log2P 1
1440
#define Tiny0 0
1441
552k
#define Tiny1 1
1442
12.4M
#define Quick_max 14
1443
10.2M
#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.8M
#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
14.4k
#define rounded_product(a,b) a *= b
1548
148k
#define rounded_quotient(a,b) a /= b
1549
#endif
1550
1551
14.0k
#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
1552
11.5k
#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.11G
#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
185M
#define MTa __XS__a
1571
280M
#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
369M
#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
408M
#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
399M
#define freelist TI0.Freelist
1658
8.61M
#define p5s TI0.P5s
1659
#endif
1660
1661
 static Bigint *
1662
Balloc(int k MTd)
1663
126M
{
1664
126M
  int x;
1665
126M
  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
126M
  if (k <= Kmax && (rv = freelist[k]))
1680
126M
    freelist[k] = rv->next;
1681
76.5M
  else {
1682
76.5M
    x = 1 << k;
1683
76.5M
#ifdef Omit_Private_Memory
1684
76.5M
    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
76.5M
    rv->k = k;
1700
76.5M
    rv->maxwds = x;
1701
76.5M
    }
1702
#ifdef MULTIPLE_THREADS
1703
  if (TI == &TI0)
1704
    FREE_DTOA_LOCK(0);
1705
#endif
1706
126M
  rv->sign = rv->wds = 0;
1707
126M
  return rv;
1708
126M
  }
1709
1710
 static void
1711
Bfree(Bigint *v MTd)
1712
111M
{
1713
#ifdef MULTIPLE_THREADS
1714
  ThInfo *TI;
1715
#endif
1716
111M
  if (v) {
1717
111M
    if (v->k > Kmax)
1718
0
      FREE((void*)v __XS__a);
1719
111M
    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
111M
      v->next = freelist[v->k];
1727
111M
      freelist[v->k] = v;
1728
#ifdef MULTIPLE_THREADS
1729
      if (TI == &TI0)
1730
        FREE_DTOA_LOCK(0);
1731
#endif
1732
111M
      }
1733
111M
    }
1734
111M
  }
1735
1736
3.26M
#define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
1737
3.26M
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
108M
{
1742
108M
  int i, wds;
1743
108M
#ifdef ULLong
1744
108M
  ULong *x;
1745
108M
  ULLong carry, y;
1746
#else
1747
  ULong carry, *x, y;
1748
#ifdef Pack_32
1749
  ULong xi, z;
1750
#endif
1751
#endif
1752
108M
  Bigint *b1;
1753
1754
108M
  wds = b->wds;
1755
108M
  x = b->x;
1756
108M
  i = 0;
1757
108M
  carry = a;
1758
435M
  do {
1759
435M
#ifdef ULLong
1760
435M
    y = *x * (ULLong)m + carry;
1761
435M
    carry = y >> 32;
1762
435M
    *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
435M
    }
1777
435M
    while(++i < wds);
1778
108M
  if (carry) {
1779
5.70M
    if (wds >= b->maxwds) {
1780
101k
      b1 = Balloc(b->k+1 MTa);
1781
101k
      Bcopy(b1, b);
1782
101k
      Bfree(b MTa);
1783
101k
      b = b1;
1784
101k
      }
1785
5.70M
    b->x[wds++] = (ULong)carry;
1786
5.70M
    b->wds = wds;
1787
5.70M
    }
1788
108M
  return b;
1789
108M
  }
1790
1791
 static Bigint *
1792
s2b(const char *s, int nd0, int nd, ULong y9, int dplen MTd)
1793
2.47M
{
1794
2.47M
  Bigint *b;
1795
2.47M
  int i, k;
1796
2.47M
  Long x, y;
1797
1798
2.47M
  x = (nd + 8) / 9;
1799
5.24M
  for(k = 0, y = 1; x > y; y <<= 1, k++) ;
1800
2.47M
#ifdef Pack_32
1801
2.47M
  b = Balloc(k MTa);
1802
2.47M
  b->x[0] = y9;
1803
2.47M
  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
2.47M
  i = 9;
1811
2.47M
  if (9 < nd0) {
1812
962k
    s += 9;
1813
6.41M
    do b = multadd(b, 10, *s++ - '0' MTa);
1814
6.41M
      while(++i < nd0);
1815
962k
    s += dplen;
1816
962k
    }
1817
1.51M
  else
1818
1.51M
    s += dplen + 9;
1819
15.3M
  for(; i < nd; i++)
1820
12.8M
    b = multadd(b, 10, *s++ - '0' MTa);
1821
2.47M
  return b;
1822
2.47M
  }
1823
1824
 static int
1825
hi0bits(ULong x)
1826
4.02M
{
1827
4.02M
  int k = 0;
1828
1829
4.02M
  if (!(x & 0xffff0000)) {
1830
2.59M
    k = 16;
1831
2.59M
    x <<= 16;
1832
2.59M
    }
1833
4.02M
  if (!(x & 0xff000000)) {
1834
2.41M
    k += 8;
1835
2.41M
    x <<= 8;
1836
2.41M
    }
1837
4.02M
  if (!(x & 0xf0000000)) {
1838
2.28M
    k += 4;
1839
2.28M
    x <<= 4;
1840
2.28M
    }
1841
4.02M
  if (!(x & 0xc0000000)) {
1842
2.33M
    k += 2;
1843
2.33M
    x <<= 2;
1844
2.33M
    }
1845
4.02M
  if (!(x & 0x80000000)) {
1846
2.14M
    k++;
1847
2.14M
    if (!(x & 0x40000000))
1848
0
      return 32;
1849
2.14M
    }
1850
4.02M
  return k;
1851
4.02M
  }
1852
1853
 static int
1854
lo0bits(ULong *y)
1855
14.5M
{
1856
14.5M
  int k;
1857
14.5M
  ULong x = *y;
1858
1859
14.5M
  if (x & 7) {
1860
4.17M
    if (x & 1)
1861
2.24M
      return 0;
1862
1.93M
    if (x & 2) {
1863
1.25M
      *y = x >> 1;
1864
1.25M
      return 1;
1865
1.25M
      }
1866
683k
    *y = x >> 2;
1867
683k
    return 2;
1868
1.93M
    }
1869
10.3M
  k = 0;
1870
10.3M
  if (!(x & 0xffff)) {
1871
5.29M
    k = 16;
1872
5.29M
    x >>= 16;
1873
5.29M
    }
1874
10.3M
  if (!(x & 0xff)) {
1875
4.21M
    k += 8;
1876
4.21M
    x >>= 8;
1877
4.21M
    }
1878
10.3M
  if (!(x & 0xf)) {
1879
6.03M
    k += 4;
1880
6.03M
    x >>= 4;
1881
6.03M
    }
1882
10.3M
  if (!(x & 0x3)) {
1883
4.42M
    k += 2;
1884
4.42M
    x >>= 2;
1885
4.42M
    }
1886
10.3M
  if (!(x & 1)) {
1887
4.54M
    k++;
1888
4.54M
    x >>= 1;
1889
4.54M
    if (!x)
1890
0
      return 32;
1891
4.54M
    }
1892
10.3M
  *y = x;
1893
10.3M
  return k;
1894
10.3M
  }
1895
1896
 static Bigint *
1897
i2b(int i MTd)
1898
12.4M
{
1899
12.4M
  Bigint *b;
1900
1901
12.4M
  b = Balloc(1 MTa);
1902
12.4M
  b->x[0] = i;
1903
12.4M
  b->wds = 1;
1904
12.4M
  return b;
1905
12.4M
  }
1906
1907
 static Bigint *
1908
mult(Bigint *a, Bigint *b MTd)
1909
20.4M
{
1910
20.4M
  Bigint *c;
1911
20.4M
  int k, wa, wb, wc;
1912
20.4M
  ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
1913
20.4M
  ULong y;
1914
20.4M
#ifdef ULLong
1915
20.4M
  ULLong carry, z;
1916
#else
1917
  ULong carry, z;
1918
#ifdef Pack_32
1919
  ULong z2;
1920
#endif
1921
#endif
1922
1923
20.4M
  if (a->wds < b->wds) {
1924
4.07M
    c = a;
1925
4.07M
    a = b;
1926
4.07M
    b = c;
1927
4.07M
    }
1928
20.4M
  k = a->k;
1929
20.4M
  wa = a->wds;
1930
20.4M
  wb = b->wds;
1931
20.4M
  wc = wa + wb;
1932
20.4M
  if (wc > a->maxwds)
1933
8.14M
    k++;
1934
20.4M
  c = Balloc(k MTa);
1935
108M
  for(x = c->x, xa = x + wc; x < xa; x++)
1936
88.1M
    *x = 0;
1937
20.4M
  xa = a->x;
1938
20.4M
  xae = xa + wa;
1939
20.4M
  xb = b->x;
1940
20.4M
  xbe = xb + wb;
1941
20.4M
  xc0 = c->x;
1942
20.4M
#ifdef ULLong
1943
55.6M
  for(; xb < xbe; xc0++) {
1944
35.1M
    if ((y = *xb++)) {
1945
35.1M
      x = xa;
1946
35.1M
      xc = xc0;
1947
35.1M
      carry = 0;
1948
137M
      do {
1949
137M
        z = *x++ * (ULLong)y + *xc + carry;
1950
137M
        carry = z >> 32;
1951
137M
        *xc++ = z & FFFFFFFF;
1952
137M
        }
1953
137M
        while(x < xae);
1954
35.1M
      *xc = (ULong)carry;
1955
35.1M
      }
1956
35.1M
    }
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
34.7M
  for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
2008
20.4M
  c->wds = wc;
2009
20.4M
  return c;
2010
20.4M
  }
2011
2012
 static Bigint *
2013
pow5mult(Bigint *b, int k MTd)
2014
4.63M
{
2015
4.63M
  Bigint *b1, *p5, *p51;
2016
#ifdef MULTIPLE_THREADS
2017
  ThInfo *TI;
2018
#endif
2019
4.63M
  int i;
2020
4.63M
  static int p05[3] = { 5, 25, 125 };
2021
2022
4.63M
  if ((i = k & 3))
2023
3.43M
    b = multadd(b, p05[i-1], 0 MTa);
2024
2025
4.63M
  if (!(k >>= 2))
2026
296k
    return b;
2027
#ifdef  MULTIPLE_THREADS
2028
  if (!(TI = *PTI))
2029
    *PTI = TI = get_TI();
2030
#endif
2031
4.34M
  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
4.27M
    p5 = p5s = i2b(625 MTa);
2046
4.27M
    p5->next = 0;
2047
4.27M
#endif
2048
4.27M
    }
2049
15.1M
  for(;;) {
2050
15.1M
    if (k & 1) {
2051
8.59M
      b1 = mult(b, p5 MTa);
2052
8.59M
      Bfree(b MTa);
2053
8.59M
      b = b1;
2054
8.59M
      }
2055
15.1M
    if (!(k >>= 1))
2056
4.34M
      break;
2057
10.8M
    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
10.5M
      p51 = p5->next = mult(p5,p5 __XS__a);
2071
10.5M
      p51->next = 0;
2072
10.5M
#endif
2073
10.5M
      }
2074
10.8M
    p5 = p51;
2075
10.8M
    }
2076
4.34M
  return b;
2077
4.63M
  }
2078
2079
 static Bigint *
2080
lshift(Bigint *b, int k MTd)
2081
15.0M
{
2082
15.0M
  int i, k1, n, n1;
2083
15.0M
  Bigint *b1;
2084
15.0M
  ULong *x, *x1, *xe, z;
2085
2086
15.0M
#ifdef Pack_32
2087
15.0M
  n = k >> 5;
2088
#else
2089
  n = k >> 4;
2090
#endif
2091
15.0M
  k1 = b->k;
2092
15.0M
  n1 = n + b->wds + 1;
2093
28.7M
  for(i = b->maxwds; n1 > i; i <<= 1)
2094
13.6M
    k1++;
2095
15.0M
  b1 = Balloc(k1 MTa);
2096
15.0M
  x1 = b1->x;
2097
43.3M
  for(i = 0; i < n; i++)
2098
28.2M
    *x1++ = 0;
2099
15.0M
  x = b->x;
2100
15.0M
  xe = x + b->wds;
2101
15.0M
#ifdef Pack_32
2102
15.0M
  if (k &= 0x1f) {
2103
14.9M
    k1 = 32 - k;
2104
14.9M
    z = 0;
2105
42.7M
    do {
2106
42.7M
      *x1++ = *x << k | z;
2107
42.7M
      z = *x++ >> k1;
2108
42.7M
      }
2109
42.7M
      while(x < xe);
2110
14.9M
    if ((*x1 = z))
2111
1.69M
      ++n1;
2112
14.9M
    }
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
97.6k
  else do
2127
270k
    *x1++ = *x++;
2128
270k
    while(x < xe);
2129
15.0M
  b1->wds = n1 - 1;
2130
15.0M
  Bfree(b MTa);
2131
15.0M
  return b1;
2132
15.0M
  }
2133
2134
 static int
2135
cmp(Bigint *a, Bigint *b)
2136
171M
{
2137
171M
  ULong *xa, *xa0, *xb, *xb0;
2138
171M
  int i, j;
2139
2140
171M
  i = a->wds;
2141
171M
  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
171M
  if (i -= j)
2149
40.5M
    return i;
2150
130M
  xa0 = a->x;
2151
130M
  xa = xa0 + j;
2152
130M
  xb0 = b->x;
2153
130M
  xb = xb0 + j;
2154
135M
  for(;;) {
2155
135M
    if (*--xa != *--xb)
2156
129M
      return *xa < *xb ? -1 : 1;
2157
5.78M
    if (xa <= xa0)
2158
1.02M
      break;
2159
5.78M
    }
2160
1.02M
  return 0;
2161
130M
  }
2162
2163
 static Bigint *
2164
diff(Bigint *a, Bigint *b MTd)
2165
43.6M
{
2166
43.6M
  Bigint *c;
2167
43.6M
  int i, wa, wb;
2168
43.6M
  ULong *xa, *xae, *xb, *xbe, *xc;
2169
43.6M
#ifdef ULLong
2170
43.6M
  ULLong borrow, y;
2171
#else
2172
  ULong borrow, y;
2173
#ifdef Pack_32
2174
  ULong z;
2175
#endif
2176
#endif
2177
2178
43.6M
  i = cmp(a,b);
2179
43.6M
  if (!i) {
2180
430k
    c = Balloc(0 MTa);
2181
430k
    c->wds = 1;
2182
430k
    c->x[0] = 0;
2183
430k
    return c;
2184
430k
    }
2185
43.2M
  if (i < 0) {
2186
1.85M
    c = a;
2187
1.85M
    a = b;
2188
1.85M
    b = c;
2189
1.85M
    i = 1;
2190
1.85M
    }
2191
41.3M
  else
2192
41.3M
    i = 0;
2193
43.2M
  c = Balloc(a->k MTa);
2194
43.2M
  c->sign = i;
2195
43.2M
  wa = a->wds;
2196
43.2M
  xa = a->x;
2197
43.2M
  xae = xa + wa;
2198
43.2M
  wb = b->wds;
2199
43.2M
  xb = b->x;
2200
43.2M
  xbe = xb + wb;
2201
43.2M
  xc = c->x;
2202
43.2M
  borrow = 0;
2203
43.2M
#ifdef ULLong
2204
183M
  do {
2205
183M
    y = (ULLong)*xa++ - *xb++ - borrow;
2206
183M
    borrow = y >> 32 & (ULong)1;
2207
183M
    *xc++ = y & FFFFFFFF;
2208
183M
    }
2209
183M
    while(xb < xbe);
2210
63.0M
  while(xa < xae) {
2211
19.8M
    y = *xa++ - borrow;
2212
19.8M
    borrow = y >> 32 & (ULong)1;
2213
19.8M
    *xc++ = y & FFFFFFFF;
2214
19.8M
    }
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
46.8M
  while(!*--xc)
2247
3.67M
    wa--;
2248
43.2M
  c->wds = wa;
2249
43.2M
  return c;
2250
43.6M
  }
2251
2252
 static double
2253
ulp(U *x)
2254
618k
{
2255
618k
  Long L;
2256
618k
  U u;
2257
2258
618k
  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
618k
    word0(&u) = L;
2268
618k
    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
618k
  return dval(&u);
2287
618k
  }
2288
2289
 static double
2290
b2d(Bigint *a, int *e)
2291
1.19M
{
2292
1.19M
  ULong *xa, *xa0, w, y, z;
2293
1.19M
  int k;
2294
1.19M
  U d;
2295
#ifdef VAX
2296
  ULong d0, d1;
2297
#else
2298
1.19M
#define d0 word0(&d)
2299
1.19M
#define d1 word1(&d)
2300
1.19M
#endif
2301
2302
1.19M
  xa0 = a->x;
2303
1.19M
  xa = xa0 + a->wds;
2304
1.19M
  y = *--xa;
2305
#ifdef DEBUG
2306
  if (!y) Bug("zero y in b2d");
2307
#endif
2308
1.19M
  k = hi0bits(y);
2309
1.19M
  *e = 32 - k;
2310
1.19M
#ifdef Pack_32
2311
1.19M
  if (k < Ebits) {
2312
378k
    d0 = Exp_1 | y >> (Ebits - k);
2313
378k
    w = xa > xa0 ? *--xa : 0;
2314
378k
    d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
2315
378k
    goto ret_d;
2316
378k
    }
2317
817k
  z = xa > xa0 ? *--xa : 0;
2318
817k
  if (k -= Ebits) {
2319
775k
    d0 = Exp_1 | y << k | z >> (32 - k);
2320
775k
    y = xa > xa0 ? *--xa : 0;
2321
775k
    d1 = z << k | y >> (32 - k);
2322
775k
    }
2323
41.9k
  else {
2324
41.9k
    d0 = Exp_1 | y;
2325
41.9k
    d1 = z;
2326
41.9k
    }
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.19M
 ret_d:
2344
#ifdef VAX
2345
  word0(&d) = d0 >> 16 | d0 << 16;
2346
  word1(&d) = d1 >> 16 | d1 << 16;
2347
#else
2348
1.19M
#undef d0
2349
1.19M
#undef d1
2350
1.19M
#endif
2351
1.19M
  return dval(&d);
2352
817k
  }
2353
2354
 static Bigint *
2355
d2b(U *d, int *e, int *bits MTd)
2356
14.5M
{
2357
14.5M
  Bigint *b;
2358
14.5M
  int de, k;
2359
14.5M
  ULong *x, y, z;
2360
14.5M
#ifndef Sudden_Underflow
2361
14.5M
  int i;
2362
14.5M
#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
43.6M
#define d0 word0(d)
2369
14.5M
#define d1 word1(d)
2370
14.5M
#endif
2371
2372
14.5M
#ifdef Pack_32
2373
14.5M
  b = Balloc(1 MTa);
2374
#else
2375
  b = Balloc(2 MTa);
2376
#endif
2377
14.5M
  x = b->x;
2378
2379
14.5M
  z = d0 & Frac_mask;
2380
14.5M
  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
14.5M
  if ((de = (int)(d0 >> Exp_shift)))
2388
14.5M
    z |= Exp_msk1;
2389
14.5M
#endif
2390
14.5M
#ifdef Pack_32
2391
14.5M
  if ((y = d1)) {
2392
4.95M
    if ((k = lo0bits(&y))) {
2393
2.74M
      x[0] = y | z << (32 - k);
2394
2.74M
      z >>= k;
2395
2.74M
      }
2396
2.21M
    else
2397
2.21M
      x[0] = y;
2398
4.95M
#ifndef Sudden_Underflow
2399
4.95M
    i =
2400
4.95M
#endif
2401
4.95M
        b->wds = (x[1] = z) ? 2 : 1;
2402
4.95M
    }
2403
9.60M
  else {
2404
9.60M
    k = lo0bits(&z);
2405
9.60M
    x[0] = z;
2406
9.60M
#ifndef Sudden_Underflow
2407
9.60M
    i =
2408
9.60M
#endif
2409
9.60M
        b->wds = 1;
2410
9.60M
    k += 32;
2411
9.60M
    }
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
14.5M
#ifndef Sudden_Underflow
2458
14.5M
  if (de) {
2459
14.5M
#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
14.5M
    *e = de - Bias - (P-1) + k;
2465
14.5M
    *bits = P - k;
2466
14.5M
#endif
2467
14.5M
#ifndef Sudden_Underflow
2468
14.5M
    }
2469
8.22k
  else {
2470
8.22k
    *e = de - Bias - (P-1) + 1 + k;
2471
8.22k
#ifdef Pack_32
2472
8.22k
    *bits = 32*i - hi0bits(x[i-1]);
2473
#else
2474
    *bits = (i+2)*16 - hi0bits(x[i]);
2475
#endif
2476
8.22k
    }
2477
14.5M
#endif
2478
14.5M
  return b;
2479
14.5M
  }
2480
#undef d0
2481
#undef d1
2482
2483
 static double
2484
ratio(Bigint *a, Bigint *b)
2485
597k
{
2486
597k
  U da, db;
2487
597k
  int k, ka, kb;
2488
2489
597k
  dval(&da) = b2d(a, &ka);
2490
597k
  dval(&db) = b2d(b, &kb);
2491
597k
#ifdef Pack_32
2492
597k
  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
597k
  if (k > 0)
2510
271k
    word0(&da) += k*Exp_msk1;
2511
325k
  else {
2512
325k
    k = -k;
2513
325k
    word0(&db) += k*Exp_msk1;
2514
325k
    }
2515
597k
#endif
2516
597k
  return dval(&da) / dval(&db);
2517
597k
  }
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
299k
#define Scale_Bit 0x10
2543
418k
#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
199k
#define NAN_WORD0 0x7ff80000
2616
#endif
2617
2618
#ifndef NAN_WORD1
2619
199k
#define NAN_WORD1 0
2620
#endif
2621
2622
 static int
2623
match(const char **sp, const char *t)
2624
328k
{
2625
328k
  int c, d;
2626
328k
  const char *s = *sp;
2627
2628
1.56M
  while((d = *t++)) {
2629
#ifndef __XS__
2630
    if ((c = *++s) >= 'A' && c <= 'Z')
2631
      c += 'a' - 'A';
2632
#else
2633
1.24M
        c = *++s;
2634
1.24M
#endif
2635
1.24M
    if (c != d)
2636
9.22k
      return 0;
2637
1.24M
    }
2638
319k
  *sp = s + 1;
2639
319k
  return 1;
2640
328k
  }
2641
2642
#ifndef No_Hex_NaN
2643
 static void
2644
hexnan(U *rvp, const char **sp)
2645
4.72k
{
2646
4.72k
  ULong c, x[2];
2647
4.72k
  const char *s;
2648
4.72k
  int c1, havedig, udx0, xshift;
2649
2650
  /**** if (!hexdig['0']) hexdig_init(); ****/
2651
4.72k
  x[0] = x[1] = 0;
2652
4.72k
  havedig = xshift = 0;
2653
4.72k
  udx0 = 1;
2654
4.72k
  s = *sp;
2655
  /* allow optional initial 0x or 0X */
2656
5.16k
  while((c = *(const unsigned char*)(s+1)) && c <= ' ')
2657
433
    ++s;
2658
4.72k
  if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))
2659
1.12k
    s += 2;
2660
16.2k
  while((c = *(const unsigned char*)++s)) {
2661
14.0k
    if ((c1 = hexdig[c]))
2662
9.33k
      c  = c1 & 0xf;
2663
4.74k
    else if (c <= ' ') {
2664
2.20k
      if (udx0 && havedig) {
2665
1.06k
        udx0 = 0;
2666
1.06k
        xshift = 1;
2667
1.06k
        }
2668
2.20k
      continue;
2669
2.20k
      }
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.53k
    else {
2679
185k
      do {
2680
185k
        if (/*(*/ c == ')') {
2681
299
          *sp = s + 1;
2682
299
          break;
2683
299
          }
2684
185k
        } while((c = *++s));
2685
2.53k
      break;
2686
2.53k
      }
2687
9.33k
#endif
2688
9.33k
    havedig = 1;
2689
9.33k
    if (xshift) {
2690
655
      xshift = 0;
2691
655
      x[0] = x[1];
2692
655
      x[1] = 0;
2693
655
      }
2694
9.33k
    if (udx0)
2695
7.26k
      x[0] = (x[0] << 4) | (x[1] >> 28);
2696
9.33k
    x[1] = (x[1] << 4) | c;
2697
9.33k
    }
2698
4.72k
  if ((x[0] &= 0xfffff) || x[1]) {
2699
2.26k
    word0(rvp) = Exp_mask | x[0];
2700
2.26k
    word1(rvp) = x[1];
2701
2.26k
    }
2702
4.72k
  }
2703
#endif /*No_Hex_NaN*/
2704
#endif /* INFNAN_CHECK */
2705
2706
#ifdef Pack_32
2707
#define ULbits 32
2708
#define kshift 5
2709
2.82M
#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
      mxFallThrough;
2918
      case '+':
2919
      s++;
2920
      }
2921
    if ((n = hexdig[*s]) == 0 || n > 0x19) {
2922
      s = s1;
2923
      break;
2924
      }
2925
    e1 = n - 0x10;
2926
    while((n = hexdig[*++s]) !=0 && n <= 0x19) {
2927
      if (e1 & 0xf8000000)
2928
        big = 1;
2929
      e1 = 10*e1 + n - 0x10;
2930
      }
2931
    if (esign)
2932
      e1 = -e1;
2933
    e += e1;
2934
    }
2935
  *sp = (char*)s;
2936
  if (!havedig)
2937
    *sp = (char*)s0 - 1;
2938
  if (zret)
2939
    goto retz1;
2940
  if (big) {
2941
    if (esign) {
2942
#ifdef IEEE_Arith
2943
      switch(rounding) {
2944
        case Round_up:
2945
        if (sign)
2946
          break;
2947
        goto ret_tiny;
2948
        case Round_down:
2949
        if (!sign)
2950
          break;
2951
        goto ret_tiny;
2952
        }
2953
#endif
2954
      goto retz;
2955
#ifdef IEEE_Arith
2956
 ret_tinyf:
2957
      Bfree(b MTa);
2958
 ret_tiny:
2959
      Set_errno(ERANGE);
2960
      word0(rvp) = 0;
2961
      word1(rvp) = 1;
2962
      return;
2963
#endif /* IEEE_Arith */
2964
      }
2965
    switch(rounding) {
2966
      case Round_near:
2967
      goto ovfl1;
2968
      case Round_up:
2969
      if (!sign)
2970
        goto ovfl1;
2971
      goto ret_big;
2972
      case Round_down:
2973
      if (sign)
2974
        goto ovfl1;
2975
      goto ret_big;
2976
      }
2977
 ret_big:
2978
    word0(rvp) = Big0;
2979
    word1(rvp) = Big1;
2980
    return;
2981
    }
2982
  n = s1 - s0 - 1;
2983
  for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1)
2984
    k++;
2985
  b = Balloc(k MTa);
2986
  x = b->x;
2987
  n = 0;
2988
  L = 0;
2989
#ifdef USE_LOCALE
2990
  for(i = 0; decimalpoint[i+1]; ++i);
2991
#endif
2992
  while(s1 > s0) {
2993
#ifdef USE_LOCALE
2994
    if (*--s1 == decimalpoint[i]) {
2995
      s1 -= i;
2996
      continue;
2997
      }
2998
#else
2999
    if (*--s1 == '.')
3000
      continue;
3001
#endif
3002
    if (n == ULbits) {
3003
      *x++ = L;
3004
      L = 0;
3005
      n = 0;
3006
      }
3007
    L |= (hexdig[*s1] & 0x0f) << n;
3008
    n += 4;
3009
    }
3010
  *x++ = L;
3011
  b->wds = n = x - b->x;
3012
  n = ULbits*n - hi0bits(L);
3013
  nbits = Nbits;
3014
  lostbits = 0;
3015
  x = b->x;
3016
  if (n > nbits) {
3017
    n -= nbits;
3018
    if (any_on(b,n)) {
3019
      lostbits = 1;
3020
      k = n - 1;
3021
      if (x[k>>kshift] & 1 << (k & kmask)) {
3022
        lostbits = 2;
3023
        if (k > 0 && any_on(b,k))
3024
          lostbits = 3;
3025
        }
3026
      }
3027
    rshift(b, n);
3028
    e += n;
3029
    }
3030
  else if (n < nbits) {
3031
    n = nbits - n;
3032
    b = lshift(b, n MTa);
3033
    e -= n;
3034
    x = b->x;
3035
    }
3036
  if (e > emax) {
3037
 ovfl:
3038
    Bfree(b MTa);
3039
 ovfl1:
3040
    Set_errno(ERANGE);
3041
#ifdef Honor_FLT_ROUNDS
3042
    switch (rounding) {
3043
      case Round_zero:
3044
      goto ret_big;
3045
      case Round_down:
3046
      if (!sign)
3047
        goto ret_big;
3048
      break;
3049
      case Round_up:
3050
      if (sign)
3051
        goto ret_big;
3052
      }
3053
#endif
3054
    word0(rvp) = Exp_mask;
3055
    word1(rvp) = 0;
3056
    return;
3057
    }
3058
  denorm = 0;
3059
  if (e < emin) {
3060
    denorm = 1;
3061
    n = emin - e;
3062
    if (n >= nbits) {
3063
#ifdef IEEE_Arith /*{*/
3064
      switch (rounding) {
3065
        case Round_near:
3066
        if (n == nbits && (n < 2 || lostbits || any_on(b,n-1)))
3067
          goto ret_tinyf;
3068
        break;
3069
        case Round_up:
3070
        if (!sign)
3071
          goto ret_tinyf;
3072
        break;
3073
        case Round_down:
3074
        if (sign)
3075
          goto ret_tinyf;
3076
        }
3077
#endif /* } IEEE_Arith */
3078
      Bfree(b MTa);
3079
 retz:
3080
      Set_errno(ERANGE);
3081
 retz1:
3082
      rvp->d = 0.;
3083
      return;
3084
      }
3085
    k = n - 1;
3086
    if (lostbits)
3087
      lostbits = 1;
3088
    else if (k > 0)
3089
      lostbits = any_on(b,k);
3090
    if (x[k>>kshift] & 1 << (k & kmask))
3091
      lostbits |= 2;
3092
    nbits -= n;
3093
    rshift(b,n);
3094
    e = emin;
3095
    }
3096
  if (lostbits) {
3097
    up = 0;
3098
    switch(rounding) {
3099
      case Round_zero:
3100
      break;
3101
      case Round_near:
3102
      if (lostbits & 2
3103
       && (lostbits & 1) | (x[0] & 1))
3104
        up = 1;
3105
      break;
3106
      case Round_up:
3107
      up = 1 - sign;
3108
      break;
3109
      case Round_down:
3110
      up = sign;
3111
      }
3112
    if (up) {
3113
      k = b->wds;
3114
      b = increment(b MTa);
3115
      x = b->x;
3116
      if (denorm) {
3117
#if 0
3118
        if (nbits == Nbits - 1
3119
         && x[nbits >> kshift] & 1 << (nbits & kmask))
3120
          denorm = 0; /* not currently used */
3121
#endif
3122
        }
3123
      else if (b->wds > k
3124
       || ((n = nbits & kmask) !=0
3125
           && hi0bits(x[k-1]) < 32-n)) {
3126
        rshift(b,1);
3127
        if (++e > Emax)
3128
          goto ovfl;
3129
        }
3130
      }
3131
    }
3132
#ifdef IEEE_Arith
3133
  if (denorm)
3134
    word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0;
3135
  else
3136
    word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20);
3137
  word1(rvp) = b->x[0];
3138
#endif
3139
#ifdef IBM
3140
  if ((j = e & 3)) {
3141
    k = b->x[0] & ((1 << j) - 1);
3142
    rshift(b,j);
3143
    if (k) {
3144
      switch(rounding) {
3145
        case Round_up:
3146
        if (!sign)
3147
          increment(b);
3148
        break;
3149
        case Round_down:
3150
        if (sign)
3151
          increment(b);
3152
        break;
3153
        case Round_near:
3154
        j = 1 << (j-1);
3155
        if (k & j && ((k & (j-1)) | lostbits))
3156
          increment(b);
3157
        }
3158
      }
3159
    }
3160
  e >>= 2;
3161
  word0(rvp) = b->x[1] | ((e + 65 + 13) << 24);
3162
  word1(rvp) = b->x[0];
3163
#endif
3164
#ifdef VAX
3165
  /* The next two lines ignore swap of low- and high-order 2 bytes. */
3166
  /* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */
3167
  /* word1(rvp) = b->x[0]; */
3168
  word0(rvp) = ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16);
3169
  word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16);
3170
#endif
3171
  Bfree(b MTa);
3172
  }
3173
#endif /*!NO_HEX_FP}*/
3174
3175
 static int
3176
dshift(Bigint *b, int p2)
3177
2.82M
{
3178
2.82M
  int rv = hi0bits(b->x[b->wds-1]) - 4;
3179
2.82M
  if (p2 > 0)
3180
2.21M
    rv -= p2;
3181
2.82M
  return rv & kmask;
3182
2.82M
  }
3183
3184
 static int
3185
quorem(Bigint *b, Bigint *S)
3186
41.7M
{
3187
41.7M
  int n;
3188
41.7M
  ULong *bx, *bxe, q, *sx, *sxe;
3189
41.7M
#ifdef ULLong
3190
41.7M
  ULLong borrow, carry, y, ys;
3191
#else
3192
  ULong borrow, carry, y, ys;
3193
#ifdef Pack_32
3194
  ULong si, z, zs;
3195
#endif
3196
#endif
3197
3198
41.7M
  n = S->wds;
3199
#ifdef DEBUG
3200
  /*debug*/ if (b->wds > n)
3201
  /*debug*/ Bug("oversize b in quorem");
3202
#endif
3203
41.7M
  if (b->wds < n)
3204
135k
    return 0;
3205
41.5M
  sx = S->x;
3206
41.5M
  sxe = sx + --n;
3207
41.5M
  bx = b->x;
3208
41.5M
  bxe = bx + n;
3209
41.5M
  q = *bxe / (*sxe + 1);  /* ensure q <= true quotient */
3210
#ifdef DEBUG
3211
#ifdef NO_STRTOD_BIGCOMP
3212
  /*debug*/ if (q > 9)
3213
#else
3214
  /* An oversized q is possible when quorem is called from bigcomp and */
3215
  /* the input is near, e.g., twice the smallest denormalized number. */
3216
  /*debug*/ if (q > 15)
3217
#endif
3218
  /*debug*/ Bug("oversized quotient in quorem");
3219
#endif
3220
41.5M
  if (q) {
3221
34.9M
    borrow = 0;
3222
34.9M
    carry = 0;
3223
166M
    do {
3224
166M
#ifdef ULLong
3225
166M
      ys = *sx++ * (ULLong)q + carry;
3226
166M
      carry = ys >> 32;
3227
166M
      y = *bx - (ys & FFFFFFFF) - borrow;
3228
166M
      borrow = y >> 32 & (ULong)1;
3229
166M
      *bx++ = y & FFFFFFFF;
3230
#else
3231
#ifdef Pack_32
3232
      si = *sx++;
3233
      ys = (si & 0xffff) * q + carry;
3234
      zs = (si >> 16) * q + (ys >> 16);
3235
      carry = zs >> 16;
3236
      y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
3237
      borrow = (y & 0x10000) >> 16;
3238
      z = (*bx >> 16) - (zs & 0xffff) - borrow;
3239
      borrow = (z & 0x10000) >> 16;
3240
      Storeinc(bx, z, y);
3241
#else
3242
      ys = *sx++ * q + carry;
3243
      carry = ys >> 16;
3244
      y = *bx - (ys & 0xffff) - borrow;
3245
      borrow = (y & 0x10000) >> 16;
3246
      *bx++ = y & 0xffff;
3247
#endif
3248
#endif
3249
166M
      }
3250
166M
      while(sx <= sxe);
3251
34.9M
    if (!*bxe) {
3252
2.74k
      bx = b->x;
3253
2.74k
      while(--bxe > bx && !*bxe)
3254
0
        --n;
3255
2.74k
      b->wds = n;
3256
2.74k
      }
3257
34.9M
    }
3258
41.5M
  if (cmp(b, S) >= 0) {
3259
614k
    q++;
3260
614k
    borrow = 0;
3261
614k
    carry = 0;
3262
614k
    bx = b->x;
3263
614k
    sx = S->x;
3264
1.92M
    do {
3265
1.92M
#ifdef ULLong
3266
1.92M
      ys = *sx++ + carry;
3267
1.92M
      carry = ys >> 32;
3268
1.92M
      y = *bx - (ys & FFFFFFFF) - borrow;
3269
1.92M
      borrow = y >> 32 & (ULong)1;
3270
1.92M
      *bx++ = y & FFFFFFFF;
3271
#else
3272
#ifdef Pack_32
3273
      si = *sx++;
3274
      ys = (si & 0xffff) + carry;
3275
      zs = (si >> 16) + (ys >> 16);
3276
      carry = zs >> 16;
3277
      y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
3278
      borrow = (y & 0x10000) >> 16;
3279
      z = (*bx >> 16) - (zs & 0xffff) - borrow;
3280
      borrow = (z & 0x10000) >> 16;
3281
      Storeinc(bx, z, y);
3282
#else
3283
      ys = *sx++ + carry;
3284
      carry = ys >> 16;
3285
      y = *bx - (ys & 0xffff) - borrow;
3286
      borrow = (y & 0x10000) >> 16;
3287
      *bx++ = y & 0xffff;
3288
#endif
3289
#endif
3290
1.92M
      }
3291
1.92M
      while(sx <= sxe);
3292
614k
    bx = b->x;
3293
614k
    bxe = bx + n;
3294
614k
    if (!*bxe) {
3295
613k
      while(--bxe > bx && !*bxe)
3296
10.4k
        --n;
3297
602k
      b->wds = n;
3298
602k
      }
3299
614k
    }
3300
41.5M
  return q;
3301
41.7M
  }
3302
3303
#if defined(Avoid_Underflow) || !defined(NO_STRTOD_BIGCOMP) /*{*/
3304
 static double
3305
sulp(U *x, BCinfo *bc)
3306
20.9k
{
3307
20.9k
  U u;
3308
20.9k
  double rv;
3309
20.9k
  int i;
3310
3311
20.9k
  rv = ulp(x);
3312
20.9k
  if (!bc->scale || (i = 2*P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0)
3313
20.7k
    return rv; /* Is there an example where i <= 0 ? */
3314
250
  word0(&u) = Exp_1 + (i << Exp_shift);
3315
250
  word1(&u) = 0;
3316
250
  return rv * u.d;
3317
20.9k
  }
3318
#endif /*}*/
3319
3320
#ifndef NO_STRTOD_BIGCOMP
3321
 static void
3322
bigcomp(U *rv, const char *s0, BCinfo *bc MTd)
3323
25.9k
{
3324
25.9k
  Bigint *b, *d;
3325
25.9k
  int b2, bbits, d2, dd = 0, dig, dsign, i, j, nd, nd0, p2, p5, speccase;
3326
3327
25.9k
  dsign = bc->dsign;
3328
25.9k
  nd = bc->nd;
3329
25.9k
  nd0 = bc->nd0;
3330
25.9k
  p5 = nd + bc->e0 - 1;
3331
25.9k
  speccase = 0;
3332
25.9k
#ifndef Sudden_Underflow
3333
25.9k
  if (rv->d == 0.) { /* special case: value near underflow-to-zero */
3334
        /* threshold was rounded to zero */
3335
1.23k
    b = i2b(1 MTa);
3336
1.23k
    p2 = Emin - P + 1;
3337
1.23k
    bbits = 1;
3338
1.23k
#ifdef Avoid_Underflow
3339
1.23k
    word0(rv) = (P+2) << Exp_shift;
3340
#else
3341
    word1(rv) = 1;
3342
#endif
3343
1.23k
    i = 0;
3344
#ifdef Honor_FLT_ROUNDS
3345
    if (bc->rounding == 1)
3346
#endif
3347
1.23k
      {
3348
1.23k
      speccase = 1;
3349
1.23k
      --p2;
3350
1.23k
      dsign = 0;
3351
1.23k
      goto have_i;
3352
1.23k
      }
3353
1.23k
    }
3354
24.7k
  else
3355
24.7k
#endif
3356
24.7k
    b = d2b(rv, &p2, &bbits MTa);
3357
24.7k
#ifdef Avoid_Underflow
3358
24.7k
  p2 -= bc->scale;
3359
24.7k
#endif
3360
  /* floor(log2(rv)) == bbits - 1 + p2 */
3361
  /* Check for denormal case. */
3362
24.7k
  i = P - bbits;
3363
24.7k
  if (i > (j = P - Emin - 1 + p2)) {
3364
#ifdef Sudden_Underflow
3365
    Bfree(b MTa);
3366
    b = i2b(1);
3367
    p2 = Emin;
3368
    i = P - 1;
3369
#ifdef Avoid_Underflow
3370
    word0(rv) = (1 + bc->scale) << Exp_shift;
3371
#else
3372
    word0(rv) = Exp_msk1;
3373
#endif
3374
    word1(rv) = 0;
3375
#else
3376
270
    i = j;
3377
270
#endif
3378
270
    }
3379
#ifdef Honor_FLT_ROUNDS
3380
  if (bc->rounding != 1) {
3381
    if (i > 0)
3382
      b = lshift(b, i MTa);
3383
    if (dsign)
3384
      b = increment(b MTa);
3385
    }
3386
  else
3387
#endif
3388
24.7k
    {
3389
24.7k
    b = lshift(b, ++i MTa);
3390
24.7k
    b->x[0] |= 1;
3391
24.7k
    }
3392
24.7k
#ifndef Sudden_Underflow
3393
25.9k
 have_i:
3394
25.9k
#endif
3395
25.9k
  p2 -= p5 + i;
3396
25.9k
  d = i2b(1 MTa);
3397
  /* Arrange for convenient computation of quotients:
3398
   * shift left if necessary so divisor has 4 leading 0 bits.
3399
   */
3400
25.9k
  if (p5 > 0)
3401
17.9k
    d = pow5mult(d, p5 MTa);
3402
8.00k
  else if (p5 < 0)
3403
5.73k
    b = pow5mult(b, -p5 MTa);
3404
25.9k
  if (p2 > 0) {
3405
13.6k
    b2 = p2;
3406
13.6k
    d2 = 0;
3407
13.6k
    }
3408
12.2k
  else {
3409
12.2k
    b2 = 0;
3410
12.2k
    d2 = -p2;
3411
12.2k
    }
3412
25.9k
  i = dshift(d, d2);
3413
25.9k
  if ((b2 += i) > 0)
3414
22.4k
    b = lshift(b, b2 MTa);
3415
25.9k
  if ((d2 += i) > 0)
3416
25.3k
    d = lshift(d, d2 MTa);
3417
3418
  /* Now b/d = exactly half-way between the two floating-point values */
3419
  /* on either side of the input string.  Compute first digit of b/d. */
3420
3421
25.9k
  if (!(dig = quorem(b,d))) {
3422
0
    b = multadd(b, 10, 0 MTa);  /* very unlikely */
3423
0
    dig = quorem(b,d);
3424
0
    }
3425
3426
  /* Compare b/d with s0 */
3427
3428
271k
  for(i = 0; i < nd0; ) {
3429
258k
    if ((dd = s0[i++] - '0' - dig))
3430
8.03k
      goto ret;
3431
250k
    if (!b->x[0] && b->wds == 1) {
3432
4.84k
      if (i < nd)
3433
2.98k
        dd = 1;
3434
4.84k
      goto ret;
3435
4.84k
      }
3436
245k
    b = multadd(b, 10, 0 MTa);
3437
245k
    dig = quorem(b,d);
3438
245k
    }
3439
207k
  for(j = bc->dp1; i++ < nd;) {
3440
206k
    if ((dd = s0[j++] - '0' - dig))
3441
11.8k
      goto ret;
3442
195k
    if (!b->x[0] && b->wds == 1) {
3443
443
      if (i < nd)
3444
220
        dd = 1;
3445
443
      goto ret;
3446
443
      }
3447
194k
    b = multadd(b, 10, 0 MTa);
3448
194k
    dig = quorem(b,d);
3449
194k
    }
3450
823
  if (dig > 0 || b->x[0] || b->wds > 1)
3451
823
    dd = -1;
3452
25.9k
 ret:
3453
25.9k
  Bfree(b MTa);
3454
25.9k
  Bfree(d MTa);
3455
#ifdef Honor_FLT_ROUNDS
3456
  if (bc->rounding != 1) {
3457
    if (dd < 0) {
3458
      if (bc->rounding == 0) {
3459
        if (!dsign)
3460
          goto retlow1;
3461
        }
3462
      else if (dsign)
3463
        goto rethi1;
3464
      }
3465
    else if (dd > 0) {
3466
      if (bc->rounding == 0) {
3467
        if (dsign)
3468
          goto rethi1;
3469
        goto ret1;
3470
        }
3471
      if (!dsign)
3472
        goto rethi1;
3473
      dval(rv) += 2.*sulp(rv,bc);
3474
      }
3475
    else {
3476
      bc->inexact = 0;
3477
      if (dsign)
3478
        goto rethi1;
3479
      }
3480
    }
3481
  else
3482
#endif
3483
25.9k
  if (speccase) {
3484
1.23k
    if (dd <= 0)
3485
1.23k
      rv->d = 0.;
3486
1.23k
    }
3487
24.7k
  else if (dd < 0) {
3488
10.6k
    if (!dsign)  /* does not happen for round-near */
3489
0
retlow1:
3490
0
      dval(rv) -= sulp(rv,bc);
3491
10.6k
    }
3492
14.0k
  else if (dd > 0) {
3493
11.9k
    if (dsign) {
3494
13.1k
 rethi1:
3495
13.1k
      dval(rv) += sulp(rv,bc);
3496
13.1k
      }
3497
11.9k
    }
3498
2.08k
  else {
3499
    /* Exact half-way case:  apply round-even rule. */
3500
2.08k
    if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {
3501
0
      i = 1 - j;
3502
0
      if (i <= 31) {
3503
0
        if (word1(rv) & (0x1 << i))
3504
0
          goto odd;
3505
0
        }
3506
0
      else if (word0(rv) & (0x1 << (i-32)))
3507
0
        goto odd;
3508
0
      }
3509
2.08k
    else if (word1(rv) & 1) {
3510
1.14k
 odd:
3511
1.14k
      if (dsign)
3512
1.14k
        goto rethi1;
3513
0
      goto retlow1;
3514
1.14k
      }
3515
2.08k
    }
3516
3517
#ifdef Honor_FLT_ROUNDS
3518
 ret1:
3519
#endif
3520
25.9k
  return;
3521
25.9k
  }
3522
#endif /* NO_STRTOD_BIGCOMP */
3523
3524
 double
3525
strtod2(const char *s00, char **se __XS__d)
3526
26.4M
{
3527
26.4M
  int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;
3528
26.4M
  int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign;
3529
26.4M
  const char *s, *s0, *s1;
3530
26.4M
  double aadj, aadj1;
3531
26.4M
  Long L;
3532
26.4M
  U aadj2, adj, rv, rv0;
3533
26.4M
  ULong y, z;
3534
26.4M
  BCinfo bc;
3535
26.4M
  Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
3536
#ifdef USE_BF96
3537
  ULLong bhi, blo, brv, t00, t01, t02, t10, t11, terv, tg, tlo, yz;
3538
  const BF96 *p10;
3539
  int bexact, erv;
3540
#endif
3541
26.4M
#ifdef Avoid_Underflow
3542
#ifndef ROUND_BIASED
3543
  ULong Lsb;
3544
  ULong Lsb1;
3545
#endif
3546
26.4M
#endif
3547
#ifdef SET_INEXACT
3548
  int oldinexact;
3549
#endif
3550
26.4M
#ifndef NO_STRTOD_BIGCOMP
3551
26.4M
  int req_bigcomp = 0;
3552
26.4M
#endif
3553
#ifdef MULTIPLE_THREADS
3554
  ThInfo *TI = 0;
3555
#endif
3556
#ifdef Honor_FLT_ROUNDS /*{*/
3557
#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
3558
  bc.rounding = Flt_Rounds;
3559
#else /*}{*/
3560
  bc.rounding = 1;
3561
  switch(fegetround()) {
3562
    case FE_TOWARDZERO: bc.rounding = 0; break;
3563
    case FE_UPWARD: bc.rounding = 2; break;
3564
    case FE_DOWNWARD: bc.rounding = 3;
3565
    }
3566
#endif /*}}*/
3567
#endif /*}*/
3568
#ifdef USE_LOCALE
3569
  const char *s2;
3570
#endif
3571
3572
26.4M
  sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;
3573
26.4M
  dval(&rv) = 0.;
3574
26.4M
  for(s = s00;;s++) switch(c_read8(s)) {
3575
1.18M
    case '-':
3576
1.18M
      sign = 1;
3577
      /* no break */
3578
1.18M
      mxFallThrough;
3579
1.21M
    case '+':
3580
1.21M
      if (c_read8(++s))
3581
1.20M
        goto break2;
3582
      /* no break */
3583
13.6k
      mxFallThrough;
3584
13.6k
    case 0:
3585
13.6k
      goto ret0;
3586
0
    case '\t':
3587
0
    case '\n':
3588
0
    case '\v':
3589
0
    case '\f':
3590
0
    case '\r':
3591
0
    case ' ':
3592
0
      continue;
3593
25.1M
    default:
3594
25.1M
      goto break2;
3595
26.4M
    }
3596
26.3M
 break2:
3597
26.3M
  if (c_read8(s) == '0') {
3598
#ifndef NO_HEX_FP /*{*/
3599
    switch(s[1]) {
3600
      case 'x':
3601
      case 'X':
3602
#ifdef Honor_FLT_ROUNDS
3603
      gethex(&s, &rv, bc.rounding, sign MTb);
3604
#else
3605
      gethex(&s, &rv, 1, sign MTb);
3606
#endif
3607
      goto ret;
3608
      }
3609
#endif /*}*/
3610
554k
    nz0 = 1;
3611
566k
    while(c_read8(++s) == '0') ;
3612
554k
    if (!c_read8(s))
3613
241k
      goto ret;
3614
554k
    }
3615
26.1M
  s0 = s;
3616
26.1M
  nd = nf = 0;
3617
#ifdef USE_BF96
3618
  yz = 0;
3619
  for(; (c = c_read8(s)) >= '0' && c <= '9'; nd++, s++)
3620
    if (nd < 19)
3621
      yz = 10*yz + c - '0';
3622
#else
3623
26.1M
  y = z = 0;
3624
79.2M
  for(; (c = c_read8(s)) >= '0' && c <= '9'; nd++, s++)
3625
53.1M
    if (nd < 9)
3626
41.8M
      y = 10*y + c - '0';
3627
11.2M
    else if (nd < DBL_DIG + 2)
3628
6.17M
      z = 10*z + c - '0';
3629
26.1M
#endif
3630
26.1M
  nd0 = nd;
3631
26.1M
  bc.dp0 = bc.dp1 = (int)(s - s0);
3632
28.5M
  for(s1 = s; s1 > s0 && *--s1 == '0'; )
3633
2.38M
    ++nz1;
3634
#ifdef USE_LOCALE
3635
  s1 = localeconv()->decimal_point;
3636
  if (c == *s1) {
3637
    c = '.';
3638
    if (*++s1) {
3639
      s2 = s;
3640
      for(;;) {
3641
        if (*++s2 != *s1) {
3642
          c = 0;
3643
          break;
3644
          }
3645
        if (!*++s1) {
3646
          s = s2;
3647
          break;
3648
          }
3649
        }
3650
      }
3651
    }
3652
#endif
3653
26.1M
  if (c == '.') {
3654
2.13M
    c = c_read8(++s);
3655
2.13M
    bc.dp1 = (int)(s - s0);
3656
2.13M
    bc.dplen = bc.dp1 - bc.dp0;
3657
2.13M
    if (!nd) {
3658
12.7M
      for(; c == '0'; c = c_read8(++s))
3659
12.6M
        nz++;
3660
157k
      if (c > '0' && c <= '9') {
3661
99.3k
        bc.dp0 = (int)(s0 - s);
3662
99.3k
        bc.dp1 = bc.dp0 + bc.dplen;
3663
99.3k
        s0 = s;
3664
99.3k
        nf += nz;
3665
99.3k
        nz = 0;
3666
99.3k
        goto have_dig;
3667
99.3k
        }
3668
57.7k
      goto dig_done;
3669
157k
      }
3670
55.4M
    for(; c >= '0' && c <= '9'; c = c_read8(++s)) {
3671
53.4M
 have_dig:
3672
53.4M
      nz++;
3673
53.4M
      if (c -= '0') {
3674
20.9M
        nf += nz;
3675
20.9M
        i = 1;
3676
#ifdef USE_BF96
3677
        for(; i < nz; ++i) {
3678
          if (++nd <= 19)
3679
            yz *= 10;
3680
          }
3681
        if (++nd <= 19)
3682
          yz = 10*yz + c;
3683
#else
3684
52.9M
        for(; i < nz; ++i) {
3685
32.0M
          if (nd++ < 9)
3686
1.62M
            y *= 10;
3687
30.4M
          else if (nd <= DBL_DIG + 2)
3688
1.86M
            z *= 10;
3689
32.0M
          }
3690
20.9M
        if (nd++ < 9)
3691
8.59M
          y = 10*y + c;
3692
12.3M
        else if (nd <= DBL_DIG + 2)
3693
11.0M
          z = 10*z + c;
3694
20.9M
#endif
3695
20.9M
        nz = nz1 = 0;
3696
20.9M
        }
3697
53.4M
      }
3698
1.97M
    }
3699
26.1M
 dig_done:
3700
26.1M
  e = 0;
3701
26.1M
  if (c == 'e' || c == 'E') {
3702
1.34M
    if (!nd && !nz && !nz0) {
3703
77.0k
      goto ret0;
3704
77.0k
      }
3705
1.27M
    s00 = s;
3706
1.27M
    esign = 0;
3707
1.27M
    switch(c = c_read8(++s)) {
3708
282k
      case '-':
3709
282k
        esign = 1;
3710
282k
        mxFallThrough;
3711
1.17M
      case '+':
3712
1.17M
        c = c_read8(++s);
3713
1.27M
      }
3714
1.27M
    if (c >= '0' && c <= '9') {
3715
1.37M
      while(c == '0')
3716
110k
        c = c_read8(++s);
3717
1.26M
      if (c > '0' && c <= '9') {
3718
1.26M
        L = c - '0';
3719
1.26M
        s1 = s;
3720
3.04M
        while((c = *++s) >= '0' && c <= '9') {
3721
1.78M
          if (L <= 19999)
3722
1.71M
            L = 10*L + c - '0';
3723
1.78M
          }
3724
1.26M
        if (L > 19999)
3725
          /* Avoid confusion from exponents
3726
           * so large that e might overflow.
3727
           */
3728
10.2k
          e = 19999; /* safe for 16 bit ints */
3729
1.25M
        else
3730
1.25M
          e = (int)L;
3731
1.26M
        if (esign)
3732
282k
          e = -e;
3733
1.26M
        }
3734
4.87k
      else
3735
4.87k
        e = 0;
3736
1.26M
      }
3737
4.76k
    else
3738
4.76k
      s = s00;
3739
1.27M
    }
3740
26.0M
  if (!nd) {
3741
7.00M
    if (!nz && !nz0) {
3742
6.85M
#ifdef INFNAN_CHECK /*{*/
3743
      /* Check for Nan and Infinity */
3744
6.85M
      if (!bc.dplen)
3745
6.80M
       switch(c) {
3746
#ifndef __XS__
3747
        case 'i':
3748
        case 'I':
3749
        if (match(&s,"nf")) {
3750
          --s;
3751
          if (!match(&s,"inity"))
3752
            ++s;
3753
#else
3754
123k
        case 'I':
3755
123k
        if (match(&s,"nfinity")) {
3756
119k
#endif
3757
119k
          word0(&rv) = 0x7ff00000;
3758
119k
          word1(&rv) = 0;
3759
119k
          goto ret;
3760
119k
          }
3761
3.82k
        break;
3762
#ifndef __XS__
3763
        case 'n':
3764
        case 'N':
3765
        if (match(&s, "an")) {
3766
#else
3767
205k
        case 'N':
3768
205k
        if (match(&s, "aN")) {
3769
199k
#endif
3770
199k
          word0(&rv) = NAN_WORD0;
3771
199k
          word1(&rv) = NAN_WORD1;
3772
199k
#ifndef No_Hex_NaN
3773
199k
          if (c_read8(s) == '(') /*)*/
3774
4.72k
            hexnan(&rv, &s);
3775
199k
#endif
3776
199k
          goto ret;
3777
199k
          }
3778
6.80M
        }
3779
6.53M
#endif /*} INFNAN_CHECK */
3780
6.62M
 ret0:
3781
6.62M
      s = s00;
3782
6.62M
      sign = 0;
3783
6.62M
      }
3784
6.78M
    goto ret;
3785
7.00M
    }
3786
19.0M
  bc.e0 = e1 = e -= nf;
3787
3788
  /* Now we have nd0 digits, starting at s0, followed by a
3789
   * decimal point, followed by nd-nd0 digits.  The number we're
3790
   * after is the integer represented by those digits times
3791
   * 10**e */
3792
3793
19.0M
  if (!nd0)
3794
99.3k
    nd0 = nd;
3795
19.0M
#ifndef USE_BF96
3796
19.0M
  k = nd < DBL_DIG + 2 ? nd : DBL_DIG + 2;
3797
19.0M
  dval(&rv) = y;
3798
19.0M
  if (k > 9) {
3799
#ifdef SET_INEXACT
3800
    if (k > DBL_DIG)
3801
      oldinexact = get_inexact();
3802
#endif
3803
2.71M
    dval(&rv) = tens[k - 9] * dval(&rv) + z;
3804
2.71M
    }
3805
19.0M
#endif
3806
19.0M
  bd0 = 0;
3807
19.0M
  if (nd <= DBL_DIG
3808
16.7M
#ifndef RND_PRODQUOT
3809
16.7M
#ifndef Honor_FLT_ROUNDS
3810
16.7M
    && Flt_Rounds == 1
3811
19.0M
#endif
3812
19.0M
#endif
3813
19.0M
      ) {
3814
#ifdef USE_BF96
3815
    dval(&rv) = yz;
3816
#endif
3817
16.7M
    if (!e)
3818
16.3M
      goto ret;
3819
330k
#ifndef ROUND_BIASED_without_Round_Up
3820
330k
    if (e > 0) {
3821
110k
      if (e <= Ten_pmax) {
3822
#ifdef SET_INEXACT
3823
        bc.inexact = 0;
3824
        oldinexact = 1;
3825
#endif
3826
#ifdef VAX
3827
        goto vax_ovfl_check;
3828
#else
3829
#ifdef Honor_FLT_ROUNDS
3830
        /* round correctly FLT_ROUNDS = 2 or 3 */
3831
        if (sign) {
3832
          rv.d = -rv.d;
3833
          sign = 0;
3834
          }
3835
#endif
3836
9.96k
        /* rv = */ rounded_product(dval(&rv), tens[e]);
3837
9.96k
        goto ret;
3838
9.96k
#endif
3839
9.96k
        }
3840
100k
      i = DBL_DIG - nd;
3841
100k
      if (e <= Ten_pmax + i) {
3842
        /* A fancier test would sometimes let us do
3843
         * this for larger i values.
3844
         */
3845
#ifdef SET_INEXACT
3846
        bc.inexact = 0;
3847
        oldinexact = 1;
3848
#endif
3849
#ifdef Honor_FLT_ROUNDS
3850
        /* round correctly FLT_ROUNDS = 2 or 3 */
3851
        if (sign) {
3852
          rv.d = -rv.d;
3853
          sign = 0;
3854
          }
3855
#endif
3856
4.43k
        e -= i;
3857
4.43k
        dval(&rv) *= tens[i];
3858
#ifdef VAX
3859
        /* VAX exponent range is so narrow we must
3860
         * worry about overflow here...
3861
         */
3862
 vax_ovfl_check:
3863
        word0(&rv) -= P*Exp_msk1;
3864
        /* rv = */ rounded_product(dval(&rv), tens[e]);
3865
        if ((word0(&rv) & Exp_mask)
3866
         > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
3867
          goto ovfl;
3868
        word0(&rv) += P*Exp_msk1;
3869
#else
3870
4.43k
        /* rv = */ rounded_product(dval(&rv), tens[e]);
3871
4.43k
#endif
3872
4.43k
        goto ret;
3873
4.43k
        }
3874
100k
      }
3875
219k
#ifndef Inaccurate_Divide
3876
219k
    else if (e >= -Ten_pmax) {
3877
#ifdef SET_INEXACT
3878
        bc.inexact = 0;
3879
        oldinexact = 1;
3880
#endif
3881
#ifdef Honor_FLT_ROUNDS
3882
      /* round correctly FLT_ROUNDS = 2 or 3 */
3883
      if (sign) {
3884
        rv.d = -rv.d;
3885
        sign = 0;
3886
        }
3887
#endif
3888
148k
      /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
3889
148k
      goto ret;
3890
148k
      }
3891
330k
#endif
3892
330k
#endif /* ROUND_BIASED_without_Round_Up */
3893
330k
    }
3894
#ifdef USE_BF96
3895
  k = nd < 19 ? nd : 19;
3896
#endif
3897
2.51M
  e1 += nd - k; /* scale factor = 10^e1 */
3898
3899
2.51M
#ifdef IEEE_Arith
3900
#ifdef SET_INEXACT
3901
  bc.inexact = 1;
3902
#ifndef USE_BF96
3903
  if (k <= DBL_DIG)
3904
#endif
3905
    oldinexact = get_inexact();
3906
#endif
3907
#ifdef Honor_FLT_ROUNDS
3908
  if (bc.rounding >= 2) {
3909
    if (sign)
3910
      bc.rounding = bc.rounding == 2 ? 0 : 2;
3911
    else
3912
      if (bc.rounding != 2)
3913
        bc.rounding = 0;
3914
    }
3915
#endif
3916
2.51M
#endif /*IEEE_Arith*/
3917
3918
#ifdef USE_BF96 /*{*/
3919
  Debug(++dtoa_stats[0]);
3920
  i = e1 + 342;
3921
  if (i < 0)
3922
    goto undfl;
3923
  if (i > 650)
3924
    goto ovfl;
3925
  p10 = &pten[i];
3926
  brv = yz;
3927
  /* shift brv left, with i =  number of bits shifted */
3928
  i = 0;
3929
  if (!(brv & 0xffffffff00000000ull)) {
3930
    i = 32;
3931
    brv <<= 32;
3932
    }
3933
  if (!(brv & 0xffff000000000000ull)) {
3934
    i += 16;
3935
    brv <<= 16;
3936
    }
3937
  if (!(brv & 0xff00000000000000ull)) {
3938
    i += 8;
3939
    brv <<= 8;
3940
    }
3941
  if (!(brv & 0xf000000000000000ull)) {
3942
    i += 4;
3943
    brv <<= 4;
3944
    }
3945
  if (!(brv & 0xc000000000000000ull)) {
3946
    i += 2;
3947
    brv <<= 2;
3948
    }
3949
  if (!(brv & 0x8000000000000000ull)) {
3950
    i += 1;
3951
    brv <<= 1;
3952
    }
3953
  erv = (64 + 0x3fe) + p10->e - i;
3954
  if (erv <= 0 && nd > 19)
3955
    goto many_digits; /* denormal: may need to look at all digits */
3956
  bhi = brv >> 32;
3957
  blo = brv & 0xffffffffull;
3958
  /* Unsigned 32-bit ints lie in [0,2^32-1] and */
3959
  /* unsigned 64-bit ints lie in [0, 2^64-1].  The product of two unsigned */
3960
  /* 32-bit ints is <= 2^64 - 2*2^32-1 + 1 = 2^64 - 1 - 2*(2^32 - 1), so */
3961
  /* we can add two unsigned 32-bit ints to the product of two such ints, */
3962
  /* and 64 bits suffice to contain the result. */
3963
  t01 = bhi * p10->b1;
3964
  t10 = blo * p10->b0 + (t01 & 0xffffffffull);
3965
  t00 = bhi * p10->b0 + (t01 >> 32) + (t10 >> 32);
3966
  if (t00 & 0x8000000000000000ull) {
3967
    if ((t00 & 0x3ff) && (~t00 & 0x3fe)) { /* unambiguous result? */
3968
      if (nd > 19 && ((t00 + (1<<i) + 2) & 0x400) ^ (t00 & 0x400))
3969
        goto many_digits;
3970
      if (erv <= 0)
3971
        goto denormal;
3972
#ifdef Honor_FLT_ROUNDS
3973
      switch(bc.rounding) {
3974
        case 0: goto noround;
3975
        case 2: goto roundup;
3976
        }
3977
#endif
3978
      if (t00 & 0x400 && t00 & 0xbff)
3979
        goto roundup;
3980
      goto noround;
3981
      }
3982
    }
3983
  else {
3984
    if ((t00 & 0x1ff) && (~t00 & 0x1fe)) { /* unambiguous result? */
3985
      if (nd > 19 && ((t00 + (1<<i) + 2) & 0x200) ^ (t00 & 0x200))
3986
        goto many_digits;
3987
      if (erv <= 1)
3988
        goto denormal1;
3989
#ifdef Honor_FLT_ROUNDS
3990
      switch(bc.rounding) {
3991
        case 0: goto noround1;
3992
        case 2: goto roundup1;
3993
        }
3994
#endif
3995
      if (t00 & 0x200)
3996
        goto roundup1;
3997
      goto noround1;
3998
      }
3999
    }
4000
  /* 3 multiplies did not suffice; try a 96-bit approximation */
4001
  Debug(++dtoa_stats[1]);
4002
  t02 = bhi * p10->b2;
4003
  t11 = blo * p10->b1 + (t02 & 0xffffffffull);
4004
  bexact = 1;
4005
  if (e1 < 0 || e1 > 41 || (t10 | t11) & 0xffffffffull || nd > 19)
4006
    bexact = 0;
4007
  tlo = (t10 & 0xffffffffull) + (t02 >> 32) + (t11 >> 32);
4008
  if (!bexact && (tlo + 0x10) >> 32 > tlo >> 32)
4009
    goto many_digits;
4010
  t00 += tlo >> 32;
4011
  if (t00 & 0x8000000000000000ull) {
4012
    if (erv <= 0) { /* denormal result */
4013
      if (nd >= 20 || !((tlo & 0xfffffff0) | (t00 & 0x3ff)))
4014
        goto many_digits;
4015
 denormal:
4016
      if (erv <= -52) {
4017
#ifdef Honor_FLT_ROUNDS
4018
        switch(bc.rounding) {
4019
          case 0: goto undfl;
4020
          case 2: goto tiniest;
4021
          }
4022
#endif
4023
        if (erv < -52 || !(t00 & 0x7fffffffffffffffull))
4024
          goto undfl;
4025
        goto tiniest;
4026
        }
4027
      tg = 1ull << (11 - erv);
4028
      t00 &= ~(tg - 1); /* clear low bits */
4029
#ifdef Honor_FLT_ROUNDS
4030
      switch(bc.rounding) {
4031
        case 0: goto noround_den;
4032
        case 2: goto roundup_den;
4033
        }
4034
#endif
4035
      if (t00 & tg) {
4036
#ifdef Honor_FLT_ROUNDS
4037
 roundup_den:
4038
#endif
4039
        t00 += tg << 1;
4040
        if (!(t00 & 0x8000000000000000ull)) {
4041
          if (++erv > 0)
4042
            goto smallest_normal;
4043
          t00 = 0x8000000000000000ull;
4044
          }
4045
        }
4046
#ifdef Honor_FLT_ROUNDS
4047
 noround_den:
4048
#endif
4049
      LLval(&rv) = t00 >> (12 - erv);
4050
      Set_errno(ERANGE);
4051
      goto ret;
4052
      }
4053
    if (bexact) {
4054
#ifdef SET_INEXACT
4055
      if (!(t00 & 0x7ff) && !(tlo & 0xffffffffull)) {
4056
        bc.inexact = 0;
4057
        goto noround;
4058
        }
4059
#endif
4060
#ifdef Honor_FLT_ROUNDS
4061
      switch(bc.rounding) {
4062
        case 2:
4063
        if (t00 & 0x7ff)
4064
          goto roundup;
4065
        case 0: goto noround;
4066
        }
4067
#endif
4068
      if (t00 & 0x400 && (tlo & 0xffffffff) | (t00 & 0xbff))
4069
        goto roundup;
4070
      goto noround;
4071
      }
4072
    if ((tlo & 0xfffffff0) | (t00 & 0x3ff)
4073
     && (nd <= 19 ||  ((t00 + (1ull << i)) & 0xfffffffffffffc00ull)
4074
        == (t00 & 0xfffffffffffffc00ull))) {
4075
      /* Unambiguous result. */
4076
      /* If nd > 19, then incrementing the 19th digit */
4077
      /* does not affect rv. */
4078
#ifdef Honor_FLT_ROUNDS
4079
      switch(bc.rounding) {
4080
        case 0: goto noround;
4081
        case 2: goto roundup;
4082
        }
4083
#endif
4084
      if (t00 & 0x400) { /* round up */
4085
 roundup:
4086
        t00 += 0x800;
4087
        if (!(t00 & 0x8000000000000000ull)) {
4088
          /* rounded up to a power of 2 */
4089
          if (erv >= 0x7fe)
4090
            goto ovfl;
4091
          terv = erv + 1;
4092
          LLval(&rv) = terv << 52;
4093
          goto ret;
4094
          }
4095
        }
4096
 noround:
4097
      if (erv >= 0x7ff)
4098
        goto ovfl;
4099
      terv = erv;
4100
      LLval(&rv) = (terv << 52) | ((t00 & 0x7ffffffffffff800ull) >> 11);
4101
      goto ret;
4102
      }
4103
    }
4104
  else {
4105
    if (erv <= 1) { /* denormal result */
4106
      if (nd >= 20 || !((tlo & 0xfffffff0) | (t00 & 0x1ff)))
4107
        goto many_digits;
4108
 denormal1:
4109
      if (erv <= -51) {
4110
#ifdef Honor_FLT_ROUNDS
4111
        switch(bc.rounding) {
4112
          case 0: goto undfl;
4113
          case 2: goto tiniest;
4114
          }
4115
#endif
4116
        if (erv < -51 || !(t00 & 0x3fffffffffffffffull))
4117
          goto undfl;
4118
 tiniest:
4119
        LLval(&rv) = 1;
4120
        Set_errno(ERANGE);
4121
        goto ret;
4122
        }
4123
      tg = 1ull << (11 - erv);
4124
#ifdef Honor_FLT_ROUNDS
4125
      switch(bc.rounding) {
4126
        case 0: goto noround1_den;
4127
        case 2: goto roundup1_den;
4128
        }
4129
#endif
4130
      if (t00 & tg) {
4131
#ifdef Honor_FLT_ROUNDS
4132
 roundup1_den:
4133
#endif
4134
        if (0x8000000000000000ull & (t00 += (tg<<1)) && erv == 1) {
4135
4136
 smallest_normal:
4137
          LLval(&rv) = 0x0010000000000000ull;
4138
          goto ret;
4139
          }
4140
        }
4141
#ifdef Honor_FLT_ROUNDS
4142
 noround1_den:
4143
#endif
4144
      if (erv <= -52)
4145
        goto undfl;
4146
      LLval(&rv) = t00 >> (12 - erv);
4147
      Set_errno(ERANGE);
4148
      goto ret;
4149
      }
4150
    if (bexact) {
4151
#ifdef SET_INEXACT
4152
      if (!(t00 & 0x3ff) && !(tlo & 0xffffffffull)) {
4153
        bc.inexact = 0;
4154
        goto noround1;
4155
        }
4156
#endif
4157
#ifdef Honor_FLT_ROUNDS
4158
      switch(bc.rounding) {
4159
        case 2:
4160
        if (t00 & 0x3ff)
4161
          goto roundup1;
4162
        case 0: goto noround1;
4163
        }
4164
#endif
4165
      if (t00 & 0x200 && (t00 & 0x5ff || tlo))
4166
        goto roundup1;
4167
      goto noround1;
4168
      }
4169
    if ((tlo & 0xfffffff0) | (t00 & 0x1ff)
4170
     && (nd <= 19 ||  ((t00 + (1ull << i)) & 0x7ffffffffffffe00ull)
4171
        == (t00 & 0x7ffffffffffffe00ull))) {
4172
      /* Unambiguous result. */
4173
#ifdef Honor_FLT_ROUNDS
4174
      switch(bc.rounding) {
4175
        case 0: goto noround1;
4176
        case 2: goto roundup1;
4177
        }
4178
#endif
4179
      if (t00 & 0x200) { /* round up */
4180
 roundup1:
4181
        t00 += 0x400;
4182
        if (!(t00 & 0x4000000000000000ull)) {
4183
          /* rounded up to a power of 2 */
4184
          if (erv >= 0x7ff)
4185
            goto ovfl;
4186
          terv = erv;
4187
          LLval(&rv) = terv << 52;
4188
          goto ret;
4189
          }
4190
        }
4191
 noround1:
4192
      if (erv >= 0x800)
4193
        goto ovfl;
4194
      terv = erv - 1;
4195
      LLval(&rv) = (terv << 52) | ((t00 & 0x3ffffffffffffc00ull) >> 10);
4196
      goto ret;
4197
      }
4198
    }
4199
 many_digits:
4200
  Debug(++dtoa_stats[2]);
4201
  if (nd > 17) {
4202
    if (nd > 18) {
4203
      yz /= 100;
4204
      e1 += 2;
4205
      }
4206
    else {
4207
      yz /= 10;
4208
      e1 += 1;
4209
      }
4210
    y = yz / 100000000;
4211
    }
4212
  else if (nd > 9) {
4213
    i = nd - 9;
4214
    y = (yz >> i) / pfive[i-1];
4215
    }
4216
  else
4217
    y = yz;
4218
  dval(&rv) = yz;
4219
#endif /*}*/
4220
4221
2.51M
#ifdef IEEE_Arith
4222
2.51M
#ifdef Avoid_Underflow
4223
2.51M
  bc.scale = 0;
4224
2.51M
#endif
4225
2.51M
#endif /*IEEE_Arith*/
4226
4227
  /* Get starting approximation = rv * 10**e1 */
4228
4229
2.51M
  if (e1 > 0) {
4230
1.13M
    if ((i = e1 & 15))
4231
1.07M
      dval(&rv) *= tens[i];
4232
1.13M
    if (e1 &= ~15) {
4233
804k
      if (e1 > DBL_MAX_10_EXP) {
4234
38.9k
 ovfl:
4235
        /* Can't trust HUGE_VAL */
4236
38.9k
#ifdef IEEE_Arith
4237
#ifdef Honor_FLT_ROUNDS
4238
        switch(bc.rounding) {
4239
          case 0: /* toward 0 */
4240
          case 3: /* toward -infinity */
4241
          word0(&rv) = Big0;
4242
          word1(&rv) = Big1;
4243
          break;
4244
          default:
4245
          word0(&rv) = Exp_mask;
4246
          word1(&rv) = 0;
4247
          }
4248
#else /*Honor_FLT_ROUNDS*/
4249
38.9k
        word0(&rv) = Exp_mask;
4250
38.9k
        word1(&rv) = 0;
4251
38.9k
#endif /*Honor_FLT_ROUNDS*/
4252
#ifdef SET_INEXACT
4253
        /* set overflow bit */
4254
        dval(&rv0) = 1e300;
4255
        dval(&rv0) *= dval(&rv0);
4256
#endif
4257
#else /*IEEE_Arith*/
4258
        word0(&rv) = Big0;
4259
        word1(&rv) = Big1;
4260
#endif /*IEEE_Arith*/
4261
45.4k
 range_err:
4262
45.4k
        if (bd0) {
4263
2.00k
          Bfree(bb MTb);
4264
2.00k
          Bfree(bd MTb);
4265
2.00k
          Bfree(bs MTb);
4266
2.00k
          Bfree(bd0 MTb);
4267
2.00k
          Bfree(delta MTb);
4268
2.00k
          }
4269
45.4k
        Set_errno(ERANGE);
4270
45.4k
        goto ret;
4271
38.9k
        }
4272
789k
      e1 >>= 4;
4273
2.08M
      for(j = 0; e1 > 1; j++, e1 >>= 1)
4274
1.29M
        if (e1 & 1)
4275
523k
          dval(&rv) *= bigtens[j];
4276
    /* The last multiplication could overflow. */
4277
789k
      word0(&rv) -= P*Exp_msk1;
4278
789k
      dval(&rv) *= bigtens[j];
4279
789k
      if ((z = word0(&rv) & Exp_mask)
4280
789k
       > Exp_msk1*(DBL_MAX_EXP+Bias-P))
4281
14.6k
        goto ovfl;
4282
774k
      if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
4283
        /* set to largest number */
4284
        /* (Can't trust DBL_MAX) */
4285
9.54k
        word0(&rv) = Big0;
4286
9.54k
        word1(&rv) = Big1;
4287
9.54k
        }
4288
765k
      else
4289
765k
        word0(&rv) += P*Exp_msk1;
4290
774k
      }
4291
1.13M
    }
4292
1.37M
  else if (e1 < 0) {
4293
1.00M
    e1 = -e1;
4294
1.00M
    if ((i = e1 & 15))
4295
974k
      dval(&rv) /= tens[i];
4296
1.00M
    if (e1 >>= 4) {
4297
303k
      if (e1 >= 1 << n_bigtens)
4298
4.26k
        goto undfl;
4299
299k
#ifdef Avoid_Underflow
4300
299k
      if (e1 & Scale_Bit)
4301
53.0k
        bc.scale = 2*P;
4302
1.28M
      for(j = 0; e1 > 0; j++, e1 >>= 1)
4303
981k
        if (e1 & 1)
4304
556k
          dval(&rv) *= tinytens[j];
4305
299k
      if (bc.scale && (j = 2*P + 1 - ((word0(&rv) & Exp_mask)
4306
53.0k
            >> Exp_shift)) > 0) {
4307
        /* scaled rv is denormal; clear j low bits */
4308
12.1k
        if (j >= 32) {
4309
6.19k
          if (j > 54)
4310
1.02k
            goto undfl;
4311
5.16k
          word1(&rv) = 0;
4312
5.16k
          if (j >= 53)
4313
1.32k
           word0(&rv) = (P+2)*Exp_msk1;
4314
3.84k
          else
4315
3.84k
           word0(&rv) &= 0xffffffff << (j-32);
4316
5.16k
          }
4317
5.97k
        else
4318
5.97k
          word1(&rv) &= 0xffffffff << j;
4319
12.1k
        }
4320
#else
4321
      for(j = 0; e1 > 1; j++, e1 >>= 1)
4322
        if (e1 & 1)
4323
          dval(&rv) *= tinytens[j];
4324
      /* The last multiplication could underflow. */
4325
      dval(&rv0) = dval(&rv);
4326
      dval(&rv) *= tinytens[j];
4327
      if (!dval(&rv)) {
4328
        dval(&rv) = 2.*dval(&rv0);
4329
        dval(&rv) *= tinytens[j];
4330
#endif
4331
298k
        if (!dval(&rv)) {
4332
6.51k
 undfl:
4333
6.51k
          dval(&rv) = 0.;
4334
#ifdef Honor_FLT_ROUNDS
4335
          if (bc.rounding == 2)
4336
            word1(&rv) = 1;
4337
#endif
4338
6.51k
          goto range_err;
4339
0
          }
4340
#ifndef Avoid_Underflow
4341
        word0(&rv) = Tiny0;
4342
        word1(&rv) = Tiny1;
4343
        /* The refinement below will clean
4344
         * this approximation up.
4345
         */
4346
        }
4347
#endif
4348
298k
      }
4349
1.00M
    }
4350
4351
  /* Now the hard part -- adjusting rv to the correct value.*/
4352
4353
  /* Put digits into bd: true value = bd * 10^e */
4354
4355
2.47M
  bc.nd = nd - nz1;
4356
2.47M
#ifndef NO_STRTOD_BIGCOMP
4357
2.47M
  bc.nd0 = nd0; /* Only needed if nd > strtod_diglim, but done here */
4358
      /* to silence an erroneous warning about bc.nd0 */
4359
      /* possibly not being initialized. */
4360
2.47M
  if (nd > strtod_diglim) {
4361
    /* ASSERT(strtod_diglim >= 18); 18 == one more than the */
4362
    /* minimum number of decimal digits to distinguish double values */
4363
    /* in IEEE arithmetic. */
4364
29.0k
    i = j = 18;
4365
29.0k
    if (i > nd0)
4366
16.3k
      j += bc.dplen;
4367
90.6k
    for(;;) {
4368
90.6k
      if (--j < bc.dp1 && j >= bc.dp0)
4369
2.66k
        j = bc.dp0 - 1;
4370
90.6k
      if (s0[j] != '0')
4371
29.0k
        break;
4372
61.5k
      --i;
4373
61.5k
      }
4374
29.0k
    e += nd - i;
4375
29.0k
    nd = i;
4376
29.0k
    if (nd0 > nd)
4377
12.8k
      nd0 = nd;
4378
29.0k
    if (nd < 9) { /* must recompute y */
4379
2.73k
      y = 0;
4380
9.24k
      for(i = 0; i < nd0; ++i)
4381
6.51k
        y = 10*y + s0[i] - '0';
4382
5.99k
      for(j = bc.dp1; i < nd; ++i)
4383
3.26k
        y = 10*y + s0[j++] - '0';
4384
2.73k
      }
4385
29.0k
    }
4386
2.47M
#endif
4387
2.47M
  bd0 = s2b(s0, nd0, nd, y, bc.dplen MTb);
4388
4389
2.59M
  for(;;) {
4390
2.59M
    bd = Balloc(bd0->k MTb);
4391
2.59M
    Bcopy(bd, bd0);
4392
2.59M
    bb = d2b(&rv, &bbe, &bbbits MTb);  /* rv = bb * 2^bbe */
4393
2.59M
    bs = i2b(1 MTb);
4394
4395
2.59M
    if (e >= 0) {
4396
1.56M
      bb2 = bb5 = 0;
4397
1.56M
      bd2 = bd5 = e;
4398
1.56M
      }
4399
1.03M
    else {
4400
1.03M
      bb2 = bb5 = -e;
4401
1.03M
      bd2 = bd5 = 0;
4402
1.03M
      }
4403
2.59M
    if (bbe >= 0)
4404
1.56M
      bb2 += bbe;
4405
1.02M
    else
4406
1.02M
      bd2 -= bbe;
4407
2.59M
    bs2 = bb2;
4408
#ifdef Honor_FLT_ROUNDS
4409
    if (bc.rounding != 1)
4410
      bs2++;
4411
#endif
4412
2.59M
#ifdef Avoid_Underflow
4413
#ifndef ROUND_BIASED
4414
    Lsb = LSB;
4415
    Lsb1 = 0;
4416
#endif
4417
2.59M
    j = bbe - bc.scale;
4418
2.59M
    i = j + bbbits - 1; /* logb(rv) */
4419
2.59M
    j = P + 1 - bbbits;
4420
2.59M
    if (i < Emin) { /* denormal */
4421
16.0k
      i = Emin - i;
4422
16.0k
      j -= i;
4423
#ifndef ROUND_BIASED
4424
      if (i < 32)
4425
        Lsb <<= i;
4426
      else if (i < 52)
4427
        Lsb1 = Lsb << (i-32);
4428
      else
4429
        Lsb1 = Exp_mask;
4430
#endif
4431
16.0k
      }
4432
#else /*Avoid_Underflow*/
4433
#ifdef Sudden_Underflow
4434
#ifdef IBM
4435
    j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
4436
#else
4437
    j = P + 1 - bbbits;
4438
#endif
4439
#else /*Sudden_Underflow*/
4440
    j = bbe;
4441
    i = j + bbbits - 1; /* logb(rv) */
4442
    if (i < Emin) /* denormal */
4443
      j += P - Emin;
4444
    else
4445
      j = P + 1 - bbbits;
4446
#endif /*Sudden_Underflow*/
4447
#endif /*Avoid_Underflow*/
4448
2.59M
    bb2 += j;
4449
2.59M
    bd2 += j;
4450
2.59M
#ifdef Avoid_Underflow
4451
2.59M
    bd2 += bc.scale;
4452
2.59M
#endif
4453
2.59M
    i = bb2 < bd2 ? bb2 : bd2;
4454
2.59M
    if (i > bs2)
4455
1.15M
      i = bs2;
4456
2.59M
    if (i > 0) {
4457
2.54M
      bb2 -= i;
4458
2.54M
      bd2 -= i;
4459
2.54M
      bs2 -= i;
4460
2.54M
      }
4461
2.59M
    if (bb5 > 0) {
4462
1.03M
      bs = pow5mult(bs, bb5 MTb);
4463
1.03M
      bb1 = mult(bs, bb MTb);
4464
1.03M
      Bfree(bb MTb);
4465
1.03M
      bb = bb1;
4466
1.03M
      }
4467
2.59M
    if (bb2 > 0)
4468
2.59M
      bb = lshift(bb, bb2 MTb);
4469
2.59M
    if (bd5 > 0)
4470
897k
      bd = pow5mult(bd, bd5 MTb);
4471
2.59M
    if (bd2 > 0)
4472
1.15M
      bd = lshift(bd, bd2 MTb);
4473
2.59M
    if (bs2 > 0)
4474
1.35M
      bs = lshift(bs, bs2 MTb);
4475
2.59M
    delta = diff(bb, bd MTb);
4476
2.59M
    bc.dsign = delta->sign;
4477
2.59M
    delta->sign = 0;
4478
2.59M
    i = cmp(delta, bs);
4479
2.59M
#ifndef NO_STRTOD_BIGCOMP /*{*/
4480
2.59M
    if (bc.nd > nd && i <= 0) {
4481
28.8k
      if (bc.dsign) {
4482
        /* Must use bigcomp(). */
4483
24.7k
        req_bigcomp = 1;
4484
24.7k
        break;
4485
24.7k
        }
4486
#ifdef Honor_FLT_ROUNDS
4487
      if (bc.rounding != 1) {
4488
        if (i < 0) {
4489
          req_bigcomp = 1;
4490
          break;
4491
          }
4492
        }
4493
      else
4494
#endif
4495
4.12k
        i = -1; /* Discarded digits make delta smaller. */
4496
4.12k
      }
4497
2.57M
#endif /*}*/
4498
#ifdef Honor_FLT_ROUNDS /*{*/
4499
    if (bc.rounding != 1) {
4500
      if (i < 0) {
4501
        /* Error is less than an ulp */
4502
        if (!delta->x[0] && delta->wds <= 1) {
4503
          /* exact */
4504
#ifdef SET_INEXACT
4505
          bc.inexact = 0;
4506
#endif
4507
          break;
4508
          }
4509
        if (bc.rounding) {
4510
          if (bc.dsign) {
4511
            adj.d = 1.;
4512
            goto apply_adj;
4513
            }
4514
          }
4515
        else if (!bc.dsign) {
4516
          adj.d = -1.;
4517
          if (!word1(&rv)
4518
           && !(word0(&rv) & Frac_mask)) {
4519
            y = word0(&rv) & Exp_mask;
4520
#ifdef Avoid_Underflow
4521
            if (!bc.scale || y > 2*P*Exp_msk1)
4522
#else
4523
            if (y)
4524
#endif
4525
              {
4526
              delta = lshift(delta,Log2P MTb);
4527
              if (cmp(delta, bs) <= 0)
4528
              adj.d = -0.5;
4529
              }
4530
            }
4531
 apply_adj:
4532
#ifdef Avoid_Underflow /*{*/
4533
          if (bc.scale && (y = word0(&rv) & Exp_mask)
4534
            <= 2*P*Exp_msk1)
4535
            word0(&adj) += (2*P+1)*Exp_msk1 - y;
4536
#else
4537
#ifdef Sudden_Underflow
4538
          if ((word0(&rv) & Exp_mask) <=
4539
              P*Exp_msk1) {
4540
            word0(&rv) += P*Exp_msk1;
4541
            dval(&rv) += adj.d*ulp(dval(&rv));
4542
            word0(&rv) -= P*Exp_msk1;
4543
            }
4544
          else
4545
#endif /*Sudden_Underflow*/
4546
#endif /*Avoid_Underflow}*/
4547
          dval(&rv) += adj.d*ulp(&rv);
4548
          }
4549
        break;
4550
        }
4551
      adj.d = ratio(delta, bs);
4552
      if (adj.d < 1.)
4553
        adj.d = 1.;
4554
      if (adj.d <= 0x7ffffffe) {
4555
        /* adj = rounding ? ceil(adj) : floor(adj); */
4556
        y = adj.d;
4557
        if (y != adj.d) {
4558
          if (!((bc.rounding>>1) ^ bc.dsign))
4559
            y++;
4560
          adj.d = y;
4561
          }
4562
        }
4563
#ifdef Avoid_Underflow /*{*/
4564
      if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
4565
        word0(&adj) += (2*P+1)*Exp_msk1 - y;
4566
#else
4567
#ifdef Sudden_Underflow
4568
      if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
4569
        word0(&rv) += P*Exp_msk1;
4570
        adj.d *= ulp(dval(&rv));
4571
        if (bc.dsign)
4572
          dval(&rv) += adj.d;
4573
        else
4574
          dval(&rv) -= adj.d;
4575
        word0(&rv) -= P*Exp_msk1;
4576
        goto cont;
4577
        }
4578
#endif /*Sudden_Underflow*/
4579
#endif /*Avoid_Underflow}*/
4580
      adj.d *= ulp(&rv);
4581
      if (bc.dsign) {
4582
        if (word0(&rv) == Big0 && word1(&rv) == Big1)
4583
          goto ovfl;
4584
        dval(&rv) += adj.d;
4585
        }
4586
      else
4587
        dval(&rv) -= adj.d;
4588
      goto cont;
4589
      }
4590
#endif /*}Honor_FLT_ROUNDS*/
4591
4592
2.57M
    if (i < 0) {
4593
      /* Error is less than half an ulp -- check for
4594
       * special case of mantissa a power of two.
4595
       */
4596
1.93M
      if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
4597
152k
#ifdef IEEE_Arith /*{*/
4598
152k
#ifdef Avoid_Underflow
4599
152k
       || (word0(&rv) & Exp_mask) <= (2*P+1)*Exp_msk1
4600
#else
4601
       || (word0(&rv) & Exp_mask) <= Exp_msk1
4602
#endif
4603
1.93M
#endif /*}*/
4604
1.93M
        ) {
4605
#ifdef SET_INEXACT
4606
        if (!delta->x[0] && delta->wds <= 1)
4607
          bc.inexact = 0;
4608
#endif
4609
1.78M
        break;
4610
1.78M
        }
4611
150k
      if (!delta->x[0] && delta->wds <= 1) {
4612
        /* exact result */
4613
#ifdef SET_INEXACT
4614
        bc.inexact = 0;
4615
#endif
4616
12.3k
        break;
4617
12.3k
        }
4618
138k
      delta = lshift(delta,Log2P MTb);
4619
138k
      if (cmp(delta, bs) > 0)
4620
1.62k
        goto drop_down;
4621
136k
      break;
4622
138k
      }
4623
635k
    if (i == 0) {
4624
      /* exactly half-way between */
4625
37.5k
      if (bc.dsign) {
4626
8.15k
        if ((word0(&rv) & Bndry_mask1) == Bndry_mask1
4627
708
         &&  word1(&rv) == (
4628
708
#ifdef Avoid_Underflow
4629
708
      (bc.scale && (y = word0(&rv) & Exp_mask) <= 2*P*Exp_msk1)
4630
708
    ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
4631
708
#endif
4632
708
               0xffffffff)) {
4633
          /*boundary case -- increment exponent*/
4634
262
          if (word0(&rv) == Big0 && word1(&rv) == Big1)
4635
0
            goto ovfl;
4636
262
          word0(&rv) = (word0(&rv) & Exp_mask)
4637
262
            + Exp_msk1
4638
#ifdef IBM
4639
            | Exp_msk1 >> 4
4640
#endif
4641
262
            ;
4642
262
          word1(&rv) = 0;
4643
262
#ifdef Avoid_Underflow
4644
262
          bc.dsign = 0;
4645
262
#endif
4646
262
          break;
4647
262
          }
4648
8.15k
        }
4649
29.4k
      else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
4650
1.62k
 drop_down:
4651
        /* boundary case -- decrement exponent */
4652
#ifdef Sudden_Underflow /*{{*/
4653
        L = word0(&rv) & Exp_mask;
4654
#ifdef IBM
4655
        if (L <  Exp_msk1)
4656
#else
4657
#ifdef Avoid_Underflow
4658
        if (L <= (bc.scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
4659
#else
4660
        if (L <= Exp_msk1)
4661
#endif /*Avoid_Underflow*/
4662
#endif /*IBM*/
4663
          {
4664
          if (bc.nd >nd) {
4665
            bc.uflchk = 1;
4666
            break;
4667
            }
4668
          goto undfl;
4669
          }
4670
        L -= Exp_msk1;
4671
#else /*Sudden_Underflow}{*/
4672
1.62k
#ifdef Avoid_Underflow
4673
1.62k
        if (bc.scale) {
4674
0
          L = word0(&rv) & Exp_mask;
4675
0
          if (L <= (2*P+1)*Exp_msk1) {
4676
0
            if (L > (P+2)*Exp_msk1)
4677
              /* round even ==> */
4678
              /* accept rv */
4679
0
              break;
4680
            /* rv = smallest denormal */
4681
0
            if (bc.nd >nd) {
4682
0
              bc.uflchk = 1;
4683
0
              break;
4684
0
              }
4685
0
            goto undfl;
4686
0
            }
4687
0
          }
4688
1.62k
#endif /*Avoid_Underflow*/
4689
1.62k
        L = (word0(&rv) & Exp_mask) - Exp_msk1;
4690
1.62k
#endif /*Sudden_Underflow}}*/
4691
1.62k
        word0(&rv) = L | Bndry_mask1;
4692
1.62k
        word1(&rv) = 0xffffffff;
4693
#ifdef IBM
4694
        goto cont;
4695
#else
4696
1.62k
#ifndef NO_STRTOD_BIGCOMP
4697
1.62k
        if (bc.nd > nd)
4698
495
          goto cont;
4699
1.12k
#endif
4700
1.12k
        break;
4701
1.62k
#endif
4702
1.62k
        }
4703
#ifndef ROUND_BIASED
4704
#ifdef Avoid_Underflow
4705
      if (Lsb1) {
4706
        if (!(word0(&rv) & Lsb1))
4707
          break;
4708
        }
4709
      else if (!(word1(&rv) & Lsb))
4710
        break;
4711
#else
4712
      if (!(word1(&rv) & LSB))
4713
        break;
4714
#endif
4715
#endif
4716
37.2k
      if (bc.dsign)
4717
7.89k
#ifdef Avoid_Underflow
4718
7.89k
        dval(&rv) += sulp(&rv, &bc);
4719
#else
4720
        dval(&rv) += ulp(&rv);
4721
#endif
4722
#ifndef ROUND_BIASED
4723
      else {
4724
#ifdef Avoid_Underflow
4725
        dval(&rv) -= sulp(&rv, &bc);
4726
#else
4727
        dval(&rv) -= ulp(&rv);
4728
#endif
4729
#ifndef Sudden_Underflow
4730
        if (!dval(&rv)) {
4731
          if (bc.nd >nd) {
4732
            bc.uflchk = 1;
4733
            break;
4734
            }
4735
          goto undfl;
4736
          }
4737
#endif
4738
        }
4739
#ifdef Avoid_Underflow
4740
      bc.dsign = 1 - bc.dsign;
4741
#endif
4742
#endif
4743
37.2k
      break;
4744
37.5k
      }
4745
597k
    if ((aadj = ratio(delta, bs)) <= 2.) {
4746
433k
      if (bc.dsign)
4747
156k
        aadj = aadj1 = 1.;
4748
277k
      else if (word1(&rv) || word0(&rv) & Bndry_mask) {
4749
276k
#ifndef Sudden_Underflow
4750
276k
        if (word1(&rv) == Tiny1 && !word0(&rv)) {
4751
0
          if (bc.nd >nd) {
4752
0
            bc.uflchk = 1;
4753
0
            break;
4754
0
            }
4755
0
          goto undfl;
4756
0
          }
4757
276k
#endif
4758
276k
        aadj = 1.;
4759
276k
        aadj1 = -1.;
4760
276k
        }
4761
1.23k
      else {
4762
        /* special case -- power of FLT_RADIX to be */
4763
        /* rounded down... */
4764
4765
1.23k
        if (aadj < 2./FLT_RADIX)
4766
0
          aadj = 1./FLT_RADIX;
4767
1.23k
        else
4768
1.23k
          aadj *= 0.5;
4769
1.23k
        aadj1 = -aadj;
4770
1.23k
        }
4771
433k
      }
4772
164k
    else {
4773
164k
      aadj *= 0.5;
4774
164k
      aadj1 = bc.dsign ? aadj : -aadj;
4775
#ifdef Check_FLT_ROUNDS
4776
      switch(bc.rounding) {
4777
        case 2: /* towards +infinity */
4778
          aadj1 -= 0.5;
4779
          break;
4780
        case 0: /* towards 0 */
4781
        case 3: /* towards -infinity */
4782
          aadj1 += 0.5;
4783
        }
4784
#else
4785
164k
      if (Flt_Rounds == 0)
4786
0
        aadj1 += 0.5;
4787
164k
#endif /*Check_FLT_ROUNDS*/
4788
164k
      }
4789
597k
    y = word0(&rv) & Exp_mask;
4790
4791
    /* Check for overflow */
4792
4793
597k
    if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
4794
7.84k
      dval(&rv0) = dval(&rv);
4795
7.84k
      word0(&rv) -= P*Exp_msk1;
4796
7.84k
      adj.d = aadj1 * ulp(&rv);
4797
7.84k
      dval(&rv) += adj.d;
4798
7.84k
      if ((word0(&rv) & Exp_mask) >=
4799
7.84k
          Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
4800
2.00k
        if (word0(&rv0) == Big0 && word1(&rv0) == Big1)
4801
2.00k
          goto ovfl;
4802
0
        word0(&rv) = Big0;
4803
0
        word1(&rv) = Big1;
4804
0
        goto cont;
4805
2.00k
        }
4806
5.83k
      else
4807
5.83k
        word0(&rv) += P*Exp_msk1;
4808
7.84k
      }
4809
590k
    else {
4810
590k
#ifdef Avoid_Underflow
4811
590k
      if (bc.scale && y <= 2*P*Exp_msk1) {
4812
6.12k
        if (aadj <= 0x7fffffff) {
4813
6.12k
          if ((z = (ULong)aadj) <= 0)
4814
1.23k
            z = 1;
4815
6.12k
          aadj = z;
4816
6.12k
          aadj1 = bc.dsign ? aadj : -aadj;
4817
6.12k
          }
4818
6.12k
        dval(&aadj2) = aadj1;
4819
6.12k
        word0(&aadj2) += (2*P+1)*Exp_msk1 - y;
4820
6.12k
        aadj1 = dval(&aadj2);
4821
6.12k
        adj.d = aadj1 * ulp(&rv);
4822
6.12k
        dval(&rv) += adj.d;
4823
6.12k
        if (rv.d == 0.)
4824
#ifdef NO_STRTOD_BIGCOMP
4825
          goto undfl;
4826
#else
4827
1.23k
          {
4828
1.23k
          req_bigcomp = 1;
4829
1.23k
          break;
4830
1.23k
          }
4831
6.12k
#endif
4832
6.12k
        }
4833
583k
      else {
4834
583k
        adj.d = aadj1 * ulp(&rv);
4835
583k
        dval(&rv) += adj.d;
4836
583k
        }
4837
#else
4838
#ifdef Sudden_Underflow
4839
      if ((word0(&rv) & Exp_mask) <= P*Exp_msk1) {
4840
        dval(&rv0) = dval(&rv);
4841
        word0(&rv) += P*Exp_msk1;
4842
        adj.d = aadj1 * ulp(&rv);
4843
        dval(&rv) += adj.d;
4844
#ifdef IBM
4845
        if ((word0(&rv) & Exp_mask) <  P*Exp_msk1)
4846
#else
4847
        if ((word0(&rv) & Exp_mask) <= P*Exp_msk1)
4848
#endif
4849
          {
4850
          if (word0(&rv0) == Tiny0
4851
           && word1(&rv0) == Tiny1) {
4852
            if (bc.nd >nd) {
4853
              bc.uflchk = 1;
4854
              break;
4855
              }
4856
            goto undfl;
4857
            }
4858
          word0(&rv) = Tiny0;
4859
          word1(&rv) = Tiny1;
4860
          goto cont;
4861
          }
4862
        else
4863
          word0(&rv) -= P*Exp_msk1;
4864
        }
4865
      else {
4866
        adj.d = aadj1 * ulp(&rv);
4867
        dval(&rv) += adj.d;
4868
        }
4869
#else /*Sudden_Underflow*/
4870
      /* Compute adj so that the IEEE rounding rules will
4871
       * correctly round rv + adj in some half-way cases.
4872
       * If rv * ulp(rv) is denormalized (i.e.,
4873
       * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
4874
       * trouble from bits lost to denormalization;
4875
       * example: 1.2e-307 .
4876
       */
4877
      if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
4878
        aadj1 = (double)(int)(aadj + 0.5);
4879
        if (!bc.dsign)
4880
          aadj1 = -aadj1;
4881
        }
4882
      adj.d = aadj1 * ulp(&rv);
4883
      dval(&rv) += adj.d;
4884
#endif /*Sudden_Underflow*/
4885
#endif /*Avoid_Underflow*/
4886
590k
      }
4887
594k
    z = word0(&rv) & Exp_mask;
4888
594k
#ifndef SET_INEXACT
4889
594k
    if (bc.nd == nd) {
4890
519k
#ifdef Avoid_Underflow
4891
519k
    if (!bc.scale)
4892
494k
#endif
4893
494k
    if (y == z) {
4894
      /* Can we stop now? */
4895
476k
      L = (Long)aadj;
4896
476k
      aadj -= L;
4897
      /* The tolerances below are conservative. */
4898
476k
      if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
4899
394k
        if (aadj < .4999999 || aadj > .5000001)
4900
394k
          break;
4901
394k
        }
4902
81.4k
      else if (aadj < .4999999/FLT_RADIX)
4903
81.4k
        break;
4904
476k
      }
4905
519k
    }
4906
119k
#endif
4907
119k
 cont:
4908
119k
    Bfree(bb MTb);
4909
119k
    Bfree(bd MTb);
4910
119k
    Bfree(bs MTb);
4911
119k
    Bfree(delta MTb);
4912
119k
    }
4913
2.47M
  Bfree(bb MTb);
4914
2.47M
  Bfree(bd MTb);
4915
2.47M
  Bfree(bs MTb);
4916
2.47M
  Bfree(bd0 MTb);
4917
2.47M
  Bfree(delta MTb);
4918
2.47M
#ifndef NO_STRTOD_BIGCOMP
4919
2.47M
  if (req_bigcomp) {
4920
25.9k
    bd0 = 0;
4921
25.9k
    bc.e0 += nz1;
4922
25.9k
    bigcomp(&rv, s0, &bc MTb);
4923
25.9k
    y = word0(&rv) & Exp_mask;
4924
25.9k
    if (y == Exp_mask)
4925
7.42k
      goto ovfl;
4926
18.5k
    if (y == 0 && rv.d == 0.)
4927
1.23k
      goto undfl;
4928
18.5k
    }
4929
2.46M
#endif
4930
2.46M
#ifdef Avoid_Underflow
4931
2.46M
  if (bc.scale) {
4932
50.7k
    word0(&rv0) = Exp_1 - 2*P*Exp_msk1;
4933
50.7k
    word1(&rv0) = 0;
4934
50.7k
    dval(&rv) *= dval(&rv0);
4935
50.7k
#ifndef NO_ERRNO
4936
    /* try to avoid the bug of testing an 8087 register value */
4937
50.7k
#ifdef IEEE_Arith
4938
50.7k
    if (!(word0(&rv) & Exp_mask))
4939
#else
4940
    if (word0(&rv) == 0 && word1(&rv) == 0)
4941
#endif
4942
50.7k
      Set_errno(ERANGE);
4943
50.7k
#endif
4944
50.7k
    }
4945
2.46M
#endif /* Avoid_Underflow */
4946
26.4M
 ret:
4947
#ifdef SET_INEXACT
4948
  if (bc.inexact) {
4949
    if (!(word0(&rv) & Exp_mask)) {
4950
      /* set underflow and inexact bits */
4951
      dval(&rv0) = 1e-300;
4952
      dval(&rv0) *= dval(&rv0);
4953
      }
4954
    else if (!oldinexact) {
4955
      word0(&rv0) = Exp_1 + (70 << Exp_shift);
4956
      word1(&rv0) = 0;
4957
      dval(&rv0) += 1.;
4958
      }
4959
    }
4960
  else if (!oldinexact)
4961
    clear_inexact();
4962
#endif
4963
26.4M
  if (se)
4964
26.4M
    *se = (char *)s;
4965
26.4M
  return sign ? -dval(&rv) : dval(&rv);
4966
2.46M
  }
4967
4968
#ifndef MULTIPLE_THREADS
4969
#ifndef __XS__
4970
  static char *dtoa_result;
4971
#endif
4972
#endif
4973
4974
 static char *
4975
rv_alloc(int i MTd)
4976
14.5M
{
4977
14.5M
  int j, k, *r;
4978
4979
14.5M
  j = sizeof(ULong);
4980
14.5M
  for(k = 0;
4981
14.5M
    sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (size_t)i;
4982
14.5M
    j <<= 1)
4983
3.46k
      k++;
4984
14.5M
  r = (int*)Balloc(k MTa);
4985
14.5M
  *r = k;
4986
14.5M
  return
4987
14.5M
#ifndef MULTIPLE_THREADS
4988
#ifndef __XS__
4989
    dtoa_result =
4990
#endif
4991
14.5M
#endif
4992
14.5M
    (char *)(r+1);
4993
14.5M
  }
4994
4995
 static char *
4996
nrv_alloc(const char *s, char *s0, size_t s0len, char **rve, int n MTd)
4997
2.57M
{
4998
2.57M
  char *rv, *t;
4999
5000
2.57M
  if (!s0)
5001
2.57M
    s0 = rv_alloc(n MTa);
5002
0
  else if (s0len <= (size_t)n) {
5003
0
    rv = 0;
5004
0
    t = rv + n;
5005
0
    goto rve_chk;
5006
0
    }
5007
2.57M
  t = rv = s0;
5008
11.9M
  while((*t = *s++))
5009
9.32M
    ++t;
5010
2.57M
 rve_chk:
5011
2.57M
  if (rve)
5012
2.57M
    *rve = t;
5013
2.57M
  return rv;
5014
2.57M
  }
5015
5016
/* freedtoa(s) must be used to free values s returned by dtoa
5017
 * when MULTIPLE_THREADS is #defined.  It should be used in all cases,
5018
 * but for consistency with earlier versions of dtoa, it is optional
5019
 * when MULTIPLE_THREADS is not defined.
5020
 */
5021
5022
 void
5023
freedtoa(char *s __XS__d)
5024
14.5M
{
5025
#ifdef MULTIPLE_THREADS
5026
  ThInfo *TI = 0;
5027
#endif
5028
14.5M
  Bigint *b = (Bigint *)((int *)s - 1);
5029
14.5M
  b->maxwds = 1 << (b->k = *(int*)b);
5030
14.5M
  Bfree(b MTb);
5031
14.5M
#ifndef MULTIPLE_THREADS
5032
#ifndef __XS__
5033
  if (s == dtoa_result)
5034
    dtoa_result = 0;
5035
#endif
5036
14.5M
#endif
5037
14.5M
  }
5038
5039
/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
5040
 *
5041
 * Inspired by "How to Print Floating-Point Numbers Accurately" by
5042
 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
5043
 *
5044
 * Modifications:
5045
 *  1. Rather than iterating, we use a simple numeric overestimate
5046
 *     to determine k = floor(log10(d)).  We scale relevant
5047
 *     quantities using O(log2(k)) rather than O(k) multiplications.
5048
 *  2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
5049
 *     try to generate digits strictly left to right.  Instead, we
5050
 *     compute with fewer bits and propagate the carry if necessary
5051
 *     when rounding the final digit up.  This is often faster.
5052
 *  3. Under the assumption that input will be rounded nearest,
5053
 *     mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
5054
 *     That is, we allow equality in stopping tests when the
5055
 *     round-nearest rule will give the same floating-point value
5056
 *     as would satisfaction of the stopping test with strict
5057
 *     inequality.
5058
 *  4. We remove common factors of powers of 2 from relevant
5059
 *     quantities.
5060
 *  5. When converting floating-point integers less than 1e16,
5061
 *     we use floating-point arithmetic rather than resorting
5062
 *     to multiple-precision integers.
5063
 *  6. When asked to produce fewer than 15 digits, we first try
5064
 *     to get by with floating-point arithmetic; we resort to
5065
 *     multiple-precision integer arithmetic only if we cannot
5066
 *     guarantee that the floating-point calculation has given
5067
 *     the correctly rounded result.  For k requested digits and
5068
 *     "uniformly" distributed input, the probability is
5069
 *     something like 10^(k-15) that we must resort to the Long
5070
 *     calculation.
5071
 */
5072
5073
 char *
5074
dtoa_r(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve, char *buf, size_t blen __XS__d)
5075
14.5M
{
5076
 /* Arguments ndigits, decpt, sign are similar to those
5077
  of ecvt and fcvt; trailing zeros are suppressed from
5078
  the returned string.  If not null, *rve is set to point
5079
  to the end of the return value.  If d is +-Infinity or NaN,
5080
  then *decpt is set to 9999.
5081
5082
  mode:
5083
    0 ==> shortest string that yields d when read in
5084
      and rounded to nearest.
5085
    1 ==> like 0, but with Steele & White stopping rule;
5086
      e.g. with IEEE P754 arithmetic , mode 0 gives
5087
      1e23 whereas mode 1 gives 9.999999999999999e22.
5088
    2 ==> max(1,ndigits) significant digits.  This gives a
5089
      return value similar to that of ecvt, except
5090
      that trailing zeros are suppressed.
5091
    3 ==> through ndigits past the decimal point.  This
5092
      gives a return value similar to that from fcvt,
5093
      except that trailing zeros are suppressed, and
5094
      ndigits can be negative.
5095
    4,5 ==> similar to 2 and 3, respectively, but (in
5096
      round-nearest mode) with the tests of mode 0 to
5097
      possibly return a shorter string that rounds to d.
5098
      With IEEE arithmetic and compilation with
5099
      -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
5100
      as modes 2 and 3 when FLT_ROUNDS != 1.
5101
    6-9 ==> Debugging modes similar to mode - 4:  don't try
5102
      fast floating-point estimate (if applicable).
5103
5104
    Values of mode other than 0-9 are treated as mode 0.
5105
5106
  When not NULL, buf is an output buffer of length blen, which must
5107
  be large enough to accommodate suppressed trailing zeros and a trailing
5108
  null byte.  If blen is too small, rv = NULL is returned, in which case
5109
  if rve is not NULL, a subsequent call with blen >= (*rve - rv) + 1
5110
  should succeed in returning buf.
5111
5112
  When buf is NULL, sufficient space is allocated for the return value,
5113
  which, when done using, the caller should pass to freedtoa().
5114
5115
  USE_BF is automatically defined when neither NO_LONG_LONG nor NO_BF96
5116
  is defined.
5117
  */
5118
5119
#ifdef MULTIPLE_THREADS
5120
  ThInfo *TI = 0;
5121
#endif
5122
14.5M
  int bbits, b2, b5, be, dig, i, ilim, ilim1,
5123
14.5M
    j, j1, k, leftright, m2, m5, s2, s5, spec_case;
5124
14.5M
#ifndef Sudden_Underflow
5125
14.5M
  int denorm;
5126
14.5M
#endif
5127
14.5M
  Bigint *b, *b1, *delta, *mlo, *mhi, *S;
5128
14.5M
  U u;
5129
14.5M
  char *s;
5130
#ifdef SET_INEXACT
5131
  int inexact, oldinexact;
5132
#endif
5133
#ifdef USE_BF96 /*{{*/
5134
  BF96 *p10;
5135
  ULLong dbhi, dbits, dblo, den, hb, rb, rblo, res, res0, res3, reslo, sres,
5136
    sulp, tv0, tv1, tv2, tv3, ulp, ulplo, ulpmask, ures, ureslo, zb;
5137
  int eulp, k1, n2, ulpadj, ulpshift;
5138
#else /*}{*/
5139
14.5M
#ifndef Sudden_Underflow
5140
14.5M
  ULong x;
5141
14.5M
#endif
5142
14.5M
  Long L;
5143
14.5M
  U d2, eps;
5144
14.5M
  double ds;
5145
14.5M
  int ieps, ilim0, k0, k_check, try_quick;
5146
14.5M
#ifndef No_leftright
5147
14.5M
#ifdef IEEE_Arith
5148
14.5M
  U eps1;
5149
14.5M
#endif
5150
14.5M
#endif
5151
14.5M
#endif /*}}*/
5152
#ifdef Honor_FLT_ROUNDS /*{*/
5153
  int Rounding;
5154
#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
5155
  Rounding = Flt_Rounds;
5156
#else /*}{*/
5157
  Rounding = 1;
5158
  switch(fegetround()) {
5159
    case FE_TOWARDZERO: Rounding = 0; break;
5160
    case FE_UPWARD: Rounding = 2; break;
5161
    case FE_DOWNWARD: Rounding = 3;
5162
    }
5163
#endif /*}}*/
5164
#endif /*}*/
5165
5166
14.5M
  u.d = dd;
5167
14.5M
  if (word0(&u) & Sign_bit) {
5168
    /* set sign for everything, including 0's and NaNs */
5169
1.65M
    *sign = 1;
5170
1.65M
    word0(&u) &= ~Sign_bit; /* clear sign bit */
5171
1.65M
    }
5172
12.8M
  else
5173
12.8M
    *sign = 0;
5174
5175
14.5M
#if defined(IEEE_Arith) + defined(VAX)
5176
14.5M
#ifdef IEEE_Arith
5177
14.5M
  if ((word0(&u) & Exp_mask) == Exp_mask)
5178
#else
5179
  if (word0(&u)  == 0x8000)
5180
#endif
5181
1.90M
    {
5182
    /* Infinity or NaN */
5183
1.90M
    *decpt = 9999;
5184
1.90M
#ifdef IEEE_Arith
5185
1.90M
    if (!word1(&u) && !(word0(&u) & 0xfffff))
5186
588k
      return nrv_alloc("Infinity", buf, blen, rve, 8 MTb);
5187
1.31M
#endif
5188
1.31M
    *sign = 0; //NaN doesn't have a sign
5189
1.31M
    return nrv_alloc("NaN", buf, blen, rve, 3 MTb);
5190
1.90M
    }
5191
12.6M
#endif
5192
#ifdef IBM
5193
  dval(&u) += 0; /* normalize */
5194
#endif
5195
12.6M
  if (!dval(&u)) {
5196
673k
    *decpt = 1;
5197
673k
    return nrv_alloc("0", buf, blen, rve, 1 MTb);
5198
673k
    }
5199
5200
#ifdef SET_INEXACT
5201
#ifndef USE_BF96
5202
  try_quick =
5203
#endif
5204
  oldinexact = get_inexact();
5205
  inexact = 1;
5206
#endif
5207
#ifdef Honor_FLT_ROUNDS
5208
  if (Rounding >= 2) {
5209
    if (*sign)
5210
      Rounding = Rounding == 2 ? 0 : 2;
5211
    else
5212
      if (Rounding != 2)
5213
        Rounding = 0;
5214
    }
5215
#endif
5216
#ifdef USE_BF96 /*{{*/
5217
  dbits = (u.LL & 0xfffffffffffffull) << 11;  /* fraction bits */
5218
  if ((be = u.LL >> 52)) /* biased exponent; nonzero ==> normal */ {
5219
    dbits |= 0x8000000000000000ull;
5220
    denorm = ulpadj = 0;
5221
    }
5222
  else {
5223
    denorm = 1;
5224
    ulpadj = be + 1;
5225
    dbits <<= 1;
5226
    if (!(dbits & 0xffffffff00000000ull)) {
5227
      dbits <<= 32;
5228
      be -= 32;
5229
      }
5230
    if (!(dbits & 0xffff000000000000ull)) {
5231
      dbits <<= 16;
5232
      be -= 16;
5233
      }
5234
    if (!(dbits & 0xff00000000000000ull)) {
5235
      dbits <<= 8;
5236
      be -= 8;
5237
      }
5238
    if (!(dbits & 0xf000000000000000ull)) {
5239
      dbits <<= 4;
5240
      be -= 4;
5241
      }
5242
    if (!(dbits & 0xc000000000000000ull)) {
5243
      dbits <<= 2;
5244
      be -= 2;
5245
      }
5246
    if (!(dbits & 0x8000000000000000ull)) {
5247
      dbits <<= 1;
5248
      be -= 1;
5249
      }
5250
    assert(be >= -51);
5251
    ulpadj -= be;
5252
    }
5253
  j = Lhint[be + 51];
5254
  p10 = &pten[j];
5255
  dbhi = dbits >> 32;
5256
  dblo = dbits & 0xffffffffull;
5257
  i = be - 0x3fe;
5258
  if (i < p10->e
5259
  || (i == p10->e && (dbhi < p10->b0 || (dbhi == p10->b0 && dblo < p10->b1))))
5260
    --j;
5261
  k = j - 342;
5262
5263
  /* now 10^k <= dd < 10^(k+1) */
5264
5265
#else /*}{*/
5266
5267
11.9M
  b = d2b(&u, &be, &bbits MTb);
5268
#ifdef Sudden_Underflow
5269
  i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
5270
#else
5271
11.9M
  if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
5272
11.9M
#endif
5273
11.9M
    dval(&d2) = dval(&u);
5274
11.9M
    word0(&d2) &= Frac_mask1;
5275
11.9M
    word0(&d2) |= Exp_11;
5276
#ifdef IBM
5277
    if (j = 11 - hi0bits(word0(&d2) & Frac_mask))
5278
      dval(&d2) /= 1 << j;
5279
#endif
5280
5281
    /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
5282
     * log10(x)  =  log(x) / log(10)
5283
     *    ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
5284
     * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
5285
     *
5286
     * This suggests computing an approximation k to log10(d) by
5287
     *
5288
     * k = (i - Bias)*0.301029995663981
5289
     *  + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
5290
     *
5291
     * We want k to be too large rather than too small.
5292
     * The error in the first-order Taylor series approximation
5293
     * is in our favor, so we just round up the constant enough
5294
     * to compensate for any error in the multiplication of
5295
     * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
5296
     * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
5297
     * adding 1e-13 to the constant term more than suffices.
5298
     * Hence we adjust the constant term to 0.1760912590558.
5299
     * (We could get a more accurate k by invoking log10,
5300
     *  but this is probably not worthwhile.)
5301
     */
5302
5303
11.9M
    i -= Bias;
5304
#ifdef IBM
5305
    i <<= 2;
5306
    i += j;
5307
#endif
5308
11.9M
#ifndef Sudden_Underflow
5309
11.9M
    denorm = 0;
5310
11.9M
    }
5311
8.22k
  else {
5312
    /* d is denormalized */
5313
5314
8.22k
    i = bbits + be + (Bias + (P-1) - 1);
5315
8.22k
    x = i > 32  ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
5316
8.22k
          : word1(&u) << (32 - i);
5317
8.22k
    dval(&d2) = x;
5318
8.22k
    word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
5319
8.22k
    i -= (Bias + (P-1) - 1) + 1;
5320
8.22k
    denorm = 1;
5321
8.22k
    }
5322
11.9M
#endif
5323
11.9M
  ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
5324
11.9M
  k = (int)ds;
5325
11.9M
  if (ds < 0. && ds != k)
5326
510k
    k--; /* want k = floor(ds) */
5327
11.9M
  k_check = 1;
5328
11.9M
  if (k >= 0 && k <= Ten_pmax) {
5329
10.3M
    if (dval(&u) < tens[k])
5330
140k
      k--;
5331
10.3M
    k_check = 0;
5332
10.3M
    }
5333
11.9M
  j = bbits - i - 1;
5334
11.9M
  if (j >= 0) {
5335
5.68M
    b2 = 0;
5336
5.68M
    s2 = j;
5337
5.68M
    }
5338
6.25M
  else {
5339
6.25M
    b2 = -j;
5340
6.25M
    s2 = 0;
5341
6.25M
    }
5342
11.9M
  if (k >= 0) {
5343
11.4M
    b5 = 0;
5344
11.4M
    s5 = k;
5345
11.4M
    s2 += k;
5346
11.4M
    }
5347
511k
  else {
5348
511k
    b2 -= k;
5349
511k
    b5 = -k;
5350
511k
    s5 = 0;
5351
511k
    }
5352
11.9M
#endif /*}}*/
5353
11.9M
  if (mode < 0 || mode > 9)
5354
0
    mode = 0;
5355
5356
11.9M
#ifndef USE_BF96
5357
11.9M
#ifndef SET_INEXACT
5358
#ifdef Check_FLT_ROUNDS
5359
  try_quick = Rounding == 1;
5360
#else
5361
11.9M
  try_quick = 1;
5362
11.9M
#endif
5363
11.9M
#endif /*SET_INEXACT*/
5364
11.9M
#endif
5365
5366
11.9M
  if (mode > 5) {
5367
0
    mode -= 4;
5368
0
#ifndef USE_BF96
5369
0
    try_quick = 0;
5370
0
#endif
5371
0
    }
5372
11.9M
  leftright = 1;
5373
11.9M
  ilim = ilim1 = -1;  /* Values for cases 0 and 1; done here to */
5374
        /* silence erroneous "gcc -Wall" warning. */
5375
11.9M
  switch(mode) {
5376
11.4M
    case 0:
5377
11.4M
    case 1:
5378
11.4M
      i = 18;
5379
11.4M
      ndigits = 0;
5380
11.4M
      break;
5381
528k
    case 2:
5382
528k
      leftright = 0;
5383
      /* no break */
5384
528k
      mxFallThrough;
5385
528k
    case 4:
5386
528k
      if (ndigits <= 0)
5387
0
        ndigits = 1;
5388
528k
      ilim = ilim1 = i = ndigits;
5389
528k
      break;
5390
9.47k
    case 3:
5391
9.47k
      leftright = 0;
5392
      /* no break */
5393
9.47k
      mxFallThrough;
5394
9.47k
    case 5:
5395
9.47k
      i = ndigits + k + 1;
5396
9.47k
      ilim = i;
5397
9.47k
      ilim1 = i - 1;
5398
9.47k
      if (i <= 0)
5399
5.50k
        i = 1;
5400
11.9M
    }
5401
11.9M
  if (!buf) {
5402
11.9M
    buf = rv_alloc(i MTb);
5403
11.9M
    blen = sizeof(Bigint) + ((1 << ((int*)buf)[-1]) - 1)*sizeof(ULong) - sizeof(int);
5404
11.9M
    }
5405
0
  else if (blen <= (size_t)i) {
5406
0
    buf = 0;
5407
0
    if (rve)
5408
0
      *rve = buf + i;
5409
0
    return buf;
5410
0
    }
5411
11.9M
  s = buf;
5412
5413
  /* Check for special case that d is a normalized power of 2. */
5414
5415
11.9M
  spec_case = 0;
5416
11.9M
  if (mode < 2 || (leftright
5417
#ifdef Honor_FLT_ROUNDS
5418
      && Rounding == 1
5419
#endif
5420
11.4M
        )) {
5421
11.4M
    if (!word1(&u) && !(word0(&u) & Bndry_mask)
5422
1.50M
#ifndef Sudden_Underflow
5423
1.50M
     && word0(&u) & (Exp_mask & ~Exp_msk1)
5424
11.4M
#endif
5425
11.4M
        ) {
5426
      /* The special case */
5427
1.50M
      spec_case = 1;
5428
1.50M
      }
5429
11.4M
    }
5430
5431
#ifdef USE_BF96 /*{*/
5432
  b = 0;
5433
  if (ilim < 0 && (mode == 3 || mode == 5)) {
5434
    S = mhi = 0;
5435
    goto no_digits;
5436
    }
5437
  i = 1;
5438
  j = 52 + 0x3ff - be;
5439
  ulpshift = 0;
5440
  ulplo = 0;
5441
  /* Can we do an exact computation with 64-bit integer arithmetic? */
5442
  if (k < 0) {
5443
    if (k < -25)
5444
      goto toobig;
5445
    res = dbits >> 11;
5446
    n2 = pfivebits[k1 = -(k + 1)] + 53;
5447
    j1 = j;
5448
    if (n2 > 61) {
5449
      ulpshift = n2 - 61;
5450
      if (res & (ulpmask = (1ull << ulpshift) - 1))
5451
        goto toobig;
5452
      j -= ulpshift;
5453
      res >>= ulpshift;
5454
      }
5455
    /* Yes. */
5456
    res *= ulp = pfive[k1];
5457
    if (ulpshift) {
5458
      ulplo = ulp;
5459
      ulp >>= ulpshift;
5460
      }
5461
    j += k;
5462
    if (ilim == 0) {
5463
      S = mhi = 0;
5464
      if (res > (5ull << j))
5465
        goto one_digit;
5466
      goto no_digits;
5467
      }
5468
    goto no_div;
5469
    }
5470
  if (ilim == 0 && j + k >= 0) {
5471
    S = mhi = 0;
5472
    if ((dbits >> 11) > (pfive[k-1] << j))
5473
      goto one_digit;
5474
    goto no_digits;
5475
    }
5476
  if (k <= dtoa_divmax && j + k >= 0) {
5477
    /* Another "yes" case -- we will use exact integer arithmetic. */
5478
 use_exact:
5479
    Debug(++dtoa_stats[3]);
5480
    res = dbits >> 11;  /* residual */
5481
    ulp = 1;
5482
    if (k <= 0)
5483
      goto no_div;
5484
    j1 = j + k + 1;
5485
    den = pfive[k-i] << (j1 - i);
5486
    for(;;) {
5487
      dig = res / den;
5488
      *s++ = '0' + dig;
5489
      if (!(res -= dig*den)) {
5490
#ifdef SET_INEXACT
5491
        inexact = 0;
5492
        oldinexact = 1;
5493
#endif
5494
        goto retc;
5495
        }
5496
      if (ilim < 0) {
5497
        ures = den - res;
5498
        if (2*res <= ulp
5499
        && (spec_case ? 4*res <= ulp : (2*res < ulp || dig & 1)))
5500
          goto ulp_reached;
5501
        if (2*ures < ulp)
5502
          goto Roundup;
5503
        }
5504
      else if (i == ilim) {
5505
        switch(Rounding) {
5506
          case 0: goto retc;
5507
          case 2: goto Roundup;
5508
          }
5509
        ures = 2*res;
5510
        if (ures > den
5511
        || (ures == den && dig & 1)
5512
        || (spec_case && res <= ulp && 2*res >= ulp))
5513
          goto Roundup;
5514
        goto retc;
5515
        }
5516
      if (j1 < ++i) {
5517
        res *= 10;
5518
        ulp *= 10;
5519
        }
5520
      else {
5521
        if (i > k)
5522
          break;
5523
        den = pfive[k-i] << (j1 - i);
5524
        }
5525
      }
5526
 no_div:
5527
    for(;;) {
5528
      dig = den = res >> j;
5529
      *s++ = '0' + dig;
5530
      if (!(res -= den << j)) {
5531
#ifdef SET_INEXACT
5532
        inexact = 0;
5533
        oldinexact = 1;
5534
#endif
5535
        goto retc;
5536
        }
5537
      if (ilim < 0) {
5538
        ures = (1ull << j) - res;
5539
        if (2*res <= ulp
5540
        && (spec_case ? 4*res <= ulp : (2*res < ulp || dig & 1))) {
5541
 ulp_reached:
5542
          if (ures < res
5543
          || (ures == res && dig & 1))
5544
            goto Roundup;
5545
          goto retc;
5546
          }
5547
        if (2*ures < ulp)
5548
          goto Roundup;
5549
        }
5550
      --j;
5551
      if (i == ilim) {
5552
#ifdef Honor_FLT_ROUNDS
5553
        switch(Rounding) {
5554
          case 0: goto retc;
5555
          case 2: goto Roundup;
5556
          }
5557
#endif
5558
        hb = 1ull << j;
5559
        if (res & hb && (dig & 1 || res & (hb-1)))
5560
          goto Roundup;
5561
        if (spec_case && res <= ulp && 2*res >= ulp) {
5562
 Roundup:
5563
          while(*--s == '9')
5564
            if (s == buf) {
5565
              ++k;
5566
              *s++ = '1';
5567
              goto ret1;
5568
              }
5569
          ++*s++;
5570
          goto ret1;
5571
          }
5572
        goto retc;
5573
        }
5574
      ++i;
5575
      res *= 5;
5576
      if (ulpshift) {
5577
        ulplo = 5*(ulplo & ulpmask);
5578
        ulp = 5*ulp + (ulplo >> ulpshift);
5579
        }
5580
      else
5581
        ulp *= 5;
5582
      }
5583
    }
5584
 toobig:
5585
  if (ilim > 28)
5586
    goto Fast_failed1;
5587
  /* Scale by 10^-k */
5588
  p10 = &pten[342-k];
5589
  tv0 = p10->b2 * dblo; /* rarely matters, but does, e.g., for 9.862818194192001e18 */
5590
  tv1 = p10->b1 * dblo + (tv0 >> 32);
5591
  tv2 = p10->b2 * dbhi + (tv1 & 0xffffffffull);
5592
  tv3 = p10->b0 * dblo + (tv1>>32) + (tv2>>32);
5593
  res3 = p10->b1 * dbhi + (tv3 & 0xffffffffull);
5594
  res = p10->b0 * dbhi + (tv3>>32) + (res3>>32);
5595
  be += p10->e - 0x3fe;
5596
  eulp = j1 = be - 54 + ulpadj;
5597
  if (!(res & 0x8000000000000000ull)) {
5598
    --be;
5599
    res3 <<= 1;
5600
    res = (res << 1) | ((res3 & 0x100000000ull) >> 32);
5601
    }
5602
  res0 = res; /* save for Fast_failed */
5603
#if !defined(SET_INEXACT) && !defined(NO_DTOA_64) /*{*/
5604
  if (ilim > 19)
5605
    goto Fast_failed;
5606
  Debug(++dtoa_stats[4]);
5607
  assert(be >= 0 && be <= 4); /* be = 0 is rare, but possible, e.g., for 1e20 */
5608
  res >>= 4 - be;
5609
  ulp = p10->b0;  /* ulp */
5610
  ulp = (ulp << 29) | (p10->b1 >> 3);
5611
  /* scaled ulp = ulp * 2^(eulp - 60) */
5612
  /* We maintain 61 bits of the scaled ulp. */
5613
  if (ilim == 0) {
5614
    if (!(res & 0x7fffffffffffffeull)
5615
     || !((~res) & 0x7fffffffffffffeull))
5616
      goto Fast_failed1;
5617
    S = mhi = 0;
5618
    if (res >= 0x5000000000000000ull)
5619
      goto one_digit;
5620
    goto no_digits;
5621
    }
5622
  rb = 1; /* upper bound on rounding error */
5623
  for(;;++i) {
5624
    dig = res >> 60;
5625
    *s++ = '0' + dig;
5626
    res &= 0xfffffffffffffffull;
5627
    if (ilim < 0) {
5628
      ures = 0x1000000000000000ull - res;
5629
      if (eulp > 0) {
5630
        assert(eulp <= 4);
5631
        sulp = ulp << (eulp - 1);
5632
        if (res <= ures) {
5633
          if (res + rb > ures - rb)
5634
            goto Fast_failed;
5635
          if (res < sulp)
5636
            goto retc;
5637
          }
5638
        else {
5639
          if (res - rb <= ures + rb)
5640
            goto Fast_failed;
5641
          if (ures < sulp)
5642
            goto Roundup;
5643
          }
5644
        }
5645
      else {
5646
        zb = -(1ull << (eulp + 63));
5647
        if (!(zb & res)) {
5648
          sres = res << (1 - eulp);
5649
          if (sres < ulp && (!spec_case || 2*sres < ulp)) {
5650
            if ((res+rb) << (1 - eulp) >= ulp)
5651
              goto Fast_failed;
5652
            if (ures < res) {
5653
              if (ures + rb >= res - rb)
5654
                goto Fast_failed;
5655
              goto Roundup;
5656
              }
5657
            if (ures - rb < res + rb)
5658
              goto Fast_failed;
5659
            goto retc;
5660
            }
5661
          }
5662
        if (!(zb & ures) && ures << -eulp < ulp) {
5663
          if (ures << (1 - eulp) < ulp)
5664
            goto  Roundup;
5665
          goto Fast_failed;
5666
          }
5667
        }
5668
      }
5669
    else if (i == ilim) {
5670
      ures = 0x1000000000000000ull - res;
5671
      if (ures < res) {
5672
        if (ures <= rb || res - rb <= ures + rb) {
5673
          if (j + k >= 0 && k >= 0 && k <= 27)
5674
            goto use_exact1;
5675
          goto Fast_failed;
5676
          }
5677
#ifdef Honor_FLT_ROUNDS
5678
        if (Rounding == 0)
5679
          goto retc;
5680
#endif
5681
        goto Roundup;
5682
        }
5683
      if (res <= rb || ures - rb <= res + rb) {
5684
        if (j + k >= 0 && k >= 0 && k <= 27) {
5685
 use_exact1:
5686
          s = buf;
5687
          i = 1;
5688
          goto use_exact;
5689
          }
5690
        goto Fast_failed;
5691
        }
5692
#ifdef Honor_FLT_ROUNDS
5693
      if (Rounding == 2)
5694
        goto Roundup;
5695
#endif
5696
      goto retc;
5697
      }
5698
    rb *= 10;
5699
    if (rb >= 0x1000000000000000ull)
5700
      goto Fast_failed;
5701
    res *= 10;
5702
    ulp *= 5;
5703
    if (ulp & 0x8000000000000000ull) {
5704
      eulp += 4;
5705
      ulp >>= 3;
5706
      }
5707
    else {
5708
      eulp += 3;
5709
      ulp >>= 2;
5710
      }
5711
    }
5712
#endif /*}*/
5713
#ifndef NO_BF96
5714
 Fast_failed:
5715
#endif
5716
  Debug(++dtoa_stats[5]);
5717
  s = buf;
5718
  i = 4 - be;
5719
  res = res0 >> i;
5720
  reslo = 0xffffffffull & res3;
5721
  if (i)
5722
    reslo = (res0 << (64 - i)) >> 32 | (reslo >> i);
5723
  rb = 0;
5724
  rblo = 4; /* roundoff bound */
5725
  ulp = p10->b0;  /* ulp */
5726
  ulp = (ulp << 29) | (p10->b1 >> 3);
5727
  eulp = j1;
5728
  for(i = 1;;++i) {
5729
    dig = res >> 60;
5730
    *s++ = '0' + dig;
5731
    res &= 0xfffffffffffffffull;
5732
#ifdef SET_INEXACT
5733
    if (!res && !reslo) {
5734
      if (!(res3 & 0xffffffffull)) {
5735
        inexact = 0;
5736
        oldinexact = 1;
5737
        }
5738
      goto retc;
5739
      }
5740
#endif
5741
    if (ilim < 0) {
5742
      ures = 0x1000000000000000ull - res;
5743
      ureslo = 0;
5744
      if (reslo) {
5745
        ureslo = 0x100000000ull - reslo;
5746
        --ures;
5747
        }
5748
      if (eulp > 0) {
5749
        assert(eulp <= 4);
5750
        sulp = (ulp << (eulp - 1)) - rb;
5751
        if (res <= ures) {
5752
          if (res < sulp) {
5753
            if (res+rb < ures-rb)
5754
              goto retc;
5755
            }
5756
          }
5757
        else if (ures < sulp) {
5758
          if (res-rb > ures+rb)
5759
            goto Roundup;
5760
          }
5761
        goto Fast_failed1;
5762
        }
5763
      else {
5764
        zb = -(1ull << (eulp + 60));
5765
        if (!(zb & (res + rb))) {
5766
          sres = (res - rb) << (1 - eulp);
5767
          if (sres < ulp && (!spec_case || 2*sres < ulp)) {
5768
            sres = res << (1 - eulp);
5769
            if ((j = eulp + 31) > 0)
5770
              sres += (rblo + reslo) >> j;
5771
            else
5772
              sres += (rblo + reslo) << -j;
5773
            if (sres + (rb << (1 - eulp)) >= ulp)
5774
              goto Fast_failed1;
5775
            if (sres >= ulp)
5776
              goto more96;
5777
            if (ures < res
5778
            || (ures == res && ureslo < reslo)) {
5779
              if (ures + rb >= res - rb)
5780
                goto Fast_failed1;
5781
              goto Roundup;
5782
              }
5783
            if (ures - rb <= res + rb)
5784
              goto Fast_failed1;
5785
            goto retc;
5786
            }
5787
          }
5788
        if (!(zb & ures) && (ures-rb) << (1 - eulp) < ulp) {
5789
          if ((ures + rb) << (1 - eulp) < ulp)
5790
            goto Roundup;
5791
          goto Fast_failed1;
5792
          }
5793
        }
5794
      }
5795
    else if (i == ilim) {
5796
      ures = 0x1000000000000000ull - res;
5797
      sres = ureslo = 0;
5798
      if (reslo) {
5799
        ureslo = 0x100000000ull - reslo;
5800
        --ures;
5801
        sres = (reslo + rblo) >> 31;
5802
        }
5803
      sres += 2*rb;
5804
      if (ures <= res) {
5805
        if (ures <=sres || res - ures <= sres)
5806
          goto Fast_failed1;
5807
#ifdef Honor_FLT_ROUNDS
5808
        if (Rounding == 0)
5809
          goto retc;
5810
#endif
5811
        goto Roundup;
5812
        }
5813
      if (res <= sres || ures - res <= sres)
5814
        goto Fast_failed1;
5815
#ifdef Honor_FLT_ROUNDS
5816
      if (Rounding == 2)
5817
        goto Roundup;
5818
#endif
5819
      goto retc;
5820
      }
5821
 more96:
5822
    rblo *= 10;
5823
    rb = 10*rb + (rblo >> 32);
5824
    rblo &= 0xffffffffull;
5825
    if (rb >= 0x1000000000000000ull)
5826
      goto Fast_failed1;
5827
    reslo *= 10;
5828
    res = 10*res + (reslo >> 32);
5829
    reslo &= 0xffffffffull;
5830
    ulp *= 5;
5831
    if (ulp & 0x8000000000000000ull) {
5832
      eulp += 4;
5833
      ulp >>= 3;
5834
      }
5835
    else {
5836
      eulp += 3;
5837
      ulp >>= 2;
5838
      }
5839
    }
5840
 Fast_failed1:
5841
  Debug(++dtoa_stats[6]);
5842
  S = mhi = mlo = 0;
5843
#ifdef USE_BF96
5844
  b = d2b(&u, &be, &bbits MTb);
5845
#endif
5846
  s = buf;
5847
  i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
5848
  i -= Bias;
5849
  if (ulpadj)
5850
    i -= ulpadj - 1;
5851
  j = bbits - i - 1;
5852
  if (j >= 0) {
5853
    b2 = 0;
5854
    s2 = j;
5855
    }
5856
  else {
5857
    b2 = -j;
5858
    s2 = 0;
5859
    }
5860
  if (k >= 0) {
5861
    b5 = 0;
5862
    s5 = k;
5863
    s2 += k;
5864
    }
5865
  else {
5866
    b2 -= k;
5867
    b5 = -k;
5868
    s5 = 0;
5869
    }
5870
#endif /*}*/
5871
5872
#ifdef Honor_FLT_ROUNDS
5873
  if (mode > 1 && Rounding != 1)
5874
    leftright = 0;
5875
#endif
5876
5877
11.9M
#ifndef USE_BF96 /*{*/
5878
11.9M
  if (ilim >= 0 && ilim <= Quick_max && try_quick) {
5879
5880
    /* Try to get by with floating-point arithmetic. */
5881
5882
532k
    i = 0;
5883
532k
    dval(&d2) = dval(&u);
5884
532k
    j1 = -(k0 = k);
5885
532k
    ilim0 = ilim;
5886
532k
    ieps = 2; /* conservative */
5887
532k
    if (k > 0) {
5888
297k
      ds = tens[k&0xf];
5889
297k
      j = k >> 4;
5890
297k
      if (j & Bletch) {
5891
        /* prevent overflows */
5892
115k
        j &= Bletch - 1;
5893
115k
        dval(&u) /= bigtens[n_bigtens-1];
5894
115k
        ieps++;
5895
115k
        }
5896
581k
      for(; j; j >>= 1, i++)
5897
283k
        if (j & 1) {
5898
191k
          ieps++;
5899
191k
          ds *= bigtens[i];
5900
191k
          }
5901
297k
      dval(&u) /= ds;
5902
297k
      }
5903
235k
    else if (j1 > 0) {
5904
160k
      dval(&u) *= tens[j1 & 0xf];
5905
324k
      for(j = j1 >> 4; j; j >>= 1, i++)
5906
164k
        if (j & 1) {
5907
123k
          ieps++;
5908
123k
          dval(&u) *= bigtens[i];
5909
123k
          }
5910
160k
      }
5911
532k
    if (k_check && dval(&u) < 1. && ilim > 0) {
5912
711
      if (ilim1 <= 0)
5913
1
        goto fast_failed;
5914
710
      ilim = ilim1;
5915
710
      k--;
5916
710
      dval(&u) *= 10.;
5917
710
      ieps++;
5918
710
      }
5919
532k
    dval(&eps) = ieps*dval(&u) + 7.;
5920
532k
    word0(&eps) -= (P-1)*Exp_msk1;
5921
532k
    if (ilim == 0) {
5922
4.03k
      S = mhi = 0;
5923
4.03k
      dval(&u) -= 5.;
5924
4.03k
      if (dval(&u) > dval(&eps))
5925
1.53k
        goto one_digit;
5926
2.50k
      if (dval(&u) < -dval(&eps))
5927
2.49k
        goto no_digits;
5928
3
      goto fast_failed;
5929
2.50k
      }
5930
528k
#ifndef No_leftright
5931
528k
    if (leftright) {
5932
      /* Use Steele & White method of only
5933
       * generating digits needed.
5934
       */
5935
0
      dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
5936
0
#ifdef IEEE_Arith
5937
0
      if (j1 >= 307) {
5938
0
        eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */
5939
0
        word0(&eps1) -= Exp_msk1 * (Bias+P-1);
5940
0
        dval(&eps1) *= tens[j1 & 0xf];
5941
0
        for(i = 0, j = (j1-256) >> 4; j; j >>= 1, i++)
5942
0
          if (j & 1)
5943
0
            dval(&eps1) *= bigtens[i];
5944
0
        if (eps.d < eps1.d)
5945
0
          eps.d = eps1.d;
5946
0
        if (10. - u.d < 10.*eps.d && eps.d < 1.) {
5947
          /* eps.d < 1. excludes trouble with the tiniest denormal */
5948
0
          *s++ = '1';
5949
0
          ++k;
5950
0
          goto ret1;
5951
0
          }
5952
0
        }
5953
0
#endif
5954
0
      for(i = 0;;) {
5955
0
        L = (int)dval(&u);
5956
0
        dval(&u) -= L;
5957
0
        *s++ = '0' + (int)L;
5958
0
        if (1. - dval(&u) < dval(&eps))
5959
0
          goto bump_up;
5960
0
        if (dval(&u) < dval(&eps))
5961
0
          goto retc;
5962
0
        if (++i >= ilim)
5963
0
          break;
5964
0
        dval(&eps) *= 10.;
5965
0
        dval(&u) *= 10.;
5966
0
        }
5967
0
      }
5968
528k
    else {
5969
528k
#endif
5970
      /* Generate ilim digits, then fix them up. */
5971
528k
      dval(&eps) *= tens[ilim-1];
5972
1.38M
      for(i = 1;; i++, dval(&u) *= 10.) {
5973
1.38M
        L = (Long)(dval(&u));
5974
1.38M
        if (!(dval(&u) -= L))
5975
42.5k
          ilim = i;
5976
1.38M
        *s++ = '0' + (int)L;
5977
1.38M
        if (i == ilim) {
5978
528k
          if (dval(&u) > 0.5 + dval(&eps))
5979
241k
            goto bump_up;
5980
287k
          else if (dval(&u) < 0.5 - dval(&eps))
5981
244k
            goto retc;
5982
42.3k
          break;
5983
528k
          }
5984
1.38M
        }
5985
528k
#ifndef No_leftright
5986
528k
      }
5987
42.3k
#endif
5988
42.3k
 fast_failed:
5989
42.3k
    s = buf;
5990
42.3k
    dval(&u) = dval(&d2);
5991
42.3k
    k = k0;
5992
42.3k
    ilim = ilim0;
5993
42.3k
    }
5994
5995
  /* Do we have a "small" integer? */
5996
5997
11.4M
  if (be >= 0 && k <= Int_max) {
5998
    /* Yes. */
5999
8.65M
    ds = tens[k];
6000
8.65M
    if (ndigits < 0 && ilim <= 0) {
6001
0
      S = mhi = 0;
6002
0
      if (ilim < 0 || dval(&u) <= 5*ds)
6003
0
        goto no_digits;
6004
0
      goto one_digit;
6005
0
      }
6006
24.3M
    for(i = 1;; i++, dval(&u) *= 10.) {
6007
24.3M
      L = (Long)(dval(&u) / ds);
6008
24.3M
      dval(&u) -= L*ds;
6009
#ifdef Check_FLT_ROUNDS
6010
      /* If FLT_ROUNDS == 2, L will usually be high by 1 */
6011
      if (dval(&u) < 0) {
6012
        L--;
6013
        dval(&u) += ds;
6014
        }
6015
#endif
6016
24.3M
      *s++ = '0' + (int)L;
6017
24.3M
      if (!dval(&u)) {
6018
#ifdef SET_INEXACT
6019
        inexact = 0;
6020
#endif
6021
8.64M
        break;
6022
8.64M
        }
6023
15.6M
      if (i == ilim) {
6024
#ifdef Honor_FLT_ROUNDS
6025
        if (mode > 1)
6026
        switch(Rounding) {
6027
          case 0: goto retc;
6028
          case 2: goto bump_up;
6029
          }
6030
#endif
6031
4.19k
        dval(&u) += dval(&u);
6032
4.19k
#ifdef ROUND_BIASED
6033
4.19k
        if (dval(&u) >= ds)
6034
#else
6035
        if (dval(&u) > ds || (dval(&u) == ds && L & 1))
6036
#endif
6037
4.19k
          {
6038
245k
 bump_up:
6039
266k
          while(*--s == '9')
6040
21.2k
            if (s == buf) {
6041
360
              k++;
6042
360
              *s = '0';
6043
360
              break;
6044
360
              }
6045
245k
          ++*s++;
6046
245k
          }
6047
245k
        break;
6048
4.19k
        }
6049
15.6M
      }
6050
8.89M
    goto retc;
6051
8.65M
    }
6052
6053
2.79M
#endif /*}*/
6054
2.79M
  m2 = b2;
6055
2.79M
  m5 = b5;
6056
2.79M
  mhi = mlo = 0;
6057
2.79M
  if (leftright) {
6058
2.75M
    i =
6059
2.75M
#ifndef Sudden_Underflow
6060
2.75M
      denorm ? be + (Bias + (P-1) - 1 + 1) :
6061
2.75M
#endif
6062
#ifdef IBM
6063
      1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
6064
#else
6065
2.75M
      1 + P - bbits;
6066
2.75M
#endif
6067
2.75M
    b2 += i;
6068
2.75M
    s2 += i;
6069
2.75M
    mhi = i2b(1 MTb);
6070
2.75M
    }
6071
2.79M
  if (m2 > 0 && s2 > 0) {
6072
1.85M
    i = m2 < s2 ? m2 : s2;
6073
1.85M
    b2 -= i;
6074
1.85M
    m2 -= i;
6075
1.85M
    s2 -= i;
6076
1.85M
    }
6077
2.79M
  if (b5 > 0) {
6078
351k
    if (leftright) {
6079
347k
      if (m5 > 0) {
6080
347k
        mhi = pow5mult(mhi, m5 MTb);
6081
347k
        b1 = mult(mhi, b MTb);
6082
347k
        Bfree(b MTb);
6083
347k
        b = b1;
6084
347k
        }
6085
347k
      if ((j = b5 - m5))
6086
0
        b = pow5mult(b, j MTb);
6087
347k
      }
6088
3.82k
    else
6089
3.82k
      b = pow5mult(b, b5 MTb);
6090
351k
    }
6091
2.79M
  S = i2b(1 MTb);
6092
2.79M
  if (s5 > 0)
6093
2.32M
    S = pow5mult(S, s5 MTb);
6094
6095
2.79M
  if (spec_case) {
6096
561k
    b2 += Log2P;
6097
561k
    s2 += Log2P;
6098
561k
    }
6099
6100
  /* Arrange for convenient computation of quotients:
6101
   * shift left if necessary so divisor has 4 leading 0 bits.
6102
   *
6103
   * Perhaps we should just compute leading 28 bits of S once
6104
   * and for all and pass them and a shift to quorem, so it
6105
   * can do shifts and ors to compute the numerator for q.
6106
   */
6107
2.79M
  i = dshift(S, s2);
6108
2.79M
  b2 += i;
6109
2.79M
  m2 += i;
6110
2.79M
  s2 += i;
6111
2.79M
  if (b2 > 0)
6112
2.79M
    b = lshift(b, b2 MTb);
6113
2.79M
  if (s2 > 0)
6114
2.78M
    S = lshift(S, s2 MTb);
6115
2.79M
#ifndef USE_BF96
6116
2.79M
  if (k_check) {
6117
1.33M
    if (cmp(b,S) < 0) {
6118
60.0k
      k--;
6119
60.0k
      b = multadd(b, 10, 0 MTb);  /* we botched the k estimate */
6120
60.0k
      if (leftright)
6121
59.7k
        mhi = multadd(mhi, 10, 0 MTb);
6122
60.0k
      ilim = ilim1;
6123
60.0k
      }
6124
1.33M
    }
6125
2.79M
#endif
6126
2.79M
  if (ilim <= 0 && (mode == 3 || mode == 5)) {
6127
1.47k
    if (ilim < 0 || cmp(b,S = multadd(S,5,0 MTb)) <= 0) {
6128
      /* no digits, fcvt style */
6129
3.96k
 no_digits:
6130
3.96k
      k = -1 - ndigits;
6131
3.96k
      goto ret;
6132
1.47k
      }
6133
1.53k
 one_digit:
6134
1.53k
    *s++ = '1';
6135
1.53k
    ++k;
6136
1.53k
    goto ret;
6137
1.47k
    }
6138
2.79M
  if (leftright) {
6139
2.75M
    if (m2 > 0)
6140
2.74M
      mhi = lshift(mhi, m2 MTb);
6141
6142
    /* Compute mlo -- check for special case
6143
     * that d is a normalized power of 2.
6144
     */
6145
6146
2.75M
    mlo = mhi;
6147
2.75M
    if (spec_case) {
6148
561k
      mhi = Balloc(mhi->k MTb);
6149
561k
      Bcopy(mhi, mlo);
6150
561k
      mhi = lshift(mhi, Log2P MTb);
6151
561k
      }
6152
6153
41.0M
    for(i = 1;;i++) {
6154
41.0M
      dig = quorem(b,S) + '0';
6155
      /* Do we yet have the shortest decimal string
6156
       * that will round to d?
6157
       */
6158
41.0M
      j = cmp(b, mlo);
6159
41.0M
      delta = diff(S, mhi MTb);
6160
41.0M
      j1 = delta->sign ? 1 : cmp(b, delta);
6161
41.0M
      Bfree(delta MTb);
6162
#ifndef ROUND_BIASED
6163
      if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
6164
#ifdef Honor_FLT_ROUNDS
6165
        && (mode <= 1 || Rounding >= 1)
6166
#endif
6167
                   ) {
6168
        if (dig == '9')
6169
          goto round_9_up;
6170
        if (j > 0)
6171
          dig++;
6172
#ifdef SET_INEXACT
6173
        else if (!b->x[0] && b->wds <= 1)
6174
          inexact = 0;
6175
#endif
6176
        *s++ = dig;
6177
        goto ret;
6178
        }
6179
#endif
6180
41.0M
      if (j < 0 || (j == 0 && mode != 1
6181
#ifndef ROUND_BIASED
6182
              && !(word1(&u) & 1)
6183
#endif
6184
39.1M
          )) {
6185
1.90M
        if (!b->x[0] && b->wds <= 1) {
6186
#ifdef SET_INEXACT
6187
          inexact = 0;
6188
#endif
6189
401k
          goto accept_dig;
6190
401k
          }
6191
#ifdef Honor_FLT_ROUNDS
6192
        if (mode > 1)
6193
         switch(Rounding) {
6194
          case 0: goto accept_dig;
6195
          case 2: goto keep_dig;
6196
          }
6197
#endif /*Honor_FLT_ROUNDS*/
6198
1.50M
        if (j1 > 0) {
6199
824k
          b = lshift(b, 1 MTb);
6200
824k
          j1 = cmp(b, S);
6201
824k
#ifdef ROUND_BIASED
6202
824k
          if (j1 >= 0 /*)*/
6203
#else
6204
          if ((j1 > 0 || (j1 == 0 && dig & 1))
6205
#endif
6206
357k
          && dig++ == '9')
6207
24
            goto round_9_up;
6208
824k
          }
6209
1.90M
 accept_dig:
6210
1.90M
        *s++ = dig;
6211
1.90M
        goto ret;
6212
1.50M
        }
6213
39.1M
      if (j1 > 0) {
6214
#ifdef Honor_FLT_ROUNDS
6215
        if (!Rounding && mode > 1)
6216
          goto accept_dig;
6217
#endif
6218
846k
        if (dig == '9') { /* possible if i == 1 */
6219
23.8k
 round_9_up:
6220
23.8k
          *s++ = '9';
6221
23.8k
          goto roundoff;
6222
23.8k
          }
6223
822k
        *s++ = dig + 1;
6224
822k
        goto ret;
6225
846k
        }
6226
#ifdef Honor_FLT_ROUNDS
6227
 keep_dig:
6228
#endif
6229
38.2M
      *s++ = dig;
6230
38.2M
      if (i == ilim)
6231
0
        break;
6232
38.2M
      b = multadd(b, 10, 0 MTb);
6233
38.2M
      if (mlo == mhi)
6234
29.7M
        mlo = mhi = multadd(mhi, 10, 0 MTb);
6235
8.57M
      else {
6236
8.57M
        mlo = multadd(mlo, 10, 0 MTb);
6237
8.57M
        mhi = multadd(mhi, 10, 0 MTb);
6238
8.57M
        }
6239
38.2M
      }
6240
2.75M
    }
6241
40.9k
  else
6242
191k
    for(i = 1;; i++) {
6243
191k
      dig = quorem(b,S) + '0';
6244
191k
      *s++ = dig;
6245
191k
      if (!b->x[0] && b->wds <= 1) {
6246
#ifdef SET_INEXACT
6247
        inexact = 0;
6248
#endif
6249
625
        goto ret;
6250
625
        }
6251
190k
      if (i >= ilim)
6252
40.2k
        break;
6253
150k
      b = multadd(b, 10, 0 MTb);
6254
150k
      }
6255
6256
  /* Round off last digit */
6257
6258
#ifdef Honor_FLT_ROUNDS
6259
  if (mode > 1)
6260
    switch(Rounding) {
6261
      case 0: goto ret;
6262
      case 2: goto roundoff;
6263
      }
6264
#endif
6265
40.2k
  b = lshift(b, 1 MTb);
6266
40.2k
  j = cmp(b, S);
6267
40.2k
#ifdef ROUND_BIASED
6268
40.2k
  if (j >= 0)
6269
#else
6270
  if (j > 0 || (j == 0 && dig & 1))
6271
#endif
6272
735
    {
6273
24.6k
 roundoff:
6274
25.1k
    while(*--s == '9')
6275
24.4k
      if (s == buf) {
6276
23.8k
        k++;
6277
23.8k
        *s++ = '1';
6278
23.8k
        goto ret;
6279
23.8k
        }
6280
735
    ++*s++;
6281
735
    }
6282
2.80M
 ret:
6283
2.80M
  Bfree(S MTb);
6284
2.80M
  if (mhi) {
6285
2.75M
    if (mlo && mlo != mhi)
6286
561k
      Bfree(mlo MTb);
6287
2.75M
    Bfree(mhi MTb);
6288
2.75M
    }
6289
11.9M
 retc:
6290
11.9M
  while(s > buf && s[-1] == '0')
6291
21.8k
    --s;
6292
11.9M
 ret1:
6293
11.9M
  if (b)
6294
11.9M
    Bfree(b MTb);
6295
11.9M
  *s = 0;
6296
11.9M
  *decpt = k + 1;
6297
11.9M
  if (rve)
6298
11.9M
    *rve = s;
6299
#ifdef SET_INEXACT
6300
  if (inexact) {
6301
    if (!oldinexact) {
6302
      word0(&u) = Exp_1 + (70 << Exp_shift);
6303
      word1(&u) = 0;
6304
      dval(&u) += 1.;
6305
      }
6306
    }
6307
  else if (!oldinexact)
6308
    clear_inexact();
6309
#endif
6310
11.9M
  return buf;
6311
11.9M
  }
6312
6313
 char *
6314
fx_dtoa(double dd, int mode, int ndigits, int *decpt, int *sign, char **rve __XS__d)
6315
14.5M
{
6316
  /*  Sufficient space is allocated to the return value
6317
    to hold the suppressed trailing zeros.
6318
    See dtoa_r() above for details on the other arguments.
6319
  */
6320
14.5M
#ifndef MULTIPLE_THREADS
6321
#ifndef __XS__
6322
  if (dtoa_result)
6323
    freedtoa(dtoa_result __XS__a);
6324
#endif
6325
14.5M
#endif
6326
14.5M
  return dtoa_r(dd, mode, ndigits, decpt, sign, rve, 0, 0 __XS__a);
6327
14.5M
  }
6328
6329
#ifdef __cplusplus
6330
}
6331
#endif
6332
6333
static void fxDTOACleanup(txMachine* the, ThInfo* DTOA);
6334
static void fxDTOASetup(txMachine* the, ThInfo* DTOA);
6335
6336
void fxDTOACleanup(txMachine* the, ThInfo* DTOA)
6337
40.9M
{
6338
40.9M
#if mxUseChunkHeap
6339
40.9M
  if (DTOA->dirty)
6340
4.48M
#endif
6341
4.48M
  {
6342
4.48M
    Bigint* b;
6343
4.48M
    int i, c = Kmax +1 ;
6344
40.3M
    for (i = 0; i < c; i++) {
6345
35.8M
      b = DTOA->Freelist[i];
6346
51.6M
      while(b) {
6347
15.7M
        Bigint* next = b->next;
6348
15.7M
        fxDTOAFree(b, DTOA);
6349
15.7M
        b = next;
6350
15.7M
      }
6351
35.8M
    }
6352
6353
4.48M
    b = DTOA->P5s;
6354
8.85M
    while(b) {
6355
4.37M
      Bigint* next = b->next;
6356
4.37M
      fxDTOAFree(b, DTOA);
6357
4.37M
      b = next;
6358
4.37M
    }
6359
4.48M
  }
6360
40.9M
}
6361
6362
static void* fxDTOAMalloc(size_t size, void* it)
6363
76.5M
{
6364
76.5M
  ThInfo* DTOA = it;
6365
76.5M
  txMachine* the = DTOA->the;
6366
76.5M
  void* block = C_NULL;
6367
76.5M
#if mxUseChunkHeap
6368
76.5M
  if (the) {
6369
76.5M
    if ((DTOA->current + size) <= (txByte*)(the->firstBlock->limit)) {
6370
56.4M
      block = DTOA->current;
6371
56.4M
      DTOA->current += size;
6372
56.4M
      return block;
6373
56.4M
    }
6374
76.5M
  }
6375
20.1M
  DTOA->dirty = 1;
6376
20.1M
#endif
6377
20.1M
  block = c_malloc(size);
6378
20.1M
  if (!block)
6379
0
    fxAbort(the, XS_NOT_ENOUGH_MEMORY_EXIT);
6380
  //fprintf(stderr, "malloc %zu %p\n", size, block);
6381
20.1M
  return block;
6382
76.5M
}
6383
6384
static void fxDTOAFree(void* block, void* it)
6385
20.1M
{
6386
  //fprintf(stderr, "free %p\n", block);
6387
20.1M
#if mxUseChunkHeap
6388
20.1M
  ThInfo* DTOA = it;
6389
20.1M
  txMachine* the = DTOA->the;
6390
20.1M
    if (the) {
6391
20.1M
        if (((txByte*)(the->firstBlock->current) <= (txByte*)block) && ((txByte*)block < DTOA->current))
6392
28.4k
          return;
6393
20.1M
    }
6394
20.1M
#endif
6395
20.1M
  c_free(block);
6396
20.1M
}
6397
6398
void fxDTOASetup(txMachine* the, ThInfo* DTOA)
6399
40.9M
{
6400
40.9M
  c_memset(DTOA, 0, sizeof(ThInfo));
6401
40.9M
  if (the) {
6402
40.9M
    DTOA->the = the;
6403
40.9M
#if mxUseChunkHeap
6404
  #if 0
6405
    if ((txByte*)(the->firstBlock->limit) - (txByte*)(the->firstBlock->current) > 192)
6406
      DTOA->current = (txByte*)(the->firstBlock->limit) - 192;
6407
    else
6408
  #endif
6409
40.9M
      DTOA->current = (txByte*)(the->firstBlock->current);
6410
40.9M
#endif
6411
40.9M
  }
6412
40.9M
}
6413
6414
txString fxIntegerToString(void* the, txInteger theValue, txString theBuffer, txSize theSize)
6415
36.1M
{
6416
36.1M
  c_snprintf(theBuffer, theSize, "%d", (int)theValue);
6417
36.1M
  return theBuffer;
6418
36.1M
}
6419
6420
txInteger fxNumberToInteger(txNumber theValue)
6421
7.97M
{
6422
#if defined(pebble)
6423
  if (c_fpclassify(theValue) == C_FP_NORMAL) { 
6424
    #define MODULO 4294967296.0
6425
    txNumber aNumber = c_fmod(c_trunc(theValue), MODULO);
6426
    if (aNumber >= MODULO / 2)
6427
      aNumber -= MODULO;
6428
    else if (aNumber < -MODULO / 2)
6429
      aNumber += MODULO;
6430
    return (txInteger)aNumber;
6431
  }
6432
  return 0;
6433
#else
6434
7.97M
  int lb = c_ilogb(theValue);
6435
7.97M
  if ((C_FP_ILOGB0 == lb) || (C_FP_ILOGBNAN == lb))
6436
2.08M
    return 0;
6437
6438
5.89M
  if (lb < 31)
6439
3.35M
    return (txInteger)theValue;
6440
6441
2.54M
  if (C_INT_MAX == lb) 
6442
524k
    return 0;
6443
6444
2.01M
  theValue = c_trunc(theValue);
6445
6.22M
  #define MODULO 4294967296.0
6446
2.01M
  theValue = c_fmod(theValue, MODULO);
6447
2.01M
  if (theValue >= MODULO / 2)
6448
1.12M
    theValue -= MODULO;
6449
891k
  else if (theValue < -MODULO / 2)
6450
172k
    theValue += MODULO;
6451
6452
2.01M
  return (txInteger)theValue;
6453
2.54M
#endif
6454
2.54M
}
6455
6456
txString fxNumberToString(void* the, txNumber theValue, txString theBuffer, txSize theSize, txByte theMode, txInteger thePrecision)
6457
14.5M
{
6458
14.5M
  ThInfo DTOA;
6459
14.5M
  char* base = C_NULL;
6460
14.5M
  int mode, precision, decpt, sign, count, exponent, pad;
6461
14.5M
  char* start;
6462
14.5M
  char* stop;
6463
14.5M
  char* result;
6464
6465
14.5M
  fxDTOASetup(the, &DTOA);
6466
14.5M
  switch (theMode) {
6467
138
  case 'e':
6468
138
    if (thePrecision > 0) {
6469
114
      mode = 2;
6470
114
      precision = thePrecision;
6471
114
    }
6472
24
    else {
6473
24
      mode = 0;
6474
24
      precision = 0;
6475
24
    }
6476
138
    break;
6477
253k
  case 'f':
6478
253k
    mode = 3;
6479
253k
    precision = thePrecision;
6480
253k
    break;
6481
528k
  case 'g':
6482
528k
    mode = 2;
6483
528k
    precision = thePrecision;
6484
528k
    break;
6485
13.7M
  default:
6486
13.7M
    mode = 0;
6487
13.7M
    precision = 0;
6488
13.7M
    break;
6489
14.5M
  }
6490
14.5M
  base = start = fx_dtoa(theValue, mode, precision, &decpt, &sign, &stop, &DTOA);
6491
14.5M
  count = mxPtrDiff(stop - start);
6492
14.5M
  result = theBuffer;
6493
14.5M
  theSize--; // C string
6494
14.5M
  if (sign && theValue) {
6495
1.48M
    *result++ = '-';
6496
1.48M
    theSize--;
6497
1.48M
  }
6498
14.5M
    if (decpt != 9999) {
6499
12.6M
    switch (theMode) {
6500
138
    case 'e':
6501
138
      exponent = 1;
6502
138
      if (thePrecision > 0)
6503
114
        pad = thePrecision;
6504
24
      else
6505
24
        pad = count;
6506
138
      break;
6507
113k
    case 'f':
6508
113k
      exponent = 0;
6509
113k
      pad = thePrecision;
6510
113k
      break;
6511
528k
    case 'g':
6512
528k
      if ((decpt < -5) || (thePrecision < decpt)) {
6513
327k
        exponent = 1;
6514
327k
        pad = thePrecision; 
6515
327k
      }
6516
200k
      else {
6517
200k
        exponent = 0;
6518
200k
                pad = thePrecision - count - decpt + 1;
6519
200k
      }
6520
528k
      break;
6521
11.9M
    default:
6522
11.9M
      if ((decpt < -5) || (21 < decpt)) {
6523
1.24M
        exponent = 1;
6524
1.24M
        pad = count;  
6525
1.24M
      }
6526
10.7M
      else {
6527
10.7M
        exponent = 0;
6528
10.7M
        pad = 0;  
6529
10.7M
      }
6530
11.9M
      break;
6531
12.6M
    }
6532
12.6M
    if (exponent) {
6533
1.57M
      theSize -= 5 - pad;
6534
1.57M
      if (theSize < 0) goto error;
6535
1.57M
      *result++ = *start++;
6536
1.57M
      pad--;
6537
1.57M
      if (pad > 0) {
6538
1.53M
        *result++ = '.';
6539
19.9M
        while ((start < stop) && (pad > 0)) {
6540
18.4M
          *result++ = *start++;
6541
18.4M
          pad--;
6542
18.4M
        }
6543
1.55M
        while  (pad > 0) {
6544
25.6k
          *result++ = '0';
6545
25.6k
          pad--;
6546
25.6k
        }
6547
1.53M
      }
6548
1.57M
      *result++ = 'e';
6549
1.57M
      decpt--;
6550
1.57M
      if (decpt < 0) {
6551
318k
        *result++ = '-';
6552
318k
        decpt = 0 - decpt;
6553
318k
      }
6554
1.25M
      else
6555
1.25M
        *result++ = '+';
6556
1.57M
      pad = 1000;
6557
4.29M
      while (pad > 1) {
6558
4.15M
        if (decpt >= pad) 
6559
1.43M
          break;
6560
2.72M
        pad /= 10;
6561
2.72M
      }
6562
5.14M
      while (pad) {
6563
3.57M
        *result++ = '0' + (decpt / pad);
6564
3.57M
        decpt %= pad;
6565
3.57M
        pad /= 10;
6566
3.57M
      }
6567
1.57M
    }
6568
11.0M
    else if (decpt <= 0) {
6569
191k
      theSize -= 2 - decpt + (mxPtrDiff(stop - start));
6570
191k
      if (theSize < 0) goto error;
6571
191k
      *result++ = '0';
6572
191k
      if ((decpt < 0) || (start < stop) || (pad > 0))
6573
187k
        *result++ = '.';
6574
503k
      while (decpt < 0) {
6575
311k
        *result++ = '0';
6576
311k
        decpt++;
6577
311k
        pad--;
6578
311k
      }
6579
1.04M
      while (start < stop) {
6580
854k
        *result++ = *start++;
6581
854k
        pad--;
6582
854k
      }
6583
191k
      if (pad > 0) {
6584
3.23k
        theSize -= pad;
6585
3.23k
        if (theSize < 0) goto error;
6586
12.7k
        while (pad > 0) {
6587
9.54k
          *result++ = '0';
6588
9.54k
          pad--;
6589
9.54k
        }
6590
3.23k
      }
6591
191k
    }
6592
10.8M
    else if (decpt < count) {
6593
921k
      theSize -= decpt + 1 + (mxPtrDiff(stop - start));
6594
921k
      if (theSize < 0) goto error;
6595
7.33M
      while (decpt > 0) {
6596
6.41M
        *result++ = *start++;
6597
6.41M
        decpt--;
6598
6.41M
      }
6599
921k
      *result++ = '.';
6600
7.14M
      while (start < stop) {
6601
6.22M
        *result++ = *start++;
6602
6.22M
        pad--;
6603
6.22M
      }
6604
921k
      if (pad > 0) {
6605
104
        theSize -= pad;
6606
104
        if (theSize < 0) goto error;
6607
1.93k
        while (pad > 0) {
6608
1.83k
          *result++ = '0';
6609
1.83k
          pad--;
6610
1.83k
        }
6611
104
      }
6612
921k
    }
6613
9.92M
    else {
6614
9.92M
      theSize -= (mxPtrDiff(stop - start));
6615
9.92M
      if (theSize < 0) goto error;
6616
43.8M
      while (start < stop) {
6617
33.9M
        *result++ = *start++;
6618
33.9M
        decpt--;
6619
33.9M
      }
6620
9.92M
            theSize -= decpt;
6621
9.92M
            if (theSize < 0) goto error;
6622
11.4M
      while (decpt > 0) {
6623
1.53M
        *result++ = '0';
6624
1.53M
        decpt--;
6625
1.53M
      }
6626
9.92M
      if (pad > 0) {
6627
150k
        theSize -= 1 + pad;
6628
150k
        if (theSize < 0) goto error;
6629
150k
        *result++ = '.';
6630
314k
        while (pad > 0) {
6631
164k
          *result++ = '0';
6632
164k
          pad--;
6633
164k
        }
6634
150k
      }
6635
9.92M
    }
6636
12.6M
  }
6637
1.90M
  else {
6638
1.90M
    theSize -= (mxPtrDiff(stop - start));
6639
1.90M
    if (theSize < 0) goto error;
6640
10.5M
    while (start < stop)
6641
8.65M
      *result++ = *start++;
6642
1.90M
  }
6643
14.5M
error:
6644
14.5M
  *result = 0;
6645
14.5M
  if (base)
6646
14.5M
    freedtoa(base, &DTOA);
6647
14.5M
  fxDTOACleanup(the, &DTOA);
6648
14.5M
  return theBuffer;
6649
14.5M
}
6650
6651
txNumber fxStringToNumber(void* the, txString theString, txFlag whole)
6652
26.9M
{
6653
26.9M
  txNumber result = whole ? 0 : NAN;
6654
26.9M
  txString p = fxSkipSpaces(theString), q;
6655
26.9M
  char c = *p;
6656
26.9M
  if (c) {
6657
26.4M
    txU4 d = *(p + 1);
6658
26.4M
    if (whole && (c == '0') && ((d == 'B') || (d == 'b') || (d == 'O') || (d == 'o') || (d == 'X') || (d == 'x'))) {
6659
39.5k
      p += 2;
6660
39.5k
            q = p;
6661
39.5k
      if ((d == 'B') || (d == 'b')) {
6662
14.6k
        while ((c = *p)) {
6663
10.1k
          if (('0' <= c) && (c <= '1'))
6664
2.25k
            result = (result * 2) + (c - '0');
6665
7.84k
          else
6666
7.84k
            break;
6667
2.25k
          p++;
6668
2.25k
        }
6669
12.3k
      }
6670
27.1k
      else if ((d == 'O') || (d == 'o')) {
6671
7.08k
        while ((c = *p)) {
6672
6.26k
          if (('0' <= c) && (c <= '7'))
6673
1.67k
            result = (result * 8) + (c - '0');
6674
4.59k
          else
6675
4.59k
            break;
6676
1.67k
          p++;
6677
1.67k
        }
6678
5.40k
      }
6679
21.7k
      else if ((d == 'X') || (d == 'x')) {
6680
32.5k
        while ((c = *p)) {
6681
30.4k
          if (('0' <= c) && (c <= '9'))
6682
6.60k
            result = (result * 16) + (c - '0');
6683
23.8k
          else if (('a' <= c) && (c <= 'f'))
6684
3.28k
            result = (result * 16) + (10 + c - 'a');
6685
20.5k
          else if (('A' <= c) && (c <= 'F'))
6686
947
            result = (result * 16) + (10 + c - 'A');
6687
19.6k
          else
6688
19.6k
            break;
6689
10.8k
          p++;
6690
10.8k
        }
6691
21.7k
      }
6692
39.5k
      if (p == q)
6693
31.6k
        result = NAN;
6694
7.87k
      else
6695
7.87k
            q = p;
6696
39.5k
    }
6697
26.4M
    else {
6698
26.4M
      ThInfo DTOA;
6699
26.4M
      fxDTOASetup(the, &DTOA);
6700
26.4M
      result = strtod2(p, &q, &DTOA);
6701
26.4M
      fxDTOACleanup(the, &DTOA);
6702
26.4M
      if ((p == q) && !whole)
6703
247
        result = NAN;
6704
26.4M
    }
6705
26.4M
    if (whole) {
6706
16.5M
      p = fxSkipSpaces(q);
6707
16.5M
      if (*p)
6708
7.12M
        result = NAN;
6709
16.5M
    }
6710
26.4M
  }
6711
26.9M
  return result;
6712
26.9M
}