Backed out changeset b71c8c052463 (bug 1943846) for causing mass failures. CLOSED...
[gecko.git] / nsprpub / pr / src / misc / dtoa.c
blob2ec38d688c48607a663e85bd2e2ce0e58a74fcfc
1 /****************************************************************
3 * The author of this software is David M. Gay.
5 * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose without fee is hereby granted, provided that this entire notice
9 * is included in all copies of any software which is or includes a copy
10 * or modification of this software and in all copies of the supporting
11 * documentation for such software.
13 * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
14 * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
15 * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
16 * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
18 ***************************************************************/
20 /* Please send bug reports to David M. Gay (dmg at acm dot org,
21 * with " at " changed at "@" and " dot " changed to "."). */
23 /* On a machine with IEEE extended-precision registers, it is
24 * necessary to specify double-precision (53-bit) rounding precision
25 * before invoking strtod or dtoa. If the machine uses (the equivalent
26 * of) Intel 80x87 arithmetic, the call
27 * _control87(PC_53, MCW_PC);
28 * does this with many compilers. Whether this or another call is
29 * appropriate depends on the compiler; for this to work, it may be
30 * necessary to #include "float.h" or another system-dependent header
31 * file.
34 /* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
36 * This strtod returns a nearest machine number to the input decimal
37 * string (or sets errno to ERANGE). With IEEE arithmetic, ties are
38 * broken by the IEEE round-even rule. Otherwise ties are broken by
39 * biased rounding (add half and chop).
41 * Inspired loosely by William D. Clinger's paper "How to Read Floating
42 * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
44 * Modifications:
46 * 1. We only require IEEE, IBM, or VAX double-precision
47 * arithmetic (not IEEE double-extended).
48 * 2. We get by with floating-point arithmetic in a case that
49 * Clinger missed -- when we're computing d * 10^n
50 * for a small integer d and the integer n is not too
51 * much larger than 22 (the maximum integer k for which
52 * we can represent 10^k exactly), we may be able to
53 * compute (d*10^k) * 10^(e-k) with just one roundoff.
54 * 3. Rather than a bit-at-a-time adjustment of the binary
55 * result in the hard case, we use floating-point
56 * arithmetic to determine the adjustment to within
57 * one bit; only in really hard cases do we need to
58 * compute a second residual.
59 * 4. Because of 3., we don't need a large table of powers of 10
60 * for ten-to-e (just some small tables, e.g. of 10^k
61 * for 0 <= k <= 22).
65 * #define IEEE_8087 for IEEE-arithmetic machines where the least
66 * significant byte has the lowest address.
67 * #define IEEE_MC68k for IEEE-arithmetic machines where the most
68 * significant byte has the lowest address.
69 * #define Long int on machines with 32-bit ints and 64-bit longs.
70 * #define IBM for IBM mainframe-style floating-point arithmetic.
71 * #define VAX for VAX-style floating-point arithmetic (D_floating).
72 * #define No_leftright to omit left-right logic in fast floating-point
73 * computation of dtoa. This will cause dtoa modes 4 and 5 to be
74 * treated the same as modes 2 and 3 for some inputs.
75 * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
76 * and strtod and dtoa should round accordingly. Unless Trust_FLT_ROUNDS
77 * is also #defined, fegetround() will be queried for the rounding mode.
78 * Note that both FLT_ROUNDS and fegetround() are specified by the C99
79 * standard (and are specified to be consistent, with fesetround()
80 * affecting the value of FLT_ROUNDS), but that some (Linux) systems
81 * do not work correctly in this regard, so using fegetround() is more
82 * portable than using FLT_ROUNDS directly.
83 * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
84 * and Honor_FLT_ROUNDS is not #defined.
85 * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
86 * that use extended-precision instructions to compute rounded
87 * products and quotients) with IBM.
88 * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic
89 * that rounds toward +Infinity.
90 * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased
91 * rounding when the underlying floating-point arithmetic uses
92 * unbiased rounding. This prevent using ordinary floating-point
93 * arithmetic when the result could be computed with one rounding error.
94 * #define Inaccurate_Divide for IEEE-format with correctly rounded
95 * products but inaccurate quotients, e.g., for Intel i860.
96 * #define NO_LONG_LONG on machines that do not have a "long long"
97 * integer type (of >= 64 bits). On such machines, you can
98 * #define Just_16 to store 16 bits per 32-bit Long when doing
99 * high-precision integer arithmetic. Whether this speeds things
100 * up or slows things down depends on the machine and the number
101 * being converted. If long long is available and the name is
102 * something other than "long long", #define Llong to be the name,
103 * and if "unsigned Llong" does not work as an unsigned version of
104 * Llong, #define #ULLong to be the corresponding unsigned type.
105 * #define KR_headers for old-style C function headers.
106 * #define Bad_float_h if your system lacks a float.h or if it does not
107 * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
108 * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
109 * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
110 * if memory is available and otherwise does something you deem
111 * appropriate. If MALLOC is undefined, malloc will be invoked
112 * directly -- and assumed always to succeed. Similarly, if you
113 * want something other than the system's free() to be called to
114 * recycle memory acquired from MALLOC, #define FREE to be the
115 * name of the alternate routine. (FREE or free is only called in
116 * pathological cases, e.g., in a dtoa call after a dtoa return in
117 * mode 3 with thousands of digits requested.)
118 * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
119 * memory allocations from a private pool of memory when possible.
120 * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes,
121 * unless #defined to be a different length. This default length
122 * suffices to get rid of MALLOC calls except for unusual cases,
123 * such as decimal-to-binary conversion of a very long string of
124 * digits. The longest string dtoa can return is about 751 bytes
125 * long. For conversions by strtod of strings of 800 digits and
126 * all dtoa conversions in single-threaded executions with 8-byte
127 * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte
128 * pointers, PRIVATE_MEM >= 7112 appears adequate.
129 * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
130 * #defined automatically on IEEE systems. On such systems,
131 * when INFNAN_CHECK is #defined, strtod checks
132 * for Infinity and NaN (case insensitively). On some systems
133 * (e.g., some HP systems), it may be necessary to #define NAN_WORD0
134 * appropriately -- to the most significant word of a quiet NaN.
135 * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
136 * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
137 * strtod also accepts (case insensitively) strings of the form
138 * NaN(x), where x is a string of hexadecimal digits and spaces;
139 * if there is only one string of hexadecimal digits, it is taken
140 * for the 52 fraction bits of the resulting NaN; if there are two
141 * or more strings of hex digits, the first is for the high 20 bits,
142 * the second and subsequent for the low 32 bits, with intervening
143 * white space ignored; but if this results in none of the 52
144 * fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0
145 * and NAN_WORD1 are used instead.
146 * #define MULTIPLE_THREADS if the system offers preemptively scheduled
147 * multiple threads. In this case, you must provide (or suitably
148 * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
149 * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed
150 * in pow5mult, ensures lazy evaluation of only one copy of high
151 * powers of 5; omitting this lock would introduce a small
152 * probability of wasting memory, but would otherwise be harmless.)
153 * You must also invoke freedtoa(s) to free the value s returned by
154 * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined.
155 * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that
156 * avoids underflows on inputs whose result does not underflow.
157 * If you #define NO_IEEE_Scale on a machine that uses IEEE-format
158 * floating-point numbers and flushes underflows to zero rather
159 * than implementing gradual underflow, then you must also #define
160 * Sudden_Underflow.
161 * #define USE_LOCALE to use the current locale's decimal_point value.
162 * #define SET_INEXACT if IEEE arithmetic is being used and extra
163 * computation should be done to set the inexact flag when the
164 * result is inexact and avoid setting inexact when the result
165 * is exact. In this case, dtoa.c must be compiled in
166 * an environment, perhaps provided by #include "dtoa.c" in a
167 * suitable wrapper, that defines two functions,
168 * int get_inexact(void);
169 * void clear_inexact(void);
170 * such that get_inexact() returns a nonzero value if the
171 * inexact bit is already set, and clear_inexact() sets the
172 * inexact bit to 0. When SET_INEXACT is #defined, strtod
173 * also does extra computations to set the underflow and overflow
174 * flags when appropriate (i.e., when the result is tiny and
175 * inexact or when it is a numeric value rounded to +-infinity).
176 * #define NO_ERRNO if strtod should not assign errno = ERANGE when
177 * the result overflows to +-Infinity or underflows to 0.
178 * #define NO_HEX_FP to omit recognition of hexadecimal floating-point
179 * values by strtod.
180 * #define NO_STRTOD_BIGCOMP (on IEEE-arithmetic systems only for now)
181 * to disable logic for "fast" testing of very long input strings
182 * to strtod. This testing proceeds by initially truncating the
183 * input string, then if necessary comparing the whole string with
184 * a decimal expansion to decide close cases. This logic is only
185 * used for input more than STRTOD_DIGLIM digits long (default 40).
188 #ifndef Long
189 # define Long long
190 #endif
191 #ifndef ULong
192 typedef unsigned Long ULong;
193 #endif
195 #ifdef DEBUG
196 # include "stdio.h"
197 # define Bug(x) \
199 fprintf(stderr, "%s\n", x); \
200 exit(1); \
202 #endif
204 #include "stdlib.h"
205 #include "string.h"
207 #ifdef USE_LOCALE
208 # include "locale.h"
209 #endif
211 #ifdef Honor_FLT_ROUNDS
212 # ifndef Trust_FLT_ROUNDS
213 # include <fenv.h>
214 # endif
215 #endif
217 #ifdef MALLOC
218 # ifdef KR_headers
219 extern char* MALLOC();
220 # else
221 extern void* MALLOC(size_t);
222 # endif
223 #else
224 # define MALLOC malloc
225 #endif
227 #ifndef Omit_Private_Memory
228 # ifndef PRIVATE_MEM
229 # define PRIVATE_MEM 2304
230 # endif
231 # define PRIVATE_mem ((PRIVATE_MEM + sizeof(double) - 1) / sizeof(double))
232 static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
233 #endif
235 #undef IEEE_Arith
236 #undef Avoid_Underflow
237 #ifdef IEEE_MC68k
238 # define IEEE_Arith
239 #endif
240 #ifdef IEEE_8087
241 # define IEEE_Arith
242 #endif
244 #ifdef IEEE_Arith
245 # ifndef NO_INFNAN_CHECK
246 # undef INFNAN_CHECK
247 # define INFNAN_CHECK
248 # endif
249 #else
250 # undef INFNAN_CHECK
251 # define NO_STRTOD_BIGCOMP
252 #endif
254 #include "errno.h"
256 #ifdef Bad_float_h
258 # ifdef IEEE_Arith
259 # define DBL_DIG 15
260 # define DBL_MAX_10_EXP 308
261 # define DBL_MAX_EXP 1024
262 # define FLT_RADIX 2
263 # endif /*IEEE_Arith*/
265 # ifdef IBM
266 # define DBL_DIG 16
267 # define DBL_MAX_10_EXP 75
268 # define DBL_MAX_EXP 63
269 # define FLT_RADIX 16
270 # define DBL_MAX 7.2370055773322621e+75
271 # endif
273 # ifdef VAX
274 # define DBL_DIG 16
275 # define DBL_MAX_10_EXP 38
276 # define DBL_MAX_EXP 127
277 # define FLT_RADIX 2
278 # define DBL_MAX 1.7014118346046923e+38
279 # endif
281 # ifndef LONG_MAX
282 # define LONG_MAX 2147483647
283 # endif
285 #else /* ifndef Bad_float_h */
286 # include "float.h"
287 #endif /* Bad_float_h */
289 #ifndef __MATH_H__
290 # include "math.h"
291 #endif
293 #ifdef __cplusplus
294 extern "C" {
295 #endif
297 #ifndef CONST
298 # ifdef KR_headers
299 # define CONST /* blank */
300 # else
301 # define CONST const
302 # endif
303 #endif
305 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
306 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
307 #endif
309 typedef union {
310 double d;
311 ULong L[2];
312 } U;
314 #ifdef IEEE_8087
315 # define word0(x) (x)->L[1]
316 # define word1(x) (x)->L[0]
317 #else
318 # define word0(x) (x)->L[0]
319 # define word1(x) (x)->L[1]
320 #endif
321 #define dval(x) (x)->d
323 #ifndef STRTOD_DIGLIM
324 # define STRTOD_DIGLIM 40
325 #endif
327 #ifdef DIGLIM_DEBUG
328 extern int strtod_diglim;
329 #else
330 # define strtod_diglim STRTOD_DIGLIM
331 #endif
333 /* The following definition of Storeinc is appropriate for MIPS processors.
334 * An alternative that might be better on some machines is
335 * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
337 #if defined(IEEE_8087) + defined(VAX)
338 # define Storeinc(a, b, c) \
339 (((unsigned short*)a)[1] = (unsigned short)b, \
340 ((unsigned short*)a)[0] = (unsigned short)c, a++)
341 #else
342 # define Storeinc(a, b, c) \
343 (((unsigned short*)a)[0] = (unsigned short)b, \
344 ((unsigned short*)a)[1] = (unsigned short)c, a++)
345 #endif
347 /* #define P DBL_MANT_DIG */
348 /* Ten_pmax = floor(P*log(2)/log(5)) */
349 /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
350 /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
351 /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
353 #ifdef IEEE_Arith
354 # define Exp_shift 20
355 # define Exp_shift1 20
356 # define Exp_msk1 0x100000
357 # define Exp_msk11 0x100000
358 # define Exp_mask 0x7ff00000
359 # define P 53
360 # define Nbits 53
361 # define Bias 1023
362 # define Emax 1023
363 # define Emin (-1022)
364 # define Exp_1 0x3ff00000
365 # define Exp_11 0x3ff00000
366 # define Ebits 11
367 # define Frac_mask 0xfffff
368 # define Frac_mask1 0xfffff
369 # define Ten_pmax 22
370 # define Bletch 0x10
371 # define Bndry_mask 0xfffff
372 # define Bndry_mask1 0xfffff
373 # define LSB 1
374 # define Sign_bit 0x80000000
375 # define Log2P 1
376 # define Tiny0 0
377 # define Tiny1 1
378 # define Quick_max 14
379 # define Int_max 14
380 # ifndef NO_IEEE_Scale
381 # define Avoid_Underflow
382 # ifdef Flush_Denorm /* debugging option */
383 # undef Sudden_Underflow
384 # endif
385 # endif
387 # ifndef Flt_Rounds
388 # ifdef FLT_ROUNDS
389 # define Flt_Rounds FLT_ROUNDS
390 # else
391 # define Flt_Rounds 1
392 # endif
393 # endif /*Flt_Rounds*/
395 # ifdef Honor_FLT_ROUNDS
396 # undef Check_FLT_ROUNDS
397 # define Check_FLT_ROUNDS
398 # else
399 # define Rounding Flt_Rounds
400 # endif
402 #else /* ifndef IEEE_Arith */
403 # undef Check_FLT_ROUNDS
404 # undef Honor_FLT_ROUNDS
405 # undef SET_INEXACT
406 # undef Sudden_Underflow
407 # define Sudden_Underflow
408 # ifdef IBM
409 # undef Flt_Rounds
410 # define Flt_Rounds 0
411 # define Exp_shift 24
412 # define Exp_shift1 24
413 # define Exp_msk1 0x1000000
414 # define Exp_msk11 0x1000000
415 # define Exp_mask 0x7f000000
416 # define P 14
417 # define Nbits 56
418 # define Bias 65
419 # define Emax 248
420 # define Emin (-260)
421 # define Exp_1 0x41000000
422 # define Exp_11 0x41000000
423 # define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
424 # define Frac_mask 0xffffff
425 # define Frac_mask1 0xffffff
426 # define Bletch 4
427 # define Ten_pmax 22
428 # define Bndry_mask 0xefffff
429 # define Bndry_mask1 0xffffff
430 # define LSB 1
431 # define Sign_bit 0x80000000
432 # define Log2P 4
433 # define Tiny0 0x100000
434 # define Tiny1 0
435 # define Quick_max 14
436 # define Int_max 15
437 # else /* VAX */
438 # undef Flt_Rounds
439 # define Flt_Rounds 1
440 # define Exp_shift 23
441 # define Exp_shift1 7
442 # define Exp_msk1 0x80
443 # define Exp_msk11 0x800000
444 # define Exp_mask 0x7f80
445 # define P 56
446 # define Nbits 56
447 # define Bias 129
448 # define Emax 126
449 # define Emin (-129)
450 # define Exp_1 0x40800000
451 # define Exp_11 0x4080
452 # define Ebits 8
453 # define Frac_mask 0x7fffff
454 # define Frac_mask1 0xffff007f
455 # define Ten_pmax 24
456 # define Bletch 2
457 # define Bndry_mask 0xffff007f
458 # define Bndry_mask1 0xffff007f
459 # define LSB 0x10000
460 # define Sign_bit 0x8000
461 # define Log2P 1
462 # define Tiny0 0x80
463 # define Tiny1 0
464 # define Quick_max 15
465 # define Int_max 15
466 # endif /* IBM, VAX */
467 #endif /* IEEE_Arith */
469 #ifndef IEEE_Arith
470 # define ROUND_BIASED
471 #else
472 # ifdef ROUND_BIASED_without_Round_Up
473 # undef ROUND_BIASED
474 # define ROUND_BIASED
475 # endif
476 #endif
478 #ifdef RND_PRODQUOT
479 # define rounded_product(a, b) a = rnd_prod(a, b)
480 # define rounded_quotient(a, b) a = rnd_quot(a, b)
481 # ifdef KR_headers
482 extern double rnd_prod(), rnd_quot();
483 # else
484 extern double rnd_prod(double, double), rnd_quot(double, double);
485 # endif
486 #else
487 # define rounded_product(a, b) a *= b
488 # define rounded_quotient(a, b) a /= b
489 #endif
491 #define Big0 (Frac_mask1 | Exp_msk1 * (DBL_MAX_EXP + Bias - 1))
492 #define Big1 0xffffffff
494 #ifndef Pack_32
495 # define Pack_32
496 #endif
498 typedef struct BCinfo BCinfo;
499 struct BCinfo {
500 int dp0, dp1, dplen, dsign, e0, inexact, nd, nd0, rounding, scale, uflchk;
503 #ifdef KR_headers
504 # define FFFFFFFF ((((unsigned long)0xffff) << 16) | (unsigned long)0xffff)
505 #else
506 # define FFFFFFFF 0xffffffffUL
507 #endif
509 #ifdef NO_LONG_LONG
510 # undef ULLong
511 # ifdef Just_16
512 # undef Pack_32
513 /* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
514 * This makes some inner loops simpler and sometimes saves work
515 * during multiplications, but it often seems to make things slightly
516 * slower. Hence the default is now to store 32 bits per Long.
518 # endif
519 #else /* long long available */
520 # ifndef Llong
521 # define Llong long long
522 # endif
523 # ifndef ULLong
524 # define ULLong unsigned Llong
525 # endif
526 #endif /* NO_LONG_LONG */
528 #ifndef MULTIPLE_THREADS
529 # define ACQUIRE_DTOA_LOCK(n) /*nothing*/
530 # define FREE_DTOA_LOCK(n) /*nothing*/
531 #endif
533 #define Kmax 7
535 #ifdef __cplusplus
536 extern "C" double strtod(const char* s00, char** se);
537 extern "C" char* dtoa(double d, int mode, int ndigits, int* decpt, int* sign,
538 char** rve);
539 #endif
541 struct Bigint {
542 struct Bigint* next;
543 int k, maxwds, sign, wds;
544 ULong x[1];
547 typedef struct Bigint Bigint;
549 static Bigint* freelist[Kmax + 1];
551 static Bigint* Balloc
552 #ifdef KR_headers
553 (k) int k;
554 #else
555 (int k)
556 #endif
558 int x;
559 Bigint* rv;
560 #ifndef Omit_Private_Memory
561 unsigned int len;
562 #endif
564 ACQUIRE_DTOA_LOCK(0);
565 /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
566 /* but this case seems very unlikely. */
567 if (k <= Kmax && (rv = freelist[k])) {
568 freelist[k] = rv->next;
569 } else {
570 x = 1 << k;
571 #ifdef Omit_Private_Memory
572 rv = (Bigint*)MALLOC(sizeof(Bigint) + (x - 1) * sizeof(ULong));
573 #else
574 len = (sizeof(Bigint) + (x - 1) * sizeof(ULong) + sizeof(double) - 1) /
575 sizeof(double);
576 if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
577 rv = (Bigint*)pmem_next;
578 pmem_next += len;
579 } else {
580 rv = (Bigint*)MALLOC(len * sizeof(double));
582 #endif
583 rv->k = k;
584 rv->maxwds = x;
586 FREE_DTOA_LOCK(0);
587 rv->sign = rv->wds = 0;
588 return rv;
591 static void Bfree
592 #ifdef KR_headers
593 (v) Bigint* v;
594 #else
595 (Bigint* v)
596 #endif
598 if (v) {
599 if (v->k > Kmax)
600 #ifdef FREE
601 FREE((void*)v);
602 #else
603 free((void*)v);
604 #endif
605 else {
606 ACQUIRE_DTOA_LOCK(0);
607 v->next = freelist[v->k];
608 freelist[v->k] = v;
609 FREE_DTOA_LOCK(0);
614 #define Bcopy(x, y) \
615 memcpy((char*)&x->sign, (char*)&y->sign, \
616 y->wds * sizeof(Long) + 2 * sizeof(int))
618 static Bigint* multadd
619 #ifdef KR_headers
620 (b, m, a) Bigint* b;
621 int m, a;
622 #else
623 (Bigint* b, int m, int a) /* multiply by m and add a */
624 #endif
626 int i, wds;
627 #ifdef ULLong
628 ULong* x;
629 ULLong carry, y;
630 #else
631 ULong carry, *x, y;
632 # ifdef Pack_32
633 ULong xi, z;
634 # endif
635 #endif
636 Bigint* b1;
638 wds = b->wds;
639 x = b->x;
640 i = 0;
641 carry = a;
642 do {
643 #ifdef ULLong
644 y = *x * (ULLong)m + carry;
645 carry = y >> 32;
646 *x++ = y & FFFFFFFF;
647 #else
648 # ifdef Pack_32
649 xi = *x;
650 y = (xi & 0xffff) * m + carry;
651 z = (xi >> 16) * m + (y >> 16);
652 carry = z >> 16;
653 *x++ = (z << 16) + (y & 0xffff);
654 # else
655 y = *x * m + carry;
656 carry = y >> 16;
657 *x++ = y & 0xffff;
658 # endif
659 #endif
660 } while (++i < wds);
661 if (carry) {
662 if (wds >= b->maxwds) {
663 b1 = Balloc(b->k + 1);
664 Bcopy(b1, b);
665 Bfree(b);
666 b = b1;
668 b->x[wds++] = carry;
669 b->wds = wds;
671 return b;
674 static Bigint* s2b
675 #ifdef KR_headers
676 (s, nd0, nd, y9, dplen) CONST char* s;
677 int nd0, nd, dplen;
678 ULong y9;
679 #else
680 (const char* s, int nd0, int nd, ULong y9, int dplen)
681 #endif
683 Bigint* b;
684 int i, k;
685 Long x, y;
687 x = (nd + 8) / 9;
688 for (k = 0, y = 1; x > y; y <<= 1, k++);
689 #ifdef Pack_32
690 b = Balloc(k);
691 b->x[0] = y9;
692 b->wds = 1;
693 #else
694 b = Balloc(k + 1);
695 b->x[0] = y9 & 0xffff;
696 b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
697 #endif
699 i = 9;
700 if (9 < nd0) {
701 s += 9;
702 do {
703 b = multadd(b, 10, *s++ - '0');
704 } while (++i < nd0);
705 s += dplen;
706 } else {
707 s += dplen + 9;
709 for (; i < nd; i++) {
710 b = multadd(b, 10, *s++ - '0');
712 return b;
715 static int hi0bits
716 #ifdef KR_headers
717 (x) ULong x;
718 #else
719 (ULong x)
720 #endif
722 int k = 0;
724 if (!(x & 0xffff0000)) {
725 k = 16;
726 x <<= 16;
728 if (!(x & 0xff000000)) {
729 k += 8;
730 x <<= 8;
732 if (!(x & 0xf0000000)) {
733 k += 4;
734 x <<= 4;
736 if (!(x & 0xc0000000)) {
737 k += 2;
738 x <<= 2;
740 if (!(x & 0x80000000)) {
741 k++;
742 if (!(x & 0x40000000)) {
743 return 32;
746 return k;
749 static int lo0bits
750 #ifdef KR_headers
751 (y) ULong* y;
752 #else
753 (ULong* y)
754 #endif
756 int k;
757 ULong x = *y;
759 if (x & 7) {
760 if (x & 1) {
761 return 0;
763 if (x & 2) {
764 *y = x >> 1;
765 return 1;
767 *y = x >> 2;
768 return 2;
770 k = 0;
771 if (!(x & 0xffff)) {
772 k = 16;
773 x >>= 16;
775 if (!(x & 0xff)) {
776 k += 8;
777 x >>= 8;
779 if (!(x & 0xf)) {
780 k += 4;
781 x >>= 4;
783 if (!(x & 0x3)) {
784 k += 2;
785 x >>= 2;
787 if (!(x & 1)) {
788 k++;
789 x >>= 1;
790 if (!x) {
791 return 32;
794 *y = x;
795 return k;
798 static Bigint* i2b
799 #ifdef KR_headers
800 (i) int i;
801 #else
802 (int i)
803 #endif
805 Bigint* b;
807 b = Balloc(1);
808 b->x[0] = i;
809 b->wds = 1;
810 return b;
813 static Bigint *mult
814 #ifdef KR_headers
815 (a, b) Bigint *a,
817 #else
818 (Bigint* a, Bigint* b)
819 #endif
821 Bigint* c;
822 int k, wa, wb, wc;
823 ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
824 ULong y;
825 #ifdef ULLong
826 ULLong carry, z;
827 #else
828 ULong carry, z;
829 # ifdef Pack_32
830 ULong z2;
831 # endif
832 #endif
834 if (a->wds < b->wds) {
835 c = a;
836 a = b;
837 b = c;
839 k = a->k;
840 wa = a->wds;
841 wb = b->wds;
842 wc = wa + wb;
843 if (wc > a->maxwds) {
844 k++;
846 c = Balloc(k);
847 for (x = c->x, xa = x + wc; x < xa; x++) {
848 *x = 0;
850 xa = a->x;
851 xae = xa + wa;
852 xb = b->x;
853 xbe = xb + wb;
854 xc0 = c->x;
855 #ifdef ULLong
856 for (; xb < xbe; xc0++) {
857 if ((y = *xb++)) {
858 x = xa;
859 xc = xc0;
860 carry = 0;
861 do {
862 z = *x++ * (ULLong)y + *xc + carry;
863 carry = z >> 32;
864 *xc++ = z & FFFFFFFF;
865 } while (x < xae);
866 *xc = carry;
869 #else
870 # ifdef Pack_32
871 for (; xb < xbe; xb++, xc0++) {
872 if (y = *xb & 0xffff) {
873 x = xa;
874 xc = xc0;
875 carry = 0;
876 do {
877 z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
878 carry = z >> 16;
879 z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
880 carry = z2 >> 16;
881 Storeinc(xc, z2, z);
882 } while (x < xae);
883 *xc = carry;
885 if (y = *xb >> 16) {
886 x = xa;
887 xc = xc0;
888 carry = 0;
889 z2 = *xc;
890 do {
891 z = (*x & 0xffff) * y + (*xc >> 16) + carry;
892 carry = z >> 16;
893 Storeinc(xc, z, z2);
894 z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
895 carry = z2 >> 16;
896 } while (x < xae);
897 *xc = z2;
900 # else
901 for (; xb < xbe; xc0++) {
902 if (y = *xb++) {
903 x = xa;
904 xc = xc0;
905 carry = 0;
906 do {
907 z = *x++ * y + *xc + carry;
908 carry = z >> 16;
909 *xc++ = z & 0xffff;
910 } while (x < xae);
911 *xc = carry;
914 # endif
915 #endif
916 for (xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc);
917 c->wds = wc;
918 return c;
921 static Bigint* p5s;
923 static Bigint* pow5mult
924 #ifdef KR_headers
925 (b, k) Bigint* b;
926 int k;
927 #else
928 (Bigint* b, int k)
929 #endif
931 Bigint *b1, *p5, *p51;
932 int i;
933 static int p05[3] = {5, 25, 125};
935 if ((i = k & 3)) {
936 b = multadd(b, p05[i - 1], 0);
939 if (!(k >>= 2)) {
940 return b;
942 if (!(p5 = p5s)) {
943 /* first time */
944 #ifdef MULTIPLE_THREADS
945 ACQUIRE_DTOA_LOCK(1);
946 if (!(p5 = p5s)) {
947 p5 = p5s = i2b(625);
948 p5->next = 0;
950 FREE_DTOA_LOCK(1);
951 #else
952 p5 = p5s = i2b(625);
953 p5->next = 0;
954 #endif
956 for (;;) {
957 if (k & 1) {
958 b1 = mult(b, p5);
959 Bfree(b);
960 b = b1;
962 if (!(k >>= 1)) {
963 break;
965 if (!(p51 = p5->next)) {
966 #ifdef MULTIPLE_THREADS
967 ACQUIRE_DTOA_LOCK(1);
968 if (!(p51 = p5->next)) {
969 p51 = p5->next = mult(p5, p5);
970 p51->next = 0;
972 FREE_DTOA_LOCK(1);
973 #else
974 p51 = p5->next = mult(p5, p5);
975 p51->next = 0;
976 #endif
978 p5 = p51;
980 return b;
983 static Bigint* lshift
984 #ifdef KR_headers
985 (b, k) Bigint* b;
986 int k;
987 #else
988 (Bigint* b, int k)
989 #endif
991 int i, k1, n, n1;
992 Bigint* b1;
993 ULong *x, *x1, *xe, z;
995 #ifdef Pack_32
996 n = k >> 5;
997 #else
998 n = k >> 4;
999 #endif
1000 k1 = b->k;
1001 n1 = n + b->wds + 1;
1002 for (i = b->maxwds; n1 > i; i <<= 1) {
1003 k1++;
1005 b1 = Balloc(k1);
1006 x1 = b1->x;
1007 for (i = 0; i < n; i++) {
1008 *x1++ = 0;
1010 x = b->x;
1011 xe = x + b->wds;
1012 #ifdef Pack_32
1013 if (k &= 0x1f) {
1014 k1 = 32 - k;
1015 z = 0;
1016 do {
1017 *x1++ = *x << k | z;
1018 z = *x++ >> k1;
1019 } while (x < xe);
1020 if ((*x1 = z)) {
1021 ++n1;
1024 #else
1025 if (k &= 0xf) {
1026 k1 = 16 - k;
1027 z = 0;
1028 do {
1029 *x1++ = *x << k & 0xffff | z;
1030 z = *x++ >> k1;
1031 } while (x < xe);
1032 if (*x1 = z) {
1033 ++n1;
1036 #endif
1037 else
1038 do {
1039 *x1++ = *x++;
1040 } while (x < xe);
1041 b1->wds = n1 - 1;
1042 Bfree(b);
1043 return b1;
1046 static int cmp
1047 #ifdef KR_headers
1048 (a, b) Bigint *a,
1050 #else
1051 (Bigint* a, Bigint* b)
1052 #endif
1054 ULong *xa, *xa0, *xb, *xb0;
1055 int i, j;
1057 i = a->wds;
1058 j = b->wds;
1059 #ifdef DEBUG
1060 if (i > 1 && !a->x[i - 1]) {
1061 Bug("cmp called with a->x[a->wds-1] == 0");
1063 if (j > 1 && !b->x[j - 1]) {
1064 Bug("cmp called with b->x[b->wds-1] == 0");
1066 #endif
1067 if (i -= j) {
1068 return i;
1070 xa0 = a->x;
1071 xa = xa0 + j;
1072 xb0 = b->x;
1073 xb = xb0 + j;
1074 for (;;) {
1075 if (*--xa != *--xb) {
1076 return *xa < *xb ? -1 : 1;
1078 if (xa <= xa0) {
1079 break;
1082 return 0;
1085 static Bigint *diff
1086 #ifdef KR_headers
1087 (a, b) Bigint *a,
1089 #else
1090 (Bigint* a, Bigint* b)
1091 #endif
1093 Bigint* c;
1094 int i, wa, wb;
1095 ULong *xa, *xae, *xb, *xbe, *xc;
1096 #ifdef ULLong
1097 ULLong borrow, y;
1098 #else
1099 ULong borrow, y;
1100 # ifdef Pack_32
1101 ULong z;
1102 # endif
1103 #endif
1105 i = cmp(a, b);
1106 if (!i) {
1107 c = Balloc(0);
1108 c->wds = 1;
1109 c->x[0] = 0;
1110 return c;
1112 if (i < 0) {
1113 c = a;
1114 a = b;
1115 b = c;
1116 i = 1;
1117 } else {
1118 i = 0;
1120 c = Balloc(a->k);
1121 c->sign = i;
1122 wa = a->wds;
1123 xa = a->x;
1124 xae = xa + wa;
1125 wb = b->wds;
1126 xb = b->x;
1127 xbe = xb + wb;
1128 xc = c->x;
1129 borrow = 0;
1130 #ifdef ULLong
1131 do {
1132 y = (ULLong)*xa++ - *xb++ - borrow;
1133 borrow = y >> 32 & (ULong)1;
1134 *xc++ = y & FFFFFFFF;
1135 } while (xb < xbe);
1136 while (xa < xae) {
1137 y = *xa++ - borrow;
1138 borrow = y >> 32 & (ULong)1;
1139 *xc++ = y & FFFFFFFF;
1141 #else
1142 # ifdef Pack_32
1143 do {
1144 y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
1145 borrow = (y & 0x10000) >> 16;
1146 z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
1147 borrow = (z & 0x10000) >> 16;
1148 Storeinc(xc, z, y);
1149 } while (xb < xbe);
1150 while (xa < xae) {
1151 y = (*xa & 0xffff) - borrow;
1152 borrow = (y & 0x10000) >> 16;
1153 z = (*xa++ >> 16) - borrow;
1154 borrow = (z & 0x10000) >> 16;
1155 Storeinc(xc, z, y);
1157 # else
1158 do {
1159 y = *xa++ - *xb++ - borrow;
1160 borrow = (y & 0x10000) >> 16;
1161 *xc++ = y & 0xffff;
1162 } while (xb < xbe);
1163 while (xa < xae) {
1164 y = *xa++ - borrow;
1165 borrow = (y & 0x10000) >> 16;
1166 *xc++ = y & 0xffff;
1168 # endif
1169 #endif
1170 while (!*--xc) {
1171 wa--;
1173 c->wds = wa;
1174 return c;
1177 static double ulp
1178 #ifdef KR_headers
1179 (x) U* x;
1180 #else
1181 (U* x)
1182 #endif
1184 Long L;
1185 U u;
1187 L = (word0(x) & Exp_mask) - (P - 1) * Exp_msk1;
1188 #ifndef Avoid_Underflow
1189 # ifndef Sudden_Underflow
1190 if (L > 0) {
1191 # endif
1192 #endif
1193 #ifdef IBM
1194 L |= Exp_msk1 >> 4;
1195 #endif
1196 word0(&u) = L;
1197 word1(&u) = 0;
1198 #ifndef Avoid_Underflow
1199 # ifndef Sudden_Underflow
1200 } else {
1201 L = -L >> Exp_shift;
1202 if (L < Exp_shift) {
1203 word0(&u) = 0x80000 >> L;
1204 word1(&u) = 0;
1205 } else {
1206 word0(&u) = 0;
1207 L -= Exp_shift;
1208 word1(&u) = L >= 31 ? 1 : 1 << 31 - L;
1211 # endif
1212 #endif
1213 return dval(&u);
1216 static double b2d
1217 #ifdef KR_headers
1218 (a, e) Bigint* a;
1219 int* e;
1220 #else
1221 (Bigint* a, int* e)
1222 #endif
1224 ULong *xa, *xa0, w, y, z;
1225 int k;
1226 U d;
1227 #ifdef VAX
1228 ULong d0, d1;
1229 #else
1230 # define d0 word0(&d)
1231 # define d1 word1(&d)
1232 #endif
1234 xa0 = a->x;
1235 xa = xa0 + a->wds;
1236 y = *--xa;
1237 #ifdef DEBUG
1238 if (!y) {
1239 Bug("zero y in b2d");
1241 #endif
1242 k = hi0bits(y);
1243 *e = 32 - k;
1244 #ifdef Pack_32
1245 if (k < Ebits) {
1246 d0 = Exp_1 | y >> (Ebits - k);
1247 w = xa > xa0 ? *--xa : 0;
1248 d1 = y << ((32 - Ebits) + k) | w >> (Ebits - k);
1249 goto ret_d;
1251 z = xa > xa0 ? *--xa : 0;
1252 if (k -= Ebits) {
1253 d0 = Exp_1 | y << k | z >> (32 - k);
1254 y = xa > xa0 ? *--xa : 0;
1255 d1 = z << k | y >> (32 - k);
1256 } else {
1257 d0 = Exp_1 | y;
1258 d1 = z;
1260 #else
1261 if (k < Ebits + 16) {
1262 z = xa > xa0 ? *--xa : 0;
1263 d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
1264 w = xa > xa0 ? *--xa : 0;
1265 y = xa > xa0 ? *--xa : 0;
1266 d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
1267 goto ret_d;
1269 z = xa > xa0 ? *--xa : 0;
1270 w = xa > xa0 ? *--xa : 0;
1271 k -= Ebits + 16;
1272 d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
1273 y = xa > xa0 ? *--xa : 0;
1274 d1 = w << k + 16 | y << k;
1275 #endif
1276 ret_d:
1277 #ifdef VAX
1278 word0(&d) = d0 >> 16 | d0 << 16;
1279 word1(&d) = d1 >> 16 | d1 << 16;
1280 #else
1281 # undef d0
1282 # undef d1
1283 #endif
1284 return dval(&d);
1287 static Bigint* d2b
1288 #ifdef KR_headers
1289 (d, e, bits) U* d;
1290 int *e, *bits;
1291 #else
1292 (U* d, int* e, int* bits)
1293 #endif
1295 Bigint* b;
1296 int de, k;
1297 ULong *x, y, z;
1298 #ifndef Sudden_Underflow
1299 int i;
1300 #endif
1301 #ifdef VAX
1302 ULong d0, d1;
1303 d0 = word0(d) >> 16 | word0(d) << 16;
1304 d1 = word1(d) >> 16 | word1(d) << 16;
1305 #else
1306 # define d0 word0(d)
1307 # define d1 word1(d)
1308 #endif
1310 #ifdef Pack_32
1311 b = Balloc(1);
1312 #else
1313 b = Balloc(2);
1314 #endif
1315 x = b->x;
1317 z = d0 & Frac_mask;
1318 d0 &= 0x7fffffff; /* clear sign bit, which we ignore */
1319 #ifdef Sudden_Underflow
1320 de = (int)(d0 >> Exp_shift);
1321 # ifndef IBM
1322 z |= Exp_msk11;
1323 # endif
1324 #else
1325 if ((de = (int)(d0 >> Exp_shift))) {
1326 z |= Exp_msk1;
1328 #endif
1329 #ifdef Pack_32
1330 if ((y = d1)) {
1331 if ((k = lo0bits(&y))) {
1332 x[0] = y | z << (32 - k);
1333 z >>= k;
1334 } else {
1335 x[0] = y;
1337 # ifndef Sudden_Underflow
1339 # endif
1340 b->wds = (x[1] = z) ? 2 : 1;
1341 } else {
1342 k = lo0bits(&z);
1343 x[0] = z;
1344 # ifndef Sudden_Underflow
1346 # endif
1347 b->wds = 1;
1348 k += 32;
1350 #else
1351 if (y = d1) {
1352 if (k = lo0bits(&y))
1353 if (k >= 16) {
1354 x[0] = y | z << 32 - k & 0xffff;
1355 x[1] = z >> k - 16 & 0xffff;
1356 x[2] = z >> k;
1357 i = 2;
1358 } else {
1359 x[0] = y & 0xffff;
1360 x[1] = y >> 16 | z << 16 - k & 0xffff;
1361 x[2] = z >> k & 0xffff;
1362 x[3] = z >> k + 16;
1363 i = 3;
1365 else {
1366 x[0] = y & 0xffff;
1367 x[1] = y >> 16;
1368 x[2] = z & 0xffff;
1369 x[3] = z >> 16;
1370 i = 3;
1372 } else {
1373 # ifdef DEBUG
1374 if (!z) {
1375 Bug("Zero passed to d2b");
1377 # endif
1378 k = lo0bits(&z);
1379 if (k >= 16) {
1380 x[0] = z;
1381 i = 0;
1382 } else {
1383 x[0] = z & 0xffff;
1384 x[1] = z >> 16;
1385 i = 1;
1387 k += 32;
1389 while (!x[i]) {
1390 --i;
1392 b->wds = i + 1;
1393 #endif
1394 #ifndef Sudden_Underflow
1395 if (de) {
1396 #endif
1397 #ifdef IBM
1398 *e = (de - Bias - (P - 1) << 2) + k;
1399 *bits = 4 * P + 8 - k - hi0bits(word0(d) & Frac_mask);
1400 #else
1401 *e = de - Bias - (P - 1) + k;
1402 *bits = P - k;
1403 #endif
1404 #ifndef Sudden_Underflow
1405 } else {
1406 *e = de - Bias - (P - 1) + 1 + k;
1407 # ifdef Pack_32
1408 *bits = 32 * i - hi0bits(x[i - 1]);
1409 # else
1410 *bits = (i + 2) * 16 - hi0bits(x[i]);
1411 # endif
1413 #endif
1414 return b;
1416 #undef d0
1417 #undef d1
1419 static double ratio
1420 #ifdef KR_headers
1421 (a, b) Bigint *a,
1423 #else
1424 (Bigint* a, Bigint* b)
1425 #endif
1427 U da, db;
1428 int k, ka, kb;
1430 dval(&da) = b2d(a, &ka);
1431 dval(&db) = b2d(b, &kb);
1432 #ifdef Pack_32
1433 k = ka - kb + 32 * (a->wds - b->wds);
1434 #else
1435 k = ka - kb + 16 * (a->wds - b->wds);
1436 #endif
1437 #ifdef IBM
1438 if (k > 0) {
1439 word0(&da) += (k >> 2) * Exp_msk1;
1440 if (k &= 3) {
1441 dval(&da) *= 1 << k;
1443 } else {
1444 k = -k;
1445 word0(&db) += (k >> 2) * Exp_msk1;
1446 if (k &= 3) {
1447 dval(&db) *= 1 << k;
1450 #else
1451 if (k > 0) {
1452 word0(&da) += k * Exp_msk1;
1453 } else {
1454 k = -k;
1455 word0(&db) += k * Exp_msk1;
1457 #endif
1458 return dval(&da) / dval(&db);
1461 static CONST double tens[] = {1e0,
1462 1e1,
1463 1e2,
1464 1e3,
1465 1e4,
1466 1e5,
1467 1e6,
1468 1e7,
1469 1e8,
1470 1e9,
1471 1e10,
1472 1e11,
1473 1e12,
1474 1e13,
1475 1e14,
1476 1e15,
1477 1e16,
1478 1e17,
1479 1e18,
1480 1e19,
1481 1e20,
1482 1e21,
1483 1e22
1484 #ifdef VAX
1486 1e23,
1487 1e24
1488 #endif
1491 static CONST double
1492 #ifdef IEEE_Arith
1493 bigtens[] = {1e16, 1e32, 1e64, 1e128, 1e256};
1494 static CONST double tinytens[] = {1e-16, 1e-32, 1e-64, 1e-128,
1495 # ifdef Avoid_Underflow
1496 9007199254740992. * 9007199254740992.e-256
1497 /* = 2^106 * 1e-256 */
1498 # else
1499 1e-256
1500 # endif
1502 /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1503 /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
1504 # define Scale_Bit 0x10
1505 # define n_bigtens 5
1506 #else
1507 # ifdef IBM
1508 bigtens[] = {1e16, 1e32, 1e64};
1509 static CONST double tinytens[] = {1e-16, 1e-32, 1e-64};
1510 # define n_bigtens 3
1511 # else
1512 bigtens[] = {1e16, 1e32};
1513 static CONST double tinytens[] = {1e-16, 1e-32};
1514 # define n_bigtens 2
1515 # endif
1516 #endif
1518 #undef Need_Hexdig
1519 #ifdef INFNAN_CHECK
1520 # ifndef No_Hex_NaN
1521 # define Need_Hexdig
1522 # endif
1523 #endif
1525 #ifndef Need_Hexdig
1526 # ifndef NO_HEX_FP
1527 # define Need_Hexdig
1528 # endif
1529 #endif
1531 #ifdef Need_Hexdig /*{*/
1532 static unsigned char hexdig[256];
1534 static void
1535 # ifdef KR_headers
1536 htinit(h, s, inc) unsigned char* h;
1537 unsigned char* s;
1538 int inc;
1539 # else
1540 htinit(unsigned char* h, unsigned char* s, int inc)
1541 # endif
1543 int i, j;
1544 for (i = 0; (j = s[i]) != 0; i++) {
1545 h[j] = i + inc;
1549 static void
1550 # ifdef KR_headers
1551 hexdig_init()
1552 # else
1553 hexdig_init(void)
1554 # endif
1556 # define USC (unsigned char*)
1557 htinit(hexdig, USC "0123456789", 0x10);
1558 htinit(hexdig, USC "abcdef", 0x10 + 10);
1559 htinit(hexdig, USC "ABCDEF", 0x10 + 10);
1561 #endif /* } Need_Hexdig */
1563 #ifdef INFNAN_CHECK
1565 # ifndef NAN_WORD0
1566 # define NAN_WORD0 0x7ff80000
1567 # endif
1569 # ifndef NAN_WORD1
1570 # define NAN_WORD1 0
1571 # endif
1573 static int match
1574 # ifdef KR_headers
1575 (sp, t) char **sp,
1577 # else
1578 (const char** sp, const char* t)
1579 # endif
1581 int c, d;
1582 CONST char* s = *sp;
1584 while ((d = *t++)) {
1585 if ((c = *++s) >= 'A' && c <= 'Z') {
1586 c += 'a' - 'A';
1588 if (c != d) {
1589 return 0;
1592 *sp = s + 1;
1593 return 1;
1596 # ifndef No_Hex_NaN
1597 static void hexnan
1598 # ifdef KR_headers
1599 (rvp, sp) U* rvp;
1600 CONST char** sp;
1601 # else
1602 (U* rvp, const char** sp)
1603 # endif
1605 ULong c, x[2];
1606 CONST char* s;
1607 int c1, havedig, udx0, xshift;
1609 if (!hexdig['0']) {
1610 hexdig_init();
1612 x[0] = x[1] = 0;
1613 havedig = xshift = 0;
1614 udx0 = 1;
1615 s = *sp;
1616 /* allow optional initial 0x or 0X */
1617 while ((c = *(CONST unsigned char*)(s + 1)) && c <= ' ') {
1618 ++s;
1620 if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')) {
1621 s += 2;
1623 while ((c = *(CONST unsigned char*)++s)) {
1624 if ((c1 = hexdig[c])) {
1625 c = c1 & 0xf;
1626 } else if (c <= ' ') {
1627 if (udx0 && havedig) {
1628 udx0 = 0;
1629 xshift = 1;
1631 continue;
1633 # ifdef GDTOA_NON_PEDANTIC_NANCHECK
1634 else if (/*(*/ c == ')' && havedig) {
1635 *sp = s + 1;
1636 break;
1637 } else {
1638 return; /* invalid form: don't change *sp */
1640 # else
1641 else {
1642 do {
1643 if (/*(*/ c == ')') {
1644 *sp = s + 1;
1645 break;
1647 } while ((c = *++s));
1648 break;
1650 # endif
1651 havedig = 1;
1652 if (xshift) {
1653 xshift = 0;
1654 x[0] = x[1];
1655 x[1] = 0;
1657 if (udx0) {
1658 x[0] = (x[0] << 4) | (x[1] >> 28);
1660 x[1] = (x[1] << 4) | c;
1662 if ((x[0] &= 0xfffff) || x[1]) {
1663 word0(rvp) = Exp_mask | x[0];
1664 word1(rvp) = x[1];
1667 # endif /*No_Hex_NaN*/
1668 #endif /* INFNAN_CHECK */
1670 #ifdef Pack_32
1671 # define ULbits 32
1672 # define kshift 5
1673 # define kmask 31
1674 #else
1675 # define ULbits 16
1676 # define kshift 4
1677 # define kmask 15
1678 #endif
1680 #if !defined(NO_HEX_FP) || defined(Honor_FLT_ROUNDS) /*{*/
1681 static Bigint*
1682 # ifdef KR_headers
1683 increment(b) Bigint* b;
1684 # else
1685 increment(Bigint* b)
1686 # endif
1688 ULong *x, *xe;
1689 Bigint* b1;
1691 x = b->x;
1692 xe = x + b->wds;
1693 do {
1694 if (*x < (ULong)0xffffffffL) {
1695 ++*x;
1696 return b;
1698 *x++ = 0;
1699 } while (x < xe);
1701 if (b->wds >= b->maxwds) {
1702 b1 = Balloc(b->k + 1);
1703 Bcopy(b1, b);
1704 Bfree(b);
1705 b = b1;
1707 b->x[b->wds++] = 1;
1709 return b;
1712 #endif /*}*/
1714 #ifndef NO_HEX_FP /*{*/
1716 static void
1717 # ifdef KR_headers
1718 rshift(b, k) Bigint* b;
1719 int k;
1720 # else
1721 rshift(Bigint* b, int k)
1722 # endif
1724 ULong *x, *x1, *xe, y;
1725 int n;
1727 x = x1 = b->x;
1728 n = k >> kshift;
1729 if (n < b->wds) {
1730 xe = x + b->wds;
1731 x += n;
1732 if (k &= kmask) {
1733 n = 32 - k;
1734 y = *x++ >> k;
1735 while (x < xe) {
1736 *x1++ = (y | (*x << n)) & 0xffffffff;
1737 y = *x++ >> k;
1739 if ((*x1 = y) != 0) {
1740 x1++;
1742 } else
1743 while (x < xe) {
1744 *x1++ = *x++;
1747 if ((b->wds = x1 - b->x) == 0) {
1748 b->x[0] = 0;
1752 static ULong
1753 # ifdef KR_headers
1754 any_on(b, k) Bigint* b;
1755 int k;
1756 # else
1757 any_on(Bigint* b, int k)
1758 # endif
1760 int n, nwds;
1761 ULong *x, *x0, x1, x2;
1763 x = b->x;
1764 nwds = b->wds;
1765 n = k >> kshift;
1766 if (n > nwds) {
1767 n = nwds;
1768 } else if (n < nwds && (k &= kmask)) {
1769 x1 = x2 = x[n];
1770 x1 >>= k;
1771 x1 <<= k;
1772 if (x1 != x2) {
1773 return 1;
1776 x0 = x;
1777 x += n;
1778 while (x > x0)
1779 if (*--x) {
1780 return 1;
1782 return 0;
1785 enum { /* rounding values: same as FLT_ROUNDS */
1786 Round_zero = 0,
1787 Round_near = 1,
1788 Round_up = 2,
1789 Round_down = 3
1792 void
1793 # ifdef KR_headers
1794 gethex(sp, rvp, rounding, sign) CONST char** sp;
1795 U* rvp;
1796 int rounding, sign;
1797 # else
1798 gethex( CONST char **sp, U *rvp, int rounding, int sign)
1799 # endif
1801 Bigint* b;
1802 CONST unsigned char *decpt, *s0, *s, *s1;
1803 Long e, e1;
1804 ULong L, lostbits, *x;
1805 int big, denorm, esign, havedig, k, n, nbits, up, zret;
1806 # ifdef IBM
1807 int j;
1808 # endif
1809 enum {
1810 # ifdef IEEE_Arith /*{{*/
1811 emax = 0x7fe - Bias - P + 1,
1812 emin = Emin - P + 1
1813 # else /*}{*/
1814 emin = Emin - P,
1815 # ifdef VAX
1816 emax = 0x7ff - Bias - P +
1818 # endif
1819 # ifdef IBM
1820 emax = 0x7f - Bias - P
1821 # endif
1822 # endif /*}}*/
1824 # ifdef USE_LOCALE
1825 int i;
1826 # ifdef NO_LOCALE_CACHE
1827 const unsigned char* decimalpoint =
1828 (unsigned char*)localeconv()->decimal_point;
1829 # else
1830 const unsigned char* decimalpoint;
1831 static unsigned char* decimalpoint_cache;
1832 if (!(s0 = decimalpoint_cache)) {
1833 s0 = (unsigned char*)localeconv()->decimal_point;
1834 if ((decimalpoint_cache =
1835 (unsigned char*)MALLOC(strlen((CONST char*)s0) + 1))) {
1836 strcpy((char*)decimalpoint_cache, (CONST char*)s0);
1837 s0 = decimalpoint_cache;
1840 decimalpoint = s0;
1841 # endif
1842 # endif
1844 if (!hexdig['0']) {
1845 hexdig_init();
1847 havedig = 0;
1848 s0 = *(CONST unsigned char**)sp + 2;
1849 while (s0[havedig] == '0') {
1850 havedig++;
1852 s0 += havedig;
1853 s = s0;
1854 decpt = 0;
1855 zret = 0;
1856 e = 0;
1857 if (hexdig[*s]) {
1858 havedig++;
1859 } else {
1860 zret = 1;
1861 # ifdef USE_LOCALE
1862 for (i = 0; decimalpoint[i]; ++i) {
1863 if (s[i] != decimalpoint[i]) {
1864 goto pcheck;
1867 decpt = s += i;
1868 # else
1869 if (*s != '.') {
1870 goto pcheck;
1872 decpt = ++s;
1873 # endif
1874 if (!hexdig[*s]) {
1875 goto pcheck;
1877 while (*s == '0') {
1878 s++;
1880 if (hexdig[*s]) {
1881 zret = 0;
1883 havedig = 1;
1884 s0 = s;
1886 while (hexdig[*s]) {
1887 s++;
1889 # ifdef USE_LOCALE
1890 if (*s == *decimalpoint && !decpt) {
1891 for (i = 1; decimalpoint[i]; ++i) {
1892 if (s[i] != decimalpoint[i]) {
1893 goto pcheck;
1896 decpt = s += i;
1897 # else
1898 if (*s == '.' && !decpt) {
1899 decpt = ++s;
1900 # endif
1901 while (hexdig[*s]) {
1902 s++;
1904 } /*}*/
1905 if (decpt) {
1906 e = -(((Long)(s - decpt)) << 2);
1908 pcheck:
1909 s1 = s;
1910 big = esign = 0;
1911 switch (*s) {
1912 case 'p':
1913 case 'P':
1914 switch (*++s) {
1915 case '-':
1916 esign = 1;
1917 /* no break */
1918 case '+':
1919 s++;
1921 if ((n = hexdig[*s]) == 0 || n > 0x19) {
1922 s = s1;
1923 break;
1925 e1 = n - 0x10;
1926 while ((n = hexdig[*++s]) != 0 && n <= 0x19) {
1927 if (e1 & 0xf8000000) {
1928 big = 1;
1930 e1 = 10 * e1 + n - 0x10;
1932 if (esign) {
1933 e1 = -e1;
1935 e += e1;
1937 *sp = (char*)s;
1938 if (!havedig) {
1939 *sp = (char*)s0 - 1;
1941 if (zret) {
1942 goto retz1;
1944 if (big) {
1945 if (esign) {
1946 # ifdef IEEE_Arith
1947 switch (rounding) {
1948 case Round_up:
1949 if (sign) {
1950 break;
1952 goto ret_tiny;
1953 case Round_down:
1954 if (!sign) {
1955 break;
1957 goto ret_tiny;
1959 # endif
1960 goto retz;
1961 # ifdef IEEE_Arith
1962 ret_tiny:
1963 # ifndef NO_ERRNO
1964 errno = ERANGE;
1965 # endif
1966 word0(rvp) = 0;
1967 word1(rvp) = 1;
1968 return;
1969 # endif /* IEEE_Arith */
1971 switch (rounding) {
1972 case Round_near:
1973 goto ovfl1;
1974 case Round_up:
1975 if (!sign) {
1976 goto ovfl1;
1978 goto ret_big;
1979 case Round_down:
1980 if (sign) {
1981 goto ovfl1;
1983 goto ret_big;
1985 ret_big:
1986 word0(rvp) = Big0;
1987 word1(rvp) = Big1;
1988 return;
1990 n = s1 - s0 - 1;
1991 for (k = 0; n > (1 << (kshift - 2)) - 1; n >>= 1) {
1992 k++;
1994 b = Balloc(k);
1995 x = b->x;
1996 n = 0;
1997 L = 0;
1998 # ifdef USE_LOCALE
1999 for (i = 0; decimalpoint[i + 1]; ++i);
2000 # endif
2001 while (s1 > s0) {
2002 # ifdef USE_LOCALE
2003 if (*--s1 == decimalpoint[i]) {
2004 s1 -= i;
2005 continue;
2007 # else
2008 if (*--s1 == '.') {
2009 continue;
2011 # endif
2012 if (n == ULbits) {
2013 *x++ = L;
2014 L = 0;
2015 n = 0;
2017 L |= (hexdig[*s1] & 0x0f) << n;
2018 n += 4;
2020 *x++ = L;
2021 b->wds = n = x - b->x;
2022 n = ULbits * n - hi0bits(L);
2023 nbits = Nbits;
2024 lostbits = 0;
2025 x = b->x;
2026 if (n > nbits) {
2027 n -= nbits;
2028 if (any_on(b, n)) {
2029 lostbits = 1;
2030 k = n - 1;
2031 if (x[k >> kshift] & 1 << (k & kmask)) {
2032 lostbits = 2;
2033 if (k > 0 && any_on(b, k)) {
2034 lostbits = 3;
2038 rshift(b, n);
2039 e += n;
2040 } else if (n < nbits) {
2041 n = nbits - n;
2042 b = lshift(b, n);
2043 e -= n;
2044 x = b->x;
2046 if (e > Emax) {
2047 ovfl:
2048 Bfree(b);
2049 ovfl1:
2050 # ifndef NO_ERRNO
2051 errno = ERANGE;
2052 # endif
2053 word0(rvp) = Exp_mask;
2054 word1(rvp) = 0;
2055 return;
2057 denorm = 0;
2058 if (e < emin) {
2059 denorm = 1;
2060 n = emin - e;
2061 if (n >= nbits) {
2062 # ifdef IEEE_Arith /*{*/
2063 switch (rounding) {
2064 case Round_near:
2065 if (n == nbits && (n < 2 || any_on(b, n - 1))) {
2066 goto ret_tiny;
2068 break;
2069 case Round_up:
2070 if (!sign) {
2071 goto ret_tiny;
2073 break;
2074 case Round_down:
2075 if (sign) {
2076 goto ret_tiny;
2079 # endif /* } IEEE_Arith */
2080 Bfree(b);
2081 retz:
2082 # ifndef NO_ERRNO
2083 errno = ERANGE;
2084 # endif
2085 retz1:
2086 rvp->d = 0.;
2087 return;
2089 k = n - 1;
2090 if (lostbits) {
2091 lostbits = 1;
2092 } else if (k > 0) {
2093 lostbits = any_on(b, k);
2095 if (x[k >> kshift] & 1 << (k & kmask)) {
2096 lostbits |= 2;
2098 nbits -= n;
2099 rshift(b, n);
2100 e = emin;
2102 if (lostbits) {
2103 up = 0;
2104 switch (rounding) {
2105 case Round_zero:
2106 break;
2107 case Round_near:
2108 if (lostbits & 2 && (lostbits & 1) | (x[0] & 1)) {
2109 up = 1;
2111 break;
2112 case Round_up:
2113 up = 1 - sign;
2114 break;
2115 case Round_down:
2116 up = sign;
2118 if (up) {
2119 k = b->wds;
2120 b = increment(b);
2121 x = b->x;
2122 if (denorm) {
2123 # if 0
2124 if (nbits == Nbits - 1
2125 && x[nbits >> kshift] & 1 << (nbits & kmask)) {
2126 denorm = 0; /* not currently used */
2128 # endif
2129 } else if (b->wds > k ||
2130 ((n = nbits & kmask) != 0 && hi0bits(x[k - 1]) < 32 - n)) {
2131 rshift(b, 1);
2132 if (++e > Emax) {
2133 goto ovfl;
2138 # ifdef IEEE_Arith
2139 if (denorm) {
2140 word0(rvp) = b->wds > 1 ? b->x[1] & ~0x100000 : 0;
2141 } else {
2142 word0(rvp) = (b->x[1] & ~0x100000) | ((e + 0x3ff + 52) << 20);
2144 word1(rvp) = b->x[0];
2145 # endif
2146 # ifdef IBM
2147 if ((j = e & 3)) {
2148 k = b->x[0] & ((1 << j) - 1);
2149 rshift(b, j);
2150 if (k) {
2151 switch (rounding) {
2152 case Round_up:
2153 if (!sign) {
2154 increment(b);
2156 break;
2157 case Round_down:
2158 if (sign) {
2159 increment(b);
2161 break;
2162 case Round_near:
2163 j = 1 << (j - 1);
2164 if (k & j && ((k & (j - 1)) | lostbits)) {
2165 increment(b);
2170 e >>= 2;
2171 word0(rvp) = b->x[1] | ((e + 65 + 13) << 24);
2172 word1(rvp) = b->x[0];
2173 # endif
2174 # ifdef VAX
2175 /* The next two lines ignore swap of low- and high-order 2 bytes. */
2176 /* word0(rvp) = (b->x[1] & ~0x800000) | ((e + 129 + 55) << 23); */
2177 /* word1(rvp) = b->x[0]; */
2178 word0(rvp) =
2179 ((b->x[1] & ~0x800000) >> 16) | ((e + 129 + 55) << 7) | (b->x[1] << 16);
2180 word1(rvp) = (b->x[0] >> 16) | (b->x[0] << 16);
2181 # endif
2182 Bfree(b);
2184 #endif /*!NO_HEX_FP}*/
2186 static int
2187 #ifdef KR_headers
2188 dshift(b, p2) Bigint* b;
2189 int p2;
2190 #else
2191 dshift(Bigint* b, int p2)
2192 #endif
2194 int rv = hi0bits(b->x[b->wds - 1]) - 4;
2195 if (p2 > 0) {
2196 rv -= p2;
2198 return rv & kmask;
2201 static int quorem
2202 #ifdef KR_headers
2203 (b, S) Bigint *b,
2205 #else
2206 (Bigint* b, Bigint* S)
2207 #endif
2209 int n;
2210 ULong *bx, *bxe, q, *sx, *sxe;
2211 #ifdef ULLong
2212 ULLong borrow, carry, y, ys;
2213 #else
2214 ULong borrow, carry, y, ys;
2215 # ifdef Pack_32
2216 ULong si, z, zs;
2217 # endif
2218 #endif
2220 n = S->wds;
2221 #ifdef DEBUG
2222 /*debug*/ if (b->wds > n)
2223 /*debug*/ {
2224 Bug("oversize b in quorem");
2226 #endif
2227 if (b->wds < n) {
2228 return 0;
2230 sx = S->x;
2231 sxe = sx + --n;
2232 bx = b->x;
2233 bxe = bx + n;
2234 q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
2235 #ifdef DEBUG
2236 # ifdef NO_STRTOD_BIGCOMP
2237 /*debug*/ if (q > 9)
2238 # else
2239 /* An oversized q is possible when quorem is called from bigcomp and */
2240 /* the input is near, e.g., twice the smallest denormalized number. */
2241 /*debug*/ if (q > 15)
2242 # endif
2243 /*debug*/ Bug("oversized quotient in quorem");
2244 #endif
2245 if (q) {
2246 borrow = 0;
2247 carry = 0;
2248 do {
2249 #ifdef ULLong
2250 ys = *sx++ * (ULLong)q + carry;
2251 carry = ys >> 32;
2252 y = *bx - (ys & FFFFFFFF) - borrow;
2253 borrow = y >> 32 & (ULong)1;
2254 *bx++ = y & FFFFFFFF;
2255 #else
2256 # ifdef Pack_32
2257 si = *sx++;
2258 ys = (si & 0xffff) * q + carry;
2259 zs = (si >> 16) * q + (ys >> 16);
2260 carry = zs >> 16;
2261 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2262 borrow = (y & 0x10000) >> 16;
2263 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2264 borrow = (z & 0x10000) >> 16;
2265 Storeinc(bx, z, y);
2266 # else
2267 ys = *sx++ * q + carry;
2268 carry = ys >> 16;
2269 y = *bx - (ys & 0xffff) - borrow;
2270 borrow = (y & 0x10000) >> 16;
2271 *bx++ = y & 0xffff;
2272 # endif
2273 #endif
2274 } while (sx <= sxe);
2275 if (!*bxe) {
2276 bx = b->x;
2277 while (--bxe > bx && !*bxe) {
2278 --n;
2280 b->wds = n;
2283 if (cmp(b, S) >= 0) {
2284 q++;
2285 borrow = 0;
2286 carry = 0;
2287 bx = b->x;
2288 sx = S->x;
2289 do {
2290 #ifdef ULLong
2291 ys = *sx++ + carry;
2292 carry = ys >> 32;
2293 y = *bx - (ys & FFFFFFFF) - borrow;
2294 borrow = y >> 32 & (ULong)1;
2295 *bx++ = y & FFFFFFFF;
2296 #else
2297 # ifdef Pack_32
2298 si = *sx++;
2299 ys = (si & 0xffff) + carry;
2300 zs = (si >> 16) + (ys >> 16);
2301 carry = zs >> 16;
2302 y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2303 borrow = (y & 0x10000) >> 16;
2304 z = (*bx >> 16) - (zs & 0xffff) - borrow;
2305 borrow = (z & 0x10000) >> 16;
2306 Storeinc(bx, z, y);
2307 # else
2308 ys = *sx++ + carry;
2309 carry = ys >> 16;
2310 y = *bx - (ys & 0xffff) - borrow;
2311 borrow = (y & 0x10000) >> 16;
2312 *bx++ = y & 0xffff;
2313 # endif
2314 #endif
2315 } while (sx <= sxe);
2316 bx = b->x;
2317 bxe = bx + n;
2318 if (!*bxe) {
2319 while (--bxe > bx && !*bxe) {
2320 --n;
2322 b->wds = n;
2325 return q;
2328 #if defined(Avoid_Underflow) || !defined(NO_STRTOD_BIGCOMP) /*{*/
2329 static double sulp
2330 # ifdef KR_headers
2331 (x, bc) U* x;
2332 BCinfo* bc;
2333 # else
2334 (U* x, BCinfo* bc)
2335 # endif
2337 U u;
2338 double rv;
2339 int i;
2341 rv = ulp(x);
2342 if (!bc->scale ||
2343 (i = 2 * P + 1 - ((word0(x) & Exp_mask) >> Exp_shift)) <= 0) {
2344 return rv; /* Is there an example where i <= 0 ? */
2346 word0(&u) = Exp_1 + (i << Exp_shift);
2347 word1(&u) = 0;
2348 return rv * u.d;
2350 #endif /*}*/
2352 #ifndef NO_STRTOD_BIGCOMP
2353 static void bigcomp
2354 # ifdef KR_headers
2355 (rv, s0, bc) U* rv;
2356 CONST char* s0;
2357 BCinfo* bc;
2358 # else
2359 (U* rv, const char* s0, BCinfo* bc)
2360 # endif
2362 Bigint *b, *d;
2363 int b2, bbits, d2, dd, dig, dsign, i, j, nd, nd0, p2, p5, speccase;
2365 dsign = bc->dsign;
2366 nd = bc->nd;
2367 nd0 = bc->nd0;
2368 p5 = nd + bc->e0 - 1;
2369 speccase = 0;
2370 # ifndef Sudden_Underflow
2371 if (rv->d == 0.) { /* special case: value near underflow-to-zero */
2372 /* threshold was rounded to zero */
2373 b = i2b(1);
2374 p2 = Emin - P + 1;
2375 bbits = 1;
2376 # ifdef Avoid_Underflow
2377 word0(rv) = (P + 2) << Exp_shift;
2378 # else
2379 word1(rv) = 1;
2380 # endif
2381 i = 0;
2382 # ifdef Honor_FLT_ROUNDS
2383 if (bc->rounding == 1)
2384 # endif
2386 speccase = 1;
2387 --p2;
2388 dsign = 0;
2389 goto have_i;
2391 } else
2392 # endif
2393 b = d2b(rv, &p2, &bbits);
2394 # ifdef Avoid_Underflow
2395 p2 -= bc->scale;
2396 # endif
2397 /* floor(log2(rv)) == bbits - 1 + p2 */
2398 /* Check for denormal case. */
2399 i = P - bbits;
2400 if (i > (j = P - Emin - 1 + p2)) {
2401 # ifdef Sudden_Underflow
2402 Bfree(b);
2403 b = i2b(1);
2404 p2 = Emin;
2405 i = P - 1;
2406 # ifdef Avoid_Underflow
2407 word0(rv) = (1 + bc->scale) << Exp_shift;
2408 # else
2409 word0(rv) = Exp_msk1;
2410 # endif
2411 word1(rv) = 0;
2412 # else
2413 i = j;
2414 # endif
2416 # ifdef Honor_FLT_ROUNDS
2417 if (bc->rounding != 1) {
2418 if (i > 0) {
2419 b = lshift(b, i);
2421 if (dsign) {
2422 b = increment(b);
2424 } else
2425 # endif
2427 b = lshift(b, ++i);
2428 b->x[0] |= 1;
2430 # ifndef Sudden_Underflow
2431 have_i:
2432 # endif
2433 p2 -= p5 + i;
2434 d = i2b(1);
2435 /* Arrange for convenient computation of quotients:
2436 * shift left if necessary so divisor has 4 leading 0 bits.
2438 if (p5 > 0) {
2439 d = pow5mult(d, p5);
2440 } else if (p5 < 0) {
2441 b = pow5mult(b, -p5);
2443 if (p2 > 0) {
2444 b2 = p2;
2445 d2 = 0;
2446 } else {
2447 b2 = 0;
2448 d2 = -p2;
2450 i = dshift(d, d2);
2451 if ((b2 += i) > 0) {
2452 b = lshift(b, b2);
2454 if ((d2 += i) > 0) {
2455 d = lshift(d, d2);
2458 /* Now b/d = exactly half-way between the two floating-point values */
2459 /* on either side of the input string. Compute first digit of b/d. */
2461 if (!(dig = quorem(b, d))) {
2462 b = multadd(b, 10, 0); /* very unlikely */
2463 dig = quorem(b, d);
2466 /* Compare b/d with s0 */
2468 for (i = 0; i < nd0;) {
2469 if ((dd = s0[i++] - '0' - dig)) {
2470 goto ret;
2472 if (!b->x[0] && b->wds == 1) {
2473 if (i < nd) {
2474 dd = 1;
2476 goto ret;
2478 b = multadd(b, 10, 0);
2479 dig = quorem(b, d);
2481 for (j = bc->dp1; i++ < nd;) {
2482 if ((dd = s0[j++] - '0' - dig)) {
2483 goto ret;
2485 if (!b->x[0] && b->wds == 1) {
2486 if (i < nd) {
2487 dd = 1;
2489 goto ret;
2491 b = multadd(b, 10, 0);
2492 dig = quorem(b, d);
2494 if (b->x[0] || b->wds > 1 || dig > 0) {
2495 dd = -1;
2497 ret:
2498 Bfree(b);
2499 Bfree(d);
2500 # ifdef Honor_FLT_ROUNDS
2501 if (bc->rounding != 1) {
2502 if (dd < 0) {
2503 if (bc->rounding == 0) {
2504 if (!dsign) {
2505 goto retlow1;
2507 } else if (dsign) {
2508 goto rethi1;
2510 } else if (dd > 0) {
2511 if (bc->rounding == 0) {
2512 if (dsign) {
2513 goto rethi1;
2515 goto ret1;
2517 if (!dsign) {
2518 goto rethi1;
2520 dval(rv) += 2. * sulp(rv, bc);
2521 } else {
2522 bc->inexact = 0;
2523 if (dsign) {
2524 goto rethi1;
2527 } else
2528 # endif
2529 if (speccase) {
2530 if (dd <= 0) {
2531 rv->d = 0.;
2533 } else if (dd < 0) {
2534 if (!dsign) /* does not happen for round-near */
2535 retlow1:
2536 dval(rv) -= sulp(rv, bc);
2537 } else if (dd > 0) {
2538 if (dsign) {
2539 rethi1:
2540 dval(rv) += sulp(rv, bc);
2542 } else {
2543 /* Exact half-way case: apply round-even rule. */
2544 if ((j = ((word0(rv) & Exp_mask) >> Exp_shift) - bc->scale) <= 0) {
2545 i = 1 - j;
2546 if (i <= 31) {
2547 if (word1(rv) & (0x1 << i)) {
2548 goto odd;
2550 } else if (word0(rv) & (0x1 << (i - 32))) {
2551 goto odd;
2553 } else if (word1(rv) & 1) {
2554 odd:
2555 if (dsign) {
2556 goto rethi1;
2558 goto retlow1;
2562 # ifdef Honor_FLT_ROUNDS
2563 ret1:
2564 # endif
2565 return;
2567 #endif /* NO_STRTOD_BIGCOMP */
2569 double strtod
2570 #ifdef KR_headers
2571 (s00, se) CONST char* s00;
2572 char** se;
2573 #else
2574 (const char* s00, char** se)
2575 #endif
2577 int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, e, e1;
2578 int esign, i, j, k, nd, nd0, nf, nz, nz0, nz1, sign;
2579 CONST char *s, *s0, *s1;
2580 double aadj, aadj1;
2581 Long L;
2582 U aadj2, adj, rv, rv0;
2583 ULong y, z;
2584 BCinfo bc;
2585 Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
2586 #ifdef Avoid_Underflow
2587 ULong Lsb, Lsb1;
2588 #endif
2589 #ifdef SET_INEXACT
2590 int oldinexact;
2591 #endif
2592 #ifndef NO_STRTOD_BIGCOMP
2593 int req_bigcomp = 0;
2594 #endif
2595 #ifdef Honor_FLT_ROUNDS /*{*/
2596 # ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
2597 bc.rounding = Flt_Rounds;
2598 # else /*}{*/
2599 bc.rounding = 1;
2600 switch (fegetround()) {
2601 case FE_TOWARDZERO:
2602 bc.rounding = 0;
2603 break;
2604 case FE_UPWARD:
2605 bc.rounding = 2;
2606 break;
2607 case FE_DOWNWARD:
2608 bc.rounding = 3;
2610 # endif /*}}*/
2611 #endif /*}*/
2612 #ifdef USE_LOCALE
2613 CONST char* s2;
2614 #endif
2616 sign = nz0 = nz1 = nz = bc.dplen = bc.uflchk = 0;
2617 dval(&rv) = 0.;
2618 for (s = s00;; s++) switch (*s) {
2619 case '-':
2620 sign = 1;
2621 /* no break */
2622 case '+':
2623 if (*++s) {
2624 goto break2;
2626 /* no break */
2627 case 0:
2628 goto ret0;
2629 case '\t':
2630 case '\n':
2631 case '\v':
2632 case '\f':
2633 case '\r':
2634 case ' ':
2635 continue;
2636 default:
2637 goto break2;
2639 break2:
2640 if (*s == '0') {
2641 #ifndef NO_HEX_FP /*{*/
2642 switch (s[1]) {
2643 case 'x':
2644 case 'X':
2645 # ifdef Honor_FLT_ROUNDS
2646 gethex(&s, &rv, bc.rounding, sign);
2647 # else
2648 gethex(&s, &rv, 1, sign);
2649 # endif
2650 goto ret;
2652 #endif /*}*/
2653 nz0 = 1;
2654 while (*++s == '0');
2655 if (!*s) {
2656 goto ret;
2659 s0 = s;
2660 y = z = 0;
2661 for (nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
2662 if (nd < 9) {
2663 y = 10 * y + c - '0';
2664 } else if (nd < 16) {
2665 z = 10 * z + c - '0';
2667 nd0 = nd;
2668 bc.dp0 = bc.dp1 = s - s0;
2669 for (s1 = s; s1 > s0 && *--s1 == '0';) {
2670 ++nz1;
2672 #ifdef USE_LOCALE
2673 s1 = localeconv()->decimal_point;
2674 if (c == *s1) {
2675 c = '.';
2676 if (*++s1) {
2677 s2 = s;
2678 for (;;) {
2679 if (*++s2 != *s1) {
2680 c = 0;
2681 break;
2683 if (!*++s1) {
2684 s = s2;
2685 break;
2690 #endif
2691 if (c == '.') {
2692 c = *++s;
2693 bc.dp1 = s - s0;
2694 bc.dplen = bc.dp1 - bc.dp0;
2695 if (!nd) {
2696 for (; c == '0'; c = *++s) {
2697 nz++;
2699 if (c > '0' && c <= '9') {
2700 bc.dp0 = s0 - s;
2701 bc.dp1 = bc.dp0 + bc.dplen;
2702 s0 = s;
2703 nf += nz;
2704 nz = 0;
2705 goto have_dig;
2707 goto dig_done;
2709 for (; c >= '0' && c <= '9'; c = *++s) {
2710 have_dig:
2711 nz++;
2712 if (c -= '0') {
2713 nf += nz;
2714 for (i = 1; i < nz; i++)
2715 if (nd++ < 9) {
2716 y *= 10;
2717 } else if (nd <= DBL_DIG + 1) {
2718 z *= 10;
2720 if (nd++ < 9) {
2721 y = 10 * y + c;
2722 } else if (nd <= DBL_DIG + 1) {
2723 z = 10 * z + c;
2725 nz = nz1 = 0;
2729 dig_done:
2730 e = 0;
2731 if (c == 'e' || c == 'E') {
2732 if (!nd && !nz && !nz0) {
2733 goto ret0;
2735 s00 = s;
2736 esign = 0;
2737 switch (c = *++s) {
2738 case '-':
2739 esign = 1;
2740 case '+':
2741 c = *++s;
2743 if (c >= '0' && c <= '9') {
2744 while (c == '0') {
2745 c = *++s;
2747 if (c > '0' && c <= '9') {
2748 L = c - '0';
2749 s1 = s;
2750 while ((c = *++s) >= '0' && c <= '9') {
2751 L = 10 * L + c - '0';
2753 if (s - s1 > 8 || L > 19999)
2754 /* Avoid confusion from exponents
2755 * so large that e might overflow.
2758 e = 19999; /* safe for 16 bit ints */
2759 } else {
2760 e = (int)L;
2762 if (esign) {
2763 e = -e;
2765 } else {
2766 e = 0;
2768 } else {
2769 s = s00;
2772 if (!nd) {
2773 if (!nz && !nz0) {
2774 #ifdef INFNAN_CHECK
2775 /* Check for Nan and Infinity */
2776 if (!bc.dplen) switch (c) {
2777 case 'i':
2778 case 'I':
2779 if (match(&s, "nf")) {
2780 --s;
2781 if (!match(&s, "inity")) {
2782 ++s;
2784 word0(&rv) = 0x7ff00000;
2785 word1(&rv) = 0;
2786 goto ret;
2788 break;
2789 case 'n':
2790 case 'N':
2791 if (match(&s, "an")) {
2792 word0(&rv) = NAN_WORD0;
2793 word1(&rv) = NAN_WORD1;
2794 # ifndef No_Hex_NaN
2795 if (*s == '(') { /*)*/
2796 hexnan(&rv, &s);
2798 # endif
2799 goto ret;
2802 #endif /* INFNAN_CHECK */
2803 ret0:
2804 s = s00;
2805 sign = 0;
2807 goto ret;
2809 bc.e0 = e1 = e -= nf;
2811 /* Now we have nd0 digits, starting at s0, followed by a
2812 * decimal point, followed by nd-nd0 digits. The number we're
2813 * after is the integer represented by those digits times
2814 * 10**e */
2816 if (!nd0) {
2817 nd0 = nd;
2819 k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
2820 dval(&rv) = y;
2821 if (k > 9) {
2822 #ifdef SET_INEXACT
2823 if (k > DBL_DIG) {
2824 oldinexact = get_inexact();
2826 #endif
2827 dval(&rv) = tens[k - 9] * dval(&rv) + z;
2829 bd0 = 0;
2830 if (nd <= DBL_DIG
2831 #ifndef RND_PRODQUOT
2832 # ifndef Honor_FLT_ROUNDS
2833 && Flt_Rounds == 1
2834 # endif
2835 #endif
2837 if (!e) {
2838 goto ret;
2840 #ifndef ROUND_BIASED_without_Round_Up
2841 if (e > 0) {
2842 if (e <= Ten_pmax) {
2843 # ifdef VAX
2844 goto vax_ovfl_check;
2845 # else
2846 # ifdef Honor_FLT_ROUNDS
2847 /* round correctly FLT_ROUNDS = 2 or 3 */
2848 if (sign) {
2849 rv.d = -rv.d;
2850 sign = 0;
2852 # endif
2853 /* rv = */ rounded_product(dval(&rv), tens[e]);
2854 goto ret;
2855 # endif
2857 i = DBL_DIG - nd;
2858 if (e <= Ten_pmax + i) {
2859 /* A fancier test would sometimes let us do
2860 * this for larger i values.
2862 # ifdef Honor_FLT_ROUNDS
2863 /* round correctly FLT_ROUNDS = 2 or 3 */
2864 if (sign) {
2865 rv.d = -rv.d;
2866 sign = 0;
2868 # endif
2869 e -= i;
2870 dval(&rv) *= tens[i];
2871 # ifdef VAX
2872 /* VAX exponent range is so narrow we must
2873 * worry about overflow here...
2875 vax_ovfl_check:
2876 word0(&rv) -= P * Exp_msk1;
2877 /* rv = */ rounded_product(dval(&rv), tens[e]);
2878 if ((word0(&rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) {
2879 goto ovfl;
2881 word0(&rv) += P * Exp_msk1;
2882 # else
2883 /* rv = */ rounded_product(dval(&rv), tens[e]);
2884 # endif
2885 goto ret;
2888 # ifndef Inaccurate_Divide
2889 else if (e >= -Ten_pmax) {
2890 # ifdef Honor_FLT_ROUNDS
2891 /* round correctly FLT_ROUNDS = 2 or 3 */
2892 if (sign) {
2893 rv.d = -rv.d;
2894 sign = 0;
2896 # endif
2897 /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
2898 goto ret;
2900 # endif
2901 #endif /* ROUND_BIASED_without_Round_Up */
2903 e1 += nd - k;
2905 #ifdef IEEE_Arith
2906 # ifdef SET_INEXACT
2907 bc.inexact = 1;
2908 if (k <= DBL_DIG) {
2909 oldinexact = get_inexact();
2911 # endif
2912 # ifdef Avoid_Underflow
2913 bc.scale = 0;
2914 # endif
2915 # ifdef Honor_FLT_ROUNDS
2916 if (bc.rounding >= 2) {
2917 if (sign) {
2918 bc.rounding = bc.rounding == 2 ? 0 : 2;
2919 } else if (bc.rounding != 2) {
2920 bc.rounding = 0;
2923 # endif
2924 #endif /*IEEE_Arith*/
2926 /* Get starting approximation = rv * 10**e1 */
2928 if (e1 > 0) {
2929 if ((i = e1 & 15)) {
2930 dval(&rv) *= tens[i];
2932 if (e1 &= ~15) {
2933 if (e1 > DBL_MAX_10_EXP) {
2934 ovfl:
2935 /* Can't trust HUGE_VAL */
2936 #ifdef IEEE_Arith
2937 # ifdef Honor_FLT_ROUNDS
2938 switch (bc.rounding) {
2939 case 0: /* toward 0 */
2940 case 3: /* toward -infinity */
2941 word0(&rv) = Big0;
2942 word1(&rv) = Big1;
2943 break;
2944 default:
2945 word0(&rv) = Exp_mask;
2946 word1(&rv) = 0;
2948 # else /*Honor_FLT_ROUNDS*/
2949 word0(&rv) = Exp_mask;
2950 word1(&rv) = 0;
2951 # endif /*Honor_FLT_ROUNDS*/
2952 # ifdef SET_INEXACT
2953 /* set overflow bit */
2954 dval(&rv0) = 1e300;
2955 dval(&rv0) *= dval(&rv0);
2956 # endif
2957 #else /*IEEE_Arith*/
2958 word0(&rv) = Big0;
2959 word1(&rv) = Big1;
2960 #endif /*IEEE_Arith*/
2961 range_err:
2962 if (bd0) {
2963 Bfree(bb);
2964 Bfree(bd);
2965 Bfree(bs);
2966 Bfree(bd0);
2967 Bfree(delta);
2969 #ifndef NO_ERRNO
2970 errno = ERANGE;
2971 #endif
2972 goto ret;
2974 e1 >>= 4;
2975 for (j = 0; e1 > 1; j++, e1 >>= 1)
2976 if (e1 & 1) {
2977 dval(&rv) *= bigtens[j];
2979 /* The last multiplication could overflow. */
2980 word0(&rv) -= P * Exp_msk1;
2981 dval(&rv) *= bigtens[j];
2982 if ((z = word0(&rv) & Exp_mask) > Exp_msk1 * (DBL_MAX_EXP + Bias - P)) {
2983 goto ovfl;
2985 if (z > Exp_msk1 * (DBL_MAX_EXP + Bias - 1 - P)) {
2986 /* set to largest number */
2987 /* (Can't trust DBL_MAX) */
2988 word0(&rv) = Big0;
2989 word1(&rv) = Big1;
2990 } else {
2991 word0(&rv) += P * Exp_msk1;
2994 } else if (e1 < 0) {
2995 e1 = -e1;
2996 if ((i = e1 & 15)) {
2997 dval(&rv) /= tens[i];
2999 if (e1 >>= 4) {
3000 if (e1 >= 1 << n_bigtens) {
3001 goto undfl;
3003 #ifdef Avoid_Underflow
3004 if (e1 & Scale_Bit) {
3005 bc.scale = 2 * P;
3007 for (j = 0; e1 > 0; j++, e1 >>= 1)
3008 if (e1 & 1) {
3009 dval(&rv) *= tinytens[j];
3011 if (bc.scale &&
3012 (j = 2 * P + 1 - ((word0(&rv) & Exp_mask) >> Exp_shift)) > 0) {
3013 /* scaled rv is denormal; clear j low bits */
3014 if (j >= 32) {
3015 if (j > 54) {
3016 goto undfl;
3018 word1(&rv) = 0;
3019 if (j >= 53) {
3020 word0(&rv) = (P + 2) * Exp_msk1;
3021 } else {
3022 word0(&rv) &= 0xffffffff << (j - 32);
3024 } else {
3025 word1(&rv) &= 0xffffffff << j;
3028 #else
3029 for (j = 0; e1 > 1; j++, e1 >>= 1)
3030 if (e1 & 1) {
3031 dval(&rv) *= tinytens[j];
3033 /* The last multiplication could underflow. */
3034 dval(&rv0) = dval(&rv);
3035 dval(&rv) *= tinytens[j];
3036 if (!dval(&rv)) {
3037 dval(&rv) = 2. * dval(&rv0);
3038 dval(&rv) *= tinytens[j];
3039 #endif
3040 if (!dval(&rv)) {
3041 undfl:
3042 dval(&rv) = 0.;
3043 goto range_err;
3045 #ifndef Avoid_Underflow
3046 word0(&rv) = Tiny0;
3047 word1(&rv) = Tiny1;
3048 /* The refinement below will clean
3049 * this approximation up.
3052 #endif
3056 /* Now the hard part -- adjusting rv to the correct value.*/
3058 /* Put digits into bd: true value = bd * 10^e */
3060 bc.nd = nd - nz1;
3061 #ifndef NO_STRTOD_BIGCOMP
3062 bc.nd0 = nd0; /* Only needed if nd > strtod_diglim, but done here */
3063 /* to silence an erroneous warning about bc.nd0 */
3064 /* possibly not being initialized. */
3065 if (nd > strtod_diglim) {
3066 /* ASSERT(strtod_diglim >= 18); 18 == one more than the */
3067 /* minimum number of decimal digits to distinguish double values */
3068 /* in IEEE arithmetic. */
3069 i = j = 18;
3070 if (i > nd0) {
3071 j += bc.dplen;
3073 for (;;) {
3074 if (--j < bc.dp1 && j >= bc.dp0) {
3075 j = bc.dp0 - 1;
3077 if (s0[j] != '0') {
3078 break;
3080 --i;
3082 e += nd - i;
3083 nd = i;
3084 if (nd0 > nd) {
3085 nd0 = nd;
3087 if (nd < 9) { /* must recompute y */
3088 y = 0;
3089 for (i = 0; i < nd0; ++i) {
3090 y = 10 * y + s0[i] - '0';
3092 for (j = bc.dp1; i < nd; ++i) {
3093 y = 10 * y + s0[j++] - '0';
3097 #endif
3098 bd0 = s2b(s0, nd0, nd, y, bc.dplen);
3100 for (;;) {
3101 bd = Balloc(bd0->k);
3102 Bcopy(bd, bd0);
3103 bb = d2b(&rv, &bbe, &bbbits); /* rv = bb * 2^bbe */
3104 bs = i2b(1);
3106 if (e >= 0) {
3107 bb2 = bb5 = 0;
3108 bd2 = bd5 = e;
3109 } else {
3110 bb2 = bb5 = -e;
3111 bd2 = bd5 = 0;
3113 if (bbe >= 0) {
3114 bb2 += bbe;
3115 } else {
3116 bd2 -= bbe;
3118 bs2 = bb2;
3119 #ifdef Honor_FLT_ROUNDS
3120 if (bc.rounding != 1) {
3121 bs2++;
3123 #endif
3124 #ifdef Avoid_Underflow
3125 Lsb = LSB;
3126 Lsb1 = 0;
3127 j = bbe - bc.scale;
3128 i = j + bbbits - 1; /* logb(rv) */
3129 j = P + 1 - bbbits;
3130 if (i < Emin) { /* denormal */
3131 i = Emin - i;
3132 j -= i;
3133 if (i < 32) {
3134 Lsb <<= i;
3135 } else if (i < 52) {
3136 Lsb1 = Lsb << (i - 32);
3137 } else {
3138 Lsb1 = Exp_mask;
3141 #else /*Avoid_Underflow*/
3142 # ifdef Sudden_Underflow
3143 # ifdef IBM
3144 j = 1 + 4 * P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
3145 # else
3146 j = P + 1 - bbbits;
3147 # endif
3148 # else /*Sudden_Underflow*/
3149 j = bbe;
3150 i = j + bbbits - 1; /* logb(rv) */
3151 if (i < Emin) { /* denormal */
3152 j += P - Emin;
3153 } else {
3154 j = P + 1 - bbbits;
3156 # endif /*Sudden_Underflow*/
3157 #endif /*Avoid_Underflow*/
3158 bb2 += j;
3159 bd2 += j;
3160 #ifdef Avoid_Underflow
3161 bd2 += bc.scale;
3162 #endif
3163 i = bb2 < bd2 ? bb2 : bd2;
3164 if (i > bs2) {
3165 i = bs2;
3167 if (i > 0) {
3168 bb2 -= i;
3169 bd2 -= i;
3170 bs2 -= i;
3172 if (bb5 > 0) {
3173 bs = pow5mult(bs, bb5);
3174 bb1 = mult(bs, bb);
3175 Bfree(bb);
3176 bb = bb1;
3178 if (bb2 > 0) {
3179 bb = lshift(bb, bb2);
3181 if (bd5 > 0) {
3182 bd = pow5mult(bd, bd5);
3184 if (bd2 > 0) {
3185 bd = lshift(bd, bd2);
3187 if (bs2 > 0) {
3188 bs = lshift(bs, bs2);
3190 delta = diff(bb, bd);
3191 bc.dsign = delta->sign;
3192 delta->sign = 0;
3193 i = cmp(delta, bs);
3194 #ifndef NO_STRTOD_BIGCOMP /*{*/
3195 if (bc.nd > nd && i <= 0) {
3196 if (bc.dsign) {
3197 /* Must use bigcomp(). */
3198 req_bigcomp = 1;
3199 break;
3201 # ifdef Honor_FLT_ROUNDS
3202 if (bc.rounding != 1) {
3203 if (i < 0) {
3204 req_bigcomp = 1;
3205 break;
3207 } else
3208 # endif
3209 i = -1; /* Discarded digits make delta smaller. */
3211 #endif /*}*/
3212 #ifdef Honor_FLT_ROUNDS /*{*/
3213 if (bc.rounding != 1) {
3214 if (i < 0) {
3215 /* Error is less than an ulp */
3216 if (!delta->x[0] && delta->wds <= 1) {
3217 /* exact */
3218 # ifdef SET_INEXACT
3219 bc.inexact = 0;
3220 # endif
3221 break;
3223 if (bc.rounding) {
3224 if (bc.dsign) {
3225 adj.d = 1.;
3226 goto apply_adj;
3228 } else if (!bc.dsign) {
3229 adj.d = -1.;
3230 if (!word1(&rv) && !(word0(&rv) & Frac_mask)) {
3231 y = word0(&rv) & Exp_mask;
3232 # ifdef Avoid_Underflow
3233 if (!bc.scale || y > 2 * P * Exp_msk1)
3234 # else
3235 if (y)
3236 # endif
3238 delta = lshift(delta, Log2P);
3239 if (cmp(delta, bs) <= 0) {
3240 adj.d = -0.5;
3244 apply_adj:
3245 # ifdef Avoid_Underflow /*{*/
3246 if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1) {
3247 word0(&adj) += (2 * P + 1) * Exp_msk1 - y;
3249 # else
3250 # ifdef Sudden_Underflow
3251 if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) {
3252 word0(&rv) += P * Exp_msk1;
3253 dval(&rv) += adj.d * ulp(dval(&rv));
3254 word0(&rv) -= P * Exp_msk1;
3255 } else
3256 # endif /*Sudden_Underflow*/
3257 # endif /*Avoid_Underflow}*/
3258 dval(&rv) += adj.d * ulp(&rv);
3260 break;
3262 adj.d = ratio(delta, bs);
3263 if (adj.d < 1.) {
3264 adj.d = 1.;
3266 if (adj.d <= 0x7ffffffe) {
3267 /* adj = rounding ? ceil(adj) : floor(adj); */
3268 y = adj.d;
3269 if (y != adj.d) {
3270 if (!((bc.rounding >> 1) ^ bc.dsign)) {
3271 y++;
3273 adj.d = y;
3276 # ifdef Avoid_Underflow /*{*/
3277 if (bc.scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1) {
3278 word0(&adj) += (2 * P + 1) * Exp_msk1 - y;
3280 # else
3281 # ifdef Sudden_Underflow
3282 if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) {
3283 word0(&rv) += P * Exp_msk1;
3284 adj.d *= ulp(dval(&rv));
3285 if (bc.dsign) {
3286 dval(&rv) += adj.d;
3287 } else {
3288 dval(&rv) -= adj.d;
3290 word0(&rv) -= P * Exp_msk1;
3291 goto cont;
3293 # endif /*Sudden_Underflow*/
3294 # endif /*Avoid_Underflow}*/
3295 adj.d *= ulp(&rv);
3296 if (bc.dsign) {
3297 if (word0(&rv) == Big0 && word1(&rv) == Big1) {
3298 goto ovfl;
3300 dval(&rv) += adj.d;
3301 } else {
3302 dval(&rv) -= adj.d;
3304 goto cont;
3306 #endif /*}Honor_FLT_ROUNDS*/
3308 if (i < 0) {
3309 /* Error is less than half an ulp -- check for
3310 * special case of mantissa a power of two.
3312 if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask
3313 #ifdef IEEE_Arith /*{*/
3314 # ifdef Avoid_Underflow
3315 || (word0(&rv) & Exp_mask) <= (2 * P + 1) * Exp_msk1
3316 # else
3317 || (word0(&rv) & Exp_mask) <= Exp_msk1
3318 # endif
3319 #endif /*}*/
3321 #ifdef SET_INEXACT
3322 if (!delta->x[0] && delta->wds <= 1) {
3323 bc.inexact = 0;
3325 #endif
3326 break;
3328 if (!delta->x[0] && delta->wds <= 1) {
3329 /* exact result */
3330 #ifdef SET_INEXACT
3331 bc.inexact = 0;
3332 #endif
3333 break;
3335 delta = lshift(delta, Log2P);
3336 if (cmp(delta, bs) > 0) {
3337 goto drop_down;
3339 break;
3341 if (i == 0) {
3342 /* exactly half-way between */
3343 if (bc.dsign) {
3344 if ((word0(&rv) & Bndry_mask1) == Bndry_mask1 &&
3345 word1(&rv) ==
3347 #ifdef Avoid_Underflow
3348 (bc.scale && (y = word0(&rv) & Exp_mask) <= 2 * P * Exp_msk1)
3349 ? (0xffffffff &
3350 (0xffffffff << (2 * P + 1 - (y >> Exp_shift))))
3352 #endif
3353 0xffffffff)) {
3354 /*boundary case -- increment exponent*/
3355 if (word0(&rv) == Big0 && word1(&rv) == Big1) {
3356 goto ovfl;
3358 word0(&rv) = (word0(&rv) & Exp_mask) + Exp_msk1
3359 #ifdef IBM
3360 | Exp_msk1 >> 4
3361 #endif
3363 word1(&rv) = 0;
3364 #ifdef Avoid_Underflow
3365 bc.dsign = 0;
3366 #endif
3367 break;
3369 } else if (!(word0(&rv) & Bndry_mask) && !word1(&rv)) {
3370 drop_down:
3371 /* boundary case -- decrement exponent */
3372 #ifdef Sudden_Underflow /*{{*/
3373 L = word0(&rv) & Exp_mask;
3374 # ifdef IBM
3375 if (L < Exp_msk1)
3376 # else
3377 # ifdef Avoid_Underflow
3378 if (L <= (bc.scale ? (2 * P + 1) * Exp_msk1 : Exp_msk1))
3379 # else
3380 if (L <= Exp_msk1)
3381 # endif /*Avoid_Underflow*/
3382 # endif /*IBM*/
3384 if (bc.nd > nd) {
3385 bc.uflchk = 1;
3386 break;
3388 goto undfl;
3390 L -= Exp_msk1;
3391 #else /*Sudden_Underflow}{*/
3392 # ifdef Avoid_Underflow
3393 if (bc.scale) {
3394 L = word0(&rv) & Exp_mask;
3395 if (L <= (2 * P + 1) * Exp_msk1) {
3396 if (L > (P + 2) * Exp_msk1)
3397 /* round even ==> */
3398 /* accept rv */
3400 break;
3402 /* rv = smallest denormal */
3403 if (bc.nd > nd) {
3404 bc.uflchk = 1;
3405 break;
3407 goto undfl;
3410 # endif /*Avoid_Underflow*/
3411 L = (word0(&rv) & Exp_mask) - Exp_msk1;
3412 #endif /*Sudden_Underflow}}*/
3413 word0(&rv) = L | Bndry_mask1;
3414 word1(&rv) = 0xffffffff;
3415 #ifdef IBM
3416 goto cont;
3417 #else
3418 # ifndef NO_STRTOD_BIGCOMP
3419 if (bc.nd > nd) {
3420 goto cont;
3422 # endif
3423 break;
3424 #endif
3426 #ifndef ROUND_BIASED
3427 # ifdef Avoid_Underflow
3428 if (Lsb1) {
3429 if (!(word0(&rv) & Lsb1)) {
3430 break;
3432 } else if (!(word1(&rv) & Lsb)) {
3433 break;
3435 # else
3436 if (!(word1(&rv) & LSB)) {
3437 break;
3439 # endif
3440 #endif
3441 if (bc.dsign)
3442 #ifdef Avoid_Underflow
3443 dval(&rv) += sulp(&rv, &bc);
3444 #else
3445 dval(&rv) += ulp(&rv);
3446 #endif
3447 #ifndef ROUND_BIASED
3448 else {
3449 # ifdef Avoid_Underflow
3450 dval(&rv) -= sulp(&rv, &bc);
3451 # else
3452 dval(&rv) -= ulp(&rv);
3453 # endif
3454 # ifndef Sudden_Underflow
3455 if (!dval(&rv)) {
3456 if (bc.nd > nd) {
3457 bc.uflchk = 1;
3458 break;
3460 goto undfl;
3462 # endif
3464 # ifdef Avoid_Underflow
3465 bc.dsign = 1 - bc.dsign;
3466 # endif
3467 #endif
3468 break;
3470 if ((aadj = ratio(delta, bs)) <= 2.) {
3471 if (bc.dsign) {
3472 aadj = aadj1 = 1.;
3473 } else if (word1(&rv) || word0(&rv) & Bndry_mask) {
3474 #ifndef Sudden_Underflow
3475 if (word1(&rv) == Tiny1 && !word0(&rv)) {
3476 if (bc.nd > nd) {
3477 bc.uflchk = 1;
3478 break;
3480 goto undfl;
3482 #endif
3483 aadj = 1.;
3484 aadj1 = -1.;
3485 } else {
3486 /* special case -- power of FLT_RADIX to be */
3487 /* rounded down... */
3489 if (aadj < 2. / FLT_RADIX) {
3490 aadj = 1. / FLT_RADIX;
3491 } else {
3492 aadj *= 0.5;
3494 aadj1 = -aadj;
3496 } else {
3497 aadj *= 0.5;
3498 aadj1 = bc.dsign ? aadj : -aadj;
3499 #ifdef Check_FLT_ROUNDS
3500 switch (bc.rounding) {
3501 case 2: /* towards +infinity */
3502 aadj1 -= 0.5;
3503 break;
3504 case 0: /* towards 0 */
3505 case 3: /* towards -infinity */
3506 aadj1 += 0.5;
3508 #else
3509 if (Flt_Rounds == 0) {
3510 aadj1 += 0.5;
3512 #endif /*Check_FLT_ROUNDS*/
3514 y = word0(&rv) & Exp_mask;
3516 /* Check for overflow */
3518 if (y == Exp_msk1 * (DBL_MAX_EXP + Bias - 1)) {
3519 dval(&rv0) = dval(&rv);
3520 word0(&rv) -= P * Exp_msk1;
3521 adj.d = aadj1 * ulp(&rv);
3522 dval(&rv) += adj.d;
3523 if ((word0(&rv) & Exp_mask) >= Exp_msk1 * (DBL_MAX_EXP + Bias - P)) {
3524 if (word0(&rv0) == Big0 && word1(&rv0) == Big1) {
3525 goto ovfl;
3527 word0(&rv) = Big0;
3528 word1(&rv) = Big1;
3529 goto cont;
3530 } else {
3531 word0(&rv) += P * Exp_msk1;
3533 } else {
3534 #ifdef Avoid_Underflow
3535 if (bc.scale && y <= 2 * P * Exp_msk1) {
3536 if (aadj <= 0x7fffffff) {
3537 if ((z = aadj) <= 0) {
3538 z = 1;
3540 aadj = z;
3541 aadj1 = bc.dsign ? aadj : -aadj;
3543 dval(&aadj2) = aadj1;
3544 word0(&aadj2) += (2 * P + 1) * Exp_msk1 - y;
3545 aadj1 = dval(&aadj2);
3546 adj.d = aadj1 * ulp(&rv);
3547 dval(&rv) += adj.d;
3548 if (rv.d == 0.)
3549 # ifdef NO_STRTOD_BIGCOMP
3550 goto undfl;
3551 # else
3553 if (bc.nd > nd) {
3554 bc.dsign = 1;
3556 break;
3558 # endif
3559 } else {
3560 adj.d = aadj1 * ulp(&rv);
3561 dval(&rv) += adj.d;
3563 #else
3564 # ifdef Sudden_Underflow
3565 if ((word0(&rv) & Exp_mask) <= P * Exp_msk1) {
3566 dval(&rv0) = dval(&rv);
3567 word0(&rv) += P * Exp_msk1;
3568 adj.d = aadj1 * ulp(&rv);
3569 dval(&rv) += adj.d;
3570 # ifdef IBM
3571 if ((word0(&rv) & Exp_mask) < P * Exp_msk1)
3572 # else
3573 if ((word0(&rv) & Exp_mask) <= P * Exp_msk1)
3574 # endif
3576 if (word0(&rv0) == Tiny0 && word1(&rv0) == Tiny1) {
3577 if (bc.nd > nd) {
3578 bc.uflchk = 1;
3579 break;
3581 goto undfl;
3583 word0(&rv) = Tiny0;
3584 word1(&rv) = Tiny1;
3585 goto cont;
3586 } else {
3587 word0(&rv) -= P * Exp_msk1;
3589 } else {
3590 adj.d = aadj1 * ulp(&rv);
3591 dval(&rv) += adj.d;
3593 # else /*Sudden_Underflow*/
3594 /* Compute adj so that the IEEE rounding rules will
3595 * correctly round rv + adj in some half-way cases.
3596 * If rv * ulp(rv) is denormalized (i.e.,
3597 * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
3598 * trouble from bits lost to denormalization;
3599 * example: 1.2e-307 .
3601 if (y <= (P - 1) * Exp_msk1 && aadj > 1.) {
3602 aadj1 = (double)(int)(aadj + 0.5);
3603 if (!bc.dsign) {
3604 aadj1 = -aadj1;
3607 adj.d = aadj1 * ulp(&rv);
3608 dval(&rv) += adj.d;
3609 # endif /*Sudden_Underflow*/
3610 #endif /*Avoid_Underflow*/
3612 z = word0(&rv) & Exp_mask;
3613 #ifndef SET_INEXACT
3614 if (bc.nd == nd) {
3615 # ifdef Avoid_Underflow
3616 if (!bc.scale)
3617 # endif
3618 if (y == z) {
3619 /* Can we stop now? */
3620 L = (Long)aadj;
3621 aadj -= L;
3622 /* The tolerances below are conservative. */
3623 if (bc.dsign || word1(&rv) || word0(&rv) & Bndry_mask) {
3624 if (aadj < .4999999 || aadj > .5000001) {
3625 break;
3627 } else if (aadj < .4999999 / FLT_RADIX) {
3628 break;
3632 #endif
3633 cont:
3634 Bfree(bb);
3635 Bfree(bd);
3636 Bfree(bs);
3637 Bfree(delta);
3639 Bfree(bb);
3640 Bfree(bd);
3641 Bfree(bs);
3642 Bfree(bd0);
3643 Bfree(delta);
3644 #ifndef NO_STRTOD_BIGCOMP
3645 if (req_bigcomp) {
3646 bd0 = 0;
3647 bc.e0 += nz1;
3648 bigcomp(&rv, s0, &bc);
3649 y = word0(&rv) & Exp_mask;
3650 if (y == Exp_mask) {
3651 goto ovfl;
3653 if (y == 0 && rv.d == 0.) {
3654 goto undfl;
3657 #endif
3658 #ifdef SET_INEXACT
3659 if (bc.inexact) {
3660 if (!oldinexact) {
3661 word0(&rv0) = Exp_1 + (70 << Exp_shift);
3662 word1(&rv0) = 0;
3663 dval(&rv0) += 1.;
3665 } else if (!oldinexact) {
3666 clear_inexact();
3668 #endif
3669 #ifdef Avoid_Underflow
3670 if (bc.scale) {
3671 word0(&rv0) = Exp_1 - 2 * P * Exp_msk1;
3672 word1(&rv0) = 0;
3673 dval(&rv) *= dval(&rv0);
3674 # ifndef NO_ERRNO
3675 /* try to avoid the bug of testing an 8087 register value */
3676 # ifdef IEEE_Arith
3677 if (!(word0(&rv) & Exp_mask))
3678 # else
3679 if (word0(&rv) == 0 && word1(&rv) == 0)
3680 # endif
3681 errno = ERANGE;
3682 # endif
3684 #endif /* Avoid_Underflow */
3685 #ifdef SET_INEXACT
3686 if (bc.inexact && !(word0(&rv) & Exp_mask)) {
3687 /* set underflow bit */
3688 dval(&rv0) = 1e-300;
3689 dval(&rv0) *= dval(&rv0);
3691 #endif
3692 ret: if (se) { *se = (char*)s; }
3693 return sign ? -dval(&rv) : dval(&rv);
3696 #ifndef MULTIPLE_THREADS
3697 static char* dtoa_result;
3698 #endif
3700 static char*
3701 #ifdef KR_headers
3702 rv_alloc(i)
3703 int i;
3704 #else
3705 rv_alloc(int i)
3706 #endif
3708 int j, k, *r;
3710 j = sizeof(ULong);
3711 for (k = 0; sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= i; j <<= 1) {
3712 k++;
3714 r = (int*)Balloc(k);
3715 *r = k;
3716 return
3717 #ifndef MULTIPLE_THREADS
3718 dtoa_result =
3719 #endif
3720 (char*)(r + 1);
3723 static char*
3724 #ifdef KR_headers
3725 nrv_alloc(s, rve, n)
3726 char *s, **rve;
3727 int n;
3728 #else
3729 nrv_alloc(const char* s, char** rve, int n)
3730 #endif
3732 char *rv, *t;
3734 t = rv = rv_alloc(n);
3735 while ((*t = *s++)) {
3736 t++;
3738 if (rve) {
3739 *rve = t;
3741 return rv;
3744 /* freedtoa(s) must be used to free values s returned by dtoa
3745 * when MULTIPLE_THREADS is #defined. It should be used in all cases,
3746 * but for consistency with earlier versions of dtoa, it is optional
3747 * when MULTIPLE_THREADS is not defined.
3750 void
3751 #ifdef KR_headers
3752 freedtoa(s) char* s;
3753 #else
3754 freedtoa(char* s)
3755 #endif
3757 Bigint* b = (Bigint*)((int*)s - 1);
3758 b->maxwds = 1 << (b->k = *(int*)b);
3759 Bfree(b);
3760 #ifndef MULTIPLE_THREADS
3761 if (s == dtoa_result) {
3762 dtoa_result = 0;
3764 #endif
3767 /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
3769 * Inspired by "How to Print Floating-Point Numbers Accurately" by
3770 * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
3772 * Modifications:
3773 * 1. Rather than iterating, we use a simple numeric overestimate
3774 * to determine k = floor(log10(d)). We scale relevant
3775 * quantities using O(log2(k)) rather than O(k) multiplications.
3776 * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
3777 * try to generate digits strictly left to right. Instead, we
3778 * compute with fewer bits and propagate the carry if necessary
3779 * when rounding the final digit up. This is often faster.
3780 * 3. Under the assumption that input will be rounded nearest,
3781 * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
3782 * That is, we allow equality in stopping tests when the
3783 * round-nearest rule will give the same floating-point value
3784 * as would satisfaction of the stopping test with strict
3785 * inequality.
3786 * 4. We remove common factors of powers of 2 from relevant
3787 * quantities.
3788 * 5. When converting floating-point integers less than 1e16,
3789 * we use floating-point arithmetic rather than resorting
3790 * to multiple-precision integers.
3791 * 6. When asked to produce fewer than 15 digits, we first try
3792 * to get by with floating-point arithmetic; we resort to
3793 * multiple-precision integer arithmetic only if we cannot
3794 * guarantee that the floating-point calculation has given
3795 * the correctly rounded result. For k requested digits and
3796 * "uniformly" distributed input, the probability is
3797 * something like 10^(k-15) that we must resort to the Long
3798 * calculation.
3801 char* dtoa
3802 #ifdef KR_headers
3803 (dd, mode, ndigits, decpt, sign, rve)
3804 double dd;
3805 int mode, ndigits, *decpt, *sign;
3806 char** rve;
3807 #else
3808 (double dd, int mode, int ndigits, int* decpt, int* sign, char** rve)
3809 #endif
3811 /* Arguments ndigits, decpt, sign are similar to those
3812 of ecvt and fcvt; trailing zeros are suppressed from
3813 the returned string. If not null, *rve is set to point
3814 to the end of the return value. If d is +-Infinity or NaN,
3815 then *decpt is set to 9999.
3817 mode:
3818 0 ==> shortest string that yields d when read in
3819 and rounded to nearest.
3820 1 ==> like 0, but with Steele & White stopping rule;
3821 e.g. with IEEE P754 arithmetic , mode 0 gives
3822 1e23 whereas mode 1 gives 9.999999999999999e22.
3823 2 ==> max(1,ndigits) significant digits. This gives a
3824 return value similar to that of ecvt, except
3825 that trailing zeros are suppressed.
3826 3 ==> through ndigits past the decimal point. This
3827 gives a return value similar to that from fcvt,
3828 except that trailing zeros are suppressed, and
3829 ndigits can be negative.
3830 4,5 ==> similar to 2 and 3, respectively, but (in
3831 round-nearest mode) with the tests of mode 0 to
3832 possibly return a shorter string that rounds to d.
3833 With IEEE arithmetic and compilation with
3834 -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
3835 as modes 2 and 3 when FLT_ROUNDS != 1.
3836 6-9 ==> Debugging modes similar to mode - 4: don't try
3837 fast floating-point estimate (if applicable).
3839 Values of mode other than 0-9 are treated as mode 0.
3841 Sufficient space is allocated to the return value
3842 to hold the suppressed trailing zeros.
3845 int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1, j, j1, k, k0,
3846 k_check, leftright, m2, m5, s2, s5, spec_case, try_quick;
3847 Long L;
3848 #ifndef Sudden_Underflow
3849 int denorm;
3850 ULong x;
3851 #endif
3852 Bigint *b, *b1, *delta, *mlo, *mhi, *S;
3853 U d2, eps, u;
3854 double ds;
3855 char *s, *s0;
3856 #ifndef No_leftright
3857 # ifdef IEEE_Arith
3858 U eps1;
3859 # endif
3860 #endif
3861 #ifdef SET_INEXACT
3862 int inexact, oldinexact;
3863 #endif
3864 #ifdef Honor_FLT_ROUNDS /*{*/
3865 int Rounding;
3866 # ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
3867 Rounding = Flt_Rounds;
3868 # else /*}{*/
3869 Rounding = 1;
3870 switch (fegetround()) {
3871 case FE_TOWARDZERO:
3872 Rounding = 0;
3873 break;
3874 case FE_UPWARD:
3875 Rounding = 2;
3876 break;
3877 case FE_DOWNWARD:
3878 Rounding = 3;
3880 # endif /*}}*/
3881 #endif /*}*/
3883 #ifndef MULTIPLE_THREADS
3884 if (dtoa_result) {
3885 freedtoa(dtoa_result);
3886 dtoa_result = 0;
3888 #endif
3890 u.d = dd;
3891 if (word0(&u) & Sign_bit) {
3892 /* set sign for everything, including 0's and NaNs */
3893 *sign = 1;
3894 word0(&u) &= ~Sign_bit; /* clear sign bit */
3895 } else {
3896 *sign = 0;
3899 #if defined(IEEE_Arith) + defined(VAX)
3900 # ifdef IEEE_Arith
3901 if ((word0(&u) & Exp_mask) == Exp_mask)
3902 # else
3903 if (word0(&u) == 0x8000)
3904 # endif
3906 /* Infinity or NaN */
3907 *decpt = 9999;
3908 # ifdef IEEE_Arith
3909 if (!word1(&u) && !(word0(&u) & 0xfffff)) {
3910 return nrv_alloc("Infinity", rve, 8);
3912 # endif
3913 return nrv_alloc("NaN", rve, 3);
3915 #endif
3916 #ifdef IBM
3917 dval(&u) += 0; /* normalize */
3918 #endif
3919 if (!dval(&u)) {
3920 *decpt = 1;
3921 return nrv_alloc("0", rve, 1);
3924 #ifdef SET_INEXACT
3925 try_quick = oldinexact = get_inexact();
3926 inexact = 1;
3927 #endif
3928 #ifdef Honor_FLT_ROUNDS
3929 if (Rounding >= 2) {
3930 if (*sign) {
3931 Rounding = Rounding == 2 ? 0 : 2;
3932 } else if (Rounding != 2) {
3933 Rounding = 0;
3936 #endif
3938 b = d2b(&u, &be, &bbits);
3939 #ifdef Sudden_Underflow
3940 i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1));
3941 #else
3942 if ((i = (int)(word0(&u) >> Exp_shift1 & (Exp_mask >> Exp_shift1)))) {
3943 #endif
3944 dval(&d2) = dval(&u);
3945 word0(&d2) &= Frac_mask1;
3946 word0(&d2) |= Exp_11;
3947 #ifdef IBM
3948 if (j = 11 - hi0bits(word0(&d2) & Frac_mask)) {
3949 dval(&d2) /= 1 << j;
3951 #endif
3953 /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
3954 * log10(x) = log(x) / log(10)
3955 * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
3956 * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
3958 * This suggests computing an approximation k to log10(d) by
3960 * k = (i - Bias)*0.301029995663981
3961 * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
3963 * We want k to be too large rather than too small.
3964 * The error in the first-order Taylor series approximation
3965 * is in our favor, so we just round up the constant enough
3966 * to compensate for any error in the multiplication of
3967 * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
3968 * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
3969 * adding 1e-13 to the constant term more than suffices.
3970 * Hence we adjust the constant term to 0.1760912590558.
3971 * (We could get a more accurate k by invoking log10,
3972 * but this is probably not worthwhile.)
3975 i -= Bias;
3976 #ifdef IBM
3977 i <<= 2;
3978 i += j;
3979 #endif
3980 #ifndef Sudden_Underflow
3981 denorm = 0;
3983 else {
3984 /* d is denormalized */
3986 i = bbits + be + (Bias + (P - 1) - 1);
3987 x = i > 32 ? word0(&u) << (64 - i) | word1(&u) >> (i - 32)
3988 : word1(&u) << (32 - i);
3989 dval(&d2) = x;
3990 word0(&d2) -= 31 * Exp_msk1; /* adjust exponent */
3991 i -= (Bias + (P - 1) - 1) + 1;
3992 denorm = 1;
3994 #endif
3995 ds = (dval(&d2) - 1.5) * 0.289529654602168 + 0.1760912590558 +
3996 i * 0.301029995663981;
3997 k = (int)ds;
3998 if (ds < 0. && ds != k) {
3999 k--; /* want k = floor(ds) */
4001 k_check = 1;
4002 if (k >= 0 && k <= Ten_pmax) {
4003 if (dval(&u) < tens[k]) {
4004 k--;
4006 k_check = 0;
4008 j = bbits - i - 1;
4009 if (j >= 0) {
4010 b2 = 0;
4011 s2 = j;
4012 } else {
4013 b2 = -j;
4014 s2 = 0;
4016 if (k >= 0) {
4017 b5 = 0;
4018 s5 = k;
4019 s2 += k;
4020 } else {
4021 b2 -= k;
4022 b5 = -k;
4023 s5 = 0;
4025 if (mode < 0 || mode > 9) {
4026 mode = 0;
4029 #ifndef SET_INEXACT
4030 # ifdef Check_FLT_ROUNDS
4031 try_quick = Rounding == 1;
4032 # else
4033 try_quick = 1;
4034 # endif
4035 #endif /*SET_INEXACT*/
4037 if (mode > 5) {
4038 mode -= 4;
4039 try_quick = 0;
4041 leftright = 1;
4042 ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */
4043 /* silence erroneous "gcc -Wall" warning. */
4044 switch (mode) {
4045 case 0:
4046 case 1:
4047 i = 18;
4048 ndigits = 0;
4049 break;
4050 case 2:
4051 leftright = 0;
4052 /* no break */
4053 case 4:
4054 if (ndigits <= 0) {
4055 ndigits = 1;
4057 ilim = ilim1 = i = ndigits;
4058 break;
4059 case 3:
4060 leftright = 0;
4061 /* no break */
4062 case 5:
4063 i = ndigits + k + 1;
4064 ilim = i;
4065 ilim1 = i - 1;
4066 if (i <= 0) {
4067 i = 1;
4070 s = s0 = rv_alloc(i);
4072 #ifdef Honor_FLT_ROUNDS
4073 if (mode > 1 && Rounding != 1) {
4074 leftright = 0;
4076 #endif
4078 if (ilim >= 0 && ilim <= Quick_max && try_quick) {
4079 /* Try to get by with floating-point arithmetic. */
4081 i = 0;
4082 dval(&d2) = dval(&u);
4083 k0 = k;
4084 ilim0 = ilim;
4085 ieps = 2; /* conservative */
4086 if (k > 0) {
4087 ds = tens[k & 0xf];
4088 j = k >> 4;
4089 if (j & Bletch) {
4090 /* prevent overflows */
4091 j &= Bletch - 1;
4092 dval(&u) /= bigtens[n_bigtens - 1];
4093 ieps++;
4095 for (; j; j >>= 1, i++)
4096 if (j & 1) {
4097 ieps++;
4098 ds *= bigtens[i];
4100 dval(&u) /= ds;
4101 } else if ((j1 = -k)) {
4102 dval(&u) *= tens[j1 & 0xf];
4103 for (j = j1 >> 4; j; j >>= 1, i++)
4104 if (j & 1) {
4105 ieps++;
4106 dval(&u) *= bigtens[i];
4109 if (k_check && dval(&u) < 1. && ilim > 0) {
4110 if (ilim1 <= 0) {
4111 goto fast_failed;
4113 ilim = ilim1;
4114 k--;
4115 dval(&u) *= 10.;
4116 ieps++;
4118 dval(&eps) = ieps * dval(&u) + 7.;
4119 word0(&eps) -= (P - 1) * Exp_msk1;
4120 if (ilim == 0) {
4121 S = mhi = 0;
4122 dval(&u) -= 5.;
4123 if (dval(&u) > dval(&eps)) {
4124 goto one_digit;
4126 if (dval(&u) < -dval(&eps)) {
4127 goto no_digits;
4129 goto fast_failed;
4131 #ifndef No_leftright
4132 if (leftright) {
4133 /* Use Steele & White method of only
4134 * generating digits needed.
4136 dval(&eps) = 0.5 / tens[ilim - 1] - dval(&eps);
4137 # ifdef IEEE_Arith
4138 if (k0 < 0 && j1 >= 307) {
4139 eps1.d = 1.01e256; /* 1.01 allows roundoff in the next few lines */
4140 word0(&eps1) -= Exp_msk1 * (Bias + P - 1);
4141 dval(&eps1) *= tens[j1 & 0xf];
4142 for (i = 0, j = (j1 - 256) >> 4; j; j >>= 1, i++)
4143 if (j & 1) {
4144 dval(&eps1) *= bigtens[i];
4146 if (eps.d < eps1.d) {
4147 eps.d = eps1.d;
4150 # endif
4151 for (i = 0;;) {
4152 L = dval(&u);
4153 dval(&u) -= L;
4154 *s++ = '0' + (int)L;
4155 if (1. - dval(&u) < dval(&eps)) {
4156 goto bump_up;
4158 if (dval(&u) < dval(&eps)) {
4159 goto ret1;
4161 if (++i >= ilim) {
4162 break;
4164 dval(&eps) *= 10.;
4165 dval(&u) *= 10.;
4167 } else {
4168 #endif
4169 /* Generate ilim digits, then fix them up. */
4170 dval(&eps) *= tens[ilim - 1];
4171 for (i = 1;; i++, dval(&u) *= 10.) {
4172 L = (Long)(dval(&u));
4173 if (!(dval(&u) -= L)) {
4174 ilim = i;
4176 *s++ = '0' + (int)L;
4177 if (i == ilim) {
4178 if (dval(&u) > 0.5 + dval(&eps)) {
4179 goto bump_up;
4180 } else if (dval(&u) < 0.5 - dval(&eps)) {
4181 while (*--s == '0');
4182 s++;
4183 goto ret1;
4185 break;
4188 #ifndef No_leftright
4190 #endif
4191 fast_failed:
4192 s = s0;
4193 dval(&u) = dval(&d2);
4194 k = k0;
4195 ilim = ilim0;
4198 /* Do we have a "small" integer? */
4200 if (be >= 0 && k <= Int_max) {
4201 /* Yes. */
4202 ds = tens[k];
4203 if (ndigits < 0 && ilim <= 0) {
4204 S = mhi = 0;
4205 if (ilim < 0 || dval(&u) <= 5 * ds) {
4206 goto no_digits;
4208 goto one_digit;
4210 for (i = 1;; i++, dval(&u) *= 10.) {
4211 L = (Long)(dval(&u) / ds);
4212 dval(&u) -= L * ds;
4213 #ifdef Check_FLT_ROUNDS
4214 /* If FLT_ROUNDS == 2, L will usually be high by 1 */
4215 if (dval(&u) < 0) {
4216 L--;
4217 dval(&u) += ds;
4219 #endif
4220 *s++ = '0' + (int)L;
4221 if (!dval(&u)) {
4222 #ifdef SET_INEXACT
4223 inexact = 0;
4224 #endif
4225 break;
4227 if (i == ilim) {
4228 #ifdef Honor_FLT_ROUNDS
4229 if (mode > 1) switch (Rounding) {
4230 case 0:
4231 goto ret1;
4232 case 2:
4233 goto bump_up;
4235 #endif
4236 dval(&u) += dval(&u);
4237 #ifdef ROUND_BIASED
4238 if (dval(&u) >= ds)
4239 #else
4240 if (dval(&u) > ds || (dval(&u) == ds && L & 1))
4241 #endif
4243 bump_up:
4244 while (*--s == '9')
4245 if (s == s0) {
4246 k++;
4247 *s = '0';
4248 break;
4250 ++*s++;
4252 break;
4255 goto ret1;
4258 m2 = b2;
4259 m5 = b5;
4260 mhi = mlo = 0;
4261 if (leftright) {
4263 #ifndef Sudden_Underflow
4264 denorm ? be + (Bias + (P - 1) - 1 + 1) :
4265 #endif
4266 #ifdef IBM
4267 1 + 4 * P - 3 - bbits + ((bbits + be - 1) & 3);
4268 #else
4269 1 + P - bbits;
4270 #endif
4271 b2 += i;
4272 s2 += i;
4273 mhi = i2b(1);
4275 if (m2 > 0 && s2 > 0) {
4276 i = m2 < s2 ? m2 : s2;
4277 b2 -= i;
4278 m2 -= i;
4279 s2 -= i;
4281 if (b5 > 0) {
4282 if (leftright) {
4283 if (m5 > 0) {
4284 mhi = pow5mult(mhi, m5);
4285 b1 = mult(mhi, b);
4286 Bfree(b);
4287 b = b1;
4289 if ((j = b5 - m5)) {
4290 b = pow5mult(b, j);
4292 } else {
4293 b = pow5mult(b, b5);
4296 S = i2b(1);
4297 if (s5 > 0) {
4298 S = pow5mult(S, s5);
4301 /* Check for special case that d is a normalized power of 2. */
4303 spec_case = 0;
4304 if ((mode < 2 || leftright)
4305 #ifdef Honor_FLT_ROUNDS
4306 && Rounding == 1
4307 #endif
4309 if (!word1(&u) && !(word0(&u) & Bndry_mask)
4310 #ifndef Sudden_Underflow
4311 && word0(&u) & (Exp_mask & ~Exp_msk1)
4312 #endif
4314 /* The special case */
4315 b2 += Log2P;
4316 s2 += Log2P;
4317 spec_case = 1;
4321 /* Arrange for convenient computation of quotients:
4322 * shift left if necessary so divisor has 4 leading 0 bits.
4324 * Perhaps we should just compute leading 28 bits of S once
4325 * and for all and pass them and a shift to quorem, so it
4326 * can do shifts and ors to compute the numerator for q.
4328 i = dshift(S, s2);
4329 b2 += i;
4330 m2 += i;
4331 s2 += i;
4332 if (b2 > 0) {
4333 b = lshift(b, b2);
4335 if (s2 > 0) {
4336 S = lshift(S, s2);
4338 if (k_check) {
4339 if (cmp(b, S) < 0) {
4340 k--;
4341 b = multadd(b, 10, 0); /* we botched the k estimate */
4342 if (leftright) {
4343 mhi = multadd(mhi, 10, 0);
4345 ilim = ilim1;
4348 if (ilim <= 0 && (mode == 3 || mode == 5)) {
4349 if (ilim < 0 || cmp(b, S = multadd(S, 5, 0)) <= 0) {
4350 /* no digits, fcvt style */
4351 no_digits:
4352 k = -1 - ndigits;
4353 goto ret;
4355 one_digit:
4356 *s++ = '1';
4357 k++;
4358 goto ret;
4360 if (leftright) {
4361 if (m2 > 0) {
4362 mhi = lshift(mhi, m2);
4365 /* Compute mlo -- check for special case
4366 * that d is a normalized power of 2.
4369 mlo = mhi;
4370 if (spec_case) {
4371 mhi = Balloc(mhi->k);
4372 Bcopy(mhi, mlo);
4373 mhi = lshift(mhi, Log2P);
4376 for (i = 1;; i++) {
4377 dig = quorem(b, S) + '0';
4378 /* Do we yet have the shortest decimal string
4379 * that will round to d?
4381 j = cmp(b, mlo);
4382 delta = diff(S, mhi);
4383 j1 = delta->sign ? 1 : cmp(b, delta);
4384 Bfree(delta);
4385 #ifndef ROUND_BIASED
4386 if (j1 == 0 && mode != 1 && !(word1(&u) & 1)
4387 # ifdef Honor_FLT_ROUNDS
4388 && Rounding >= 1
4389 # endif
4391 if (dig == '9') {
4392 goto round_9_up;
4394 if (j > 0) {
4395 dig++;
4397 # ifdef SET_INEXACT
4398 else if (!b->x[0] && b->wds <= 1) {
4399 inexact = 0;
4401 # endif
4402 *s++ = dig;
4403 goto ret;
4405 #endif
4406 if (j < 0 || (j == 0 && mode != 1
4407 #ifndef ROUND_BIASED
4408 && !(word1(&u) & 1)
4409 #endif
4410 )) {
4411 if (!b->x[0] && b->wds <= 1) {
4412 #ifdef SET_INEXACT
4413 inexact = 0;
4414 #endif
4415 goto accept_dig;
4417 #ifdef Honor_FLT_ROUNDS
4418 if (mode > 1) switch (Rounding) {
4419 case 0:
4420 goto accept_dig;
4421 case 2:
4422 goto keep_dig;
4424 #endif /*Honor_FLT_ROUNDS*/
4425 if (j1 > 0) {
4426 b = lshift(b, 1);
4427 j1 = cmp(b, S);
4428 #ifdef ROUND_BIASED
4429 if (j1 >= 0 /*)*/
4430 #else
4431 if ((j1 > 0 || (j1 == 0 && dig & 1))
4432 #endif
4433 && dig++ == '9')
4434 goto round_9_up;
4436 accept_dig:
4437 *s++ = dig;
4438 goto ret;
4440 if (j1 > 0) {
4441 #ifdef Honor_FLT_ROUNDS
4442 if (!Rounding) {
4443 goto accept_dig;
4445 #endif
4446 if (dig == '9') { /* possible if i == 1 */
4447 round_9_up:
4448 *s++ = '9';
4449 goto roundoff;
4451 *s++ = dig + 1;
4452 goto ret;
4454 #ifdef Honor_FLT_ROUNDS
4455 keep_dig:
4456 #endif
4457 *s++ = dig;
4458 if (i == ilim) {
4459 break;
4461 b = multadd(b, 10, 0);
4462 if (mlo == mhi) {
4463 mlo = mhi = multadd(mhi, 10, 0);
4464 } else {
4465 mlo = multadd(mlo, 10, 0);
4466 mhi = multadd(mhi, 10, 0);
4469 } else
4470 for (i = 1;; i++) {
4471 *s++ = dig = quorem(b, S) + '0';
4472 if (!b->x[0] && b->wds <= 1) {
4473 #ifdef SET_INEXACT
4474 inexact = 0;
4475 #endif
4476 goto ret;
4478 if (i >= ilim) {
4479 break;
4481 b = multadd(b, 10, 0);
4484 /* Round off last digit */
4486 #ifdef Honor_FLT_ROUNDS
4487 switch (Rounding) {
4488 case 0:
4489 goto trimzeros;
4490 case 2:
4491 goto roundoff;
4493 #endif
4494 b = lshift(b, 1);
4495 j = cmp(b, S);
4496 #ifdef ROUND_BIASED
4497 if (j >= 0)
4498 #else
4499 if (j > 0 || (j == 0 && dig & 1))
4500 #endif
4502 roundoff:
4503 while (*--s == '9')
4504 if (s == s0) {
4505 k++;
4506 *s++ = '1';
4507 goto ret;
4509 ++*s++;
4510 } else {
4511 #ifdef Honor_FLT_ROUNDS
4512 trimzeros:
4513 #endif
4514 while (*--s == '0');
4515 s++;
4517 ret: Bfree(S);
4518 if (mhi) {
4519 if (mlo && mlo != mhi) {
4520 Bfree(mlo);
4522 Bfree(mhi);
4524 ret1:
4525 #ifdef SET_INEXACT
4526 if (inexact) {
4527 if (!oldinexact) {
4528 word0(&u) = Exp_1 + (70 << Exp_shift);
4529 word1(&u) = 0;
4530 dval(&u) += 1.;
4533 else if (!oldinexact) {
4534 clear_inexact();
4536 #endif
4537 Bfree(b);
4538 *s = 0;
4539 *decpt = k + 1;
4540 if (rve) {
4541 *rve = s;
4543 return s0;
4545 #ifdef __cplusplus
4547 #endif