Home | History | Annotate | Download | only in gdtoa
      1 /****************************************************************
      2 
      3 The author of this software is David M. Gay.
      4 
      5 Copyright (C) 1998-2000 by Lucent Technologies
      6 All Rights Reserved
      7 
      8 Permission to use, copy, modify, and distribute this software and
      9 its documentation for any purpose and without fee is hereby
     10 granted, provided that the above copyright notice appear in all
     11 copies and that both that the copyright notice and this
     12 permission notice and warranty disclaimer appear in supporting
     13 documentation, and that the name of Lucent or any of its entities
     14 not be used in advertising or publicity pertaining to
     15 distribution of the software without specific, written prior
     16 permission.
     17 
     18 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     19 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
     20 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
     21 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     22 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
     23 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
     24 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
     25 THIS SOFTWARE.
     26 
     27 ****************************************************************/
     28 
     29 /* This is a variation on dtoa.c that converts arbitary binary
     30    floating-point formats to and from decimal notation.  It uses
     31    double-precision arithmetic internally, so there are still
     32    various #ifdefs that adapt the calculations to the native
     33    double-precision arithmetic (any of IEEE, VAX D_floating,
     34    or IBM mainframe arithmetic).
     35 
     36    Please send bug reports to David M. Gay (dmg at acm dot org,
     37    with " at " changed at "@" and " dot " changed to ".").
     38  */
     39 
     40 /* On a machine with IEEE extended-precision registers, it is
     41  * necessary to specify double-precision (53-bit) rounding precision
     42  * before invoking strtod or dtoa.  If the machine uses (the equivalent
     43  * of) Intel 80x87 arithmetic, the call
     44  *	_control87(PC_53, MCW_PC);
     45  * does this with many compilers.  Whether this or another call is
     46  * appropriate depends on the compiler; for this to work, it may be
     47  * necessary to #include "float.h" or another system-dependent header
     48  * file.
     49  */
     50 
     51 /* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
     52  *
     53  * This strtod returns a nearest machine number to the input decimal
     54  * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
     55  * broken by the IEEE round-even rule.  Otherwise ties are broken by
     56  * biased rounding (add half and chop).
     57  *
     58  * Inspired loosely by William D. Clinger's paper "How to Read Floating
     59  * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126].
     60  *
     61  * Modifications:
     62  *
     63  *	1. We only require IEEE, IBM, or VAX double-precision
     64  *		arithmetic (not IEEE double-extended).
     65  *	2. We get by with floating-point arithmetic in a case that
     66  *		Clinger missed -- when we're computing d * 10^n
     67  *		for a small integer d and the integer n is not too
     68  *		much larger than 22 (the maximum integer k for which
     69  *		we can represent 10^k exactly), we may be able to
     70  *		compute (d*10^k) * 10^(e-k) with just one roundoff.
     71  *	3. Rather than a bit-at-a-time adjustment of the binary
     72  *		result in the hard case, we use floating-point
     73  *		arithmetic to determine the adjustment to within
     74  *		one bit; only in really hard cases do we need to
     75  *		compute a second residual.
     76  *	4. Because of 3., we don't need a large table of powers of 10
     77  *		for ten-to-e (just some small tables, e.g. of 10^k
     78  *		for 0 <= k <= 22).
     79  */
     80 
     81 /*
     82  * #define IEEE_8087 for IEEE-arithmetic machines where the least
     83  *	significant byte has the lowest address.
     84  * #define IEEE_MC68k for IEEE-arithmetic machines where the most
     85  *	significant byte has the lowest address.
     86  * #define Long int on machines with 32-bit ints and 64-bit longs.
     87  * #define Sudden_Underflow for IEEE-format machines without gradual
     88  *	underflow (i.e., that flush to zero on underflow).
     89  * #define IBM for IBM mainframe-style floating-point arithmetic.
     90  * #define VAX for VAX-style floating-point arithmetic (D_floating).
     91  * #define No_leftright to omit left-right logic in fast floating-point
     92  *	computation of dtoa and gdtoa.  This will cause modes 4 and 5 to be
     93  *	treated the same as modes 2 and 3 for some inputs.
     94  * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
     95  * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
     96  *	that use extended-precision instructions to compute rounded
     97  *	products and quotients) with IBM.
     98  * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic
     99  *	that rounds toward +Infinity.
    100  * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased
    101  *	rounding when the underlying floating-point arithmetic uses
    102  *	unbiased rounding.  This prevent using ordinary floating-point
    103  *	arithmetic when the result could be computed with one rounding error.
    104  * #define Inaccurate_Divide for IEEE-format with correctly rounded
    105  *	products but inaccurate quotients, e.g., for Intel i860.
    106  * #define NO_LONG_LONG on machines that do not have a "long long"
    107  *	integer type (of >= 64 bits).  On such machines, you can
    108  *	#define Just_16 to store 16 bits per 32-bit Long when doing
    109  *	high-precision integer arithmetic.  Whether this speeds things
    110  *	up or slows things down depends on the machine and the number
    111  *	being converted.  If long long is available and the name is
    112  *	something other than "long long", #define Llong to be the name,
    113  *	and if "unsigned Llong" does not work as an unsigned version of
    114  *	Llong, #define #ULLong to be the corresponding unsigned type.
    115  * #define KR_headers for old-style C function headers.
    116  * #define Bad_float_h if your system lacks a float.h or if it does not
    117  *	define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
    118  *	FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
    119  * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
    120  *	if memory is available and otherwise does something you deem
    121  *	appropriate.  If MALLOC is undefined, malloc will be invoked
    122  *	directly -- and assumed always to succeed.  Similarly, if you
    123  *	want something other than the system's free() to be called to
    124  *	recycle memory acquired from MALLOC, #define FREE to be the
    125  *	name of the alternate routine.  (FREE or free is only called in
    126  *	pathological cases, e.g., in a gdtoa call after a gdtoa return in
    127  *	mode 3 with thousands of digits requested.)
    128  * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
    129  *	memory allocations from a private pool of memory when possible.
    130  *	When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,
    131  *	unless #defined to be a different length.  This default length
    132  *	suffices to get rid of MALLOC calls except for unusual cases,
    133  *	such as decimal-to-binary conversion of a very long string of
    134  *	digits.  When converting IEEE double precision values, the
    135  *	longest string gdtoa can return is about 751 bytes long.  For
    136  *	conversions by strtod of strings of 800 digits and all gdtoa
    137  *	conversions of IEEE doubles in single-threaded executions with
    138  *	8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with
    139  *	4-byte pointers, PRIVATE_MEM >= 7112 appears adequate.
    140  * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
    141  *	#defined automatically on IEEE systems.  On such systems,
    142  *	when INFNAN_CHECK is #defined, strtod checks
    143  *	for Infinity and NaN (case insensitively).
    144  *	When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
    145  *	strtodg also accepts (case insensitively) strings of the form
    146  *	NaN(x), where x is a string of hexadecimal digits (optionally
    147  *	preceded by 0x or 0X) and spaces; if there is only one string
    148  *	of hexadecimal digits, it is taken for the fraction bits of the
    149  *	resulting NaN; if there are two or more strings of hexadecimal
    150  *	digits, each string is assigned to the next available sequence
    151  *	of 32-bit words of fractions bits (starting with the most
    152  *	significant), right-aligned in each sequence.
    153  *	Unless GDTOA_NON_PEDANTIC_NANCHECK is #defined, input "NaN(...)"
    154  *	is consumed even when ... has the wrong form (in which case the
    155  *	"(...)" is consumed but ignored).
    156  * #define MULTIPLE_THREADS if the system offers preemptively scheduled
    157  *	multiple threads.  In this case, you must provide (or suitably
    158  *	#define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
    159  *	by FREE_DTOA_LOCK(n) for n = 0 or 1.  (The second lock, accessed
    160  *	in pow5mult, ensures lazy evaluation of only one copy of high
    161  *	powers of 5; omitting this lock would introduce a small
    162  *	probability of wasting memory, but would otherwise be harmless.)
    163  *	You must also invoke freedtoa(s) to free the value s returned by
    164  *	dtoa.  You may do so whether or not MULTIPLE_THREADS is #defined.
    165  * #define IMPRECISE_INEXACT if you do not care about the setting of
    166  *	the STRTOG_Inexact bits in the special case of doing IEEE double
    167  *	precision conversions (which could also be done by the strtod in
    168  *	dtoa.c).
    169  * #define NO_HEX_FP to disable recognition of C9x's hexadecimal
    170  *	floating-point constants.
    171  * #define -DNO_ERRNO to suppress setting errno (in strtod.c and
    172  *	strtodg.c).
    173  * #define NO_STRING_H to use private versions of memcpy.
    174  *	On some K&R systems, it may also be necessary to
    175  *	#define DECLARE_SIZE_T in this case.
    176  * #define USE_LOCALE to use the current locale's decimal_point value.
    177  */
    178 
    179 #ifndef GDTOAIMP_H_INCLUDED
    180 #define GDTOAIMP_H_INCLUDED
    181 #include "gdtoa.h"
    182 #include "gd_qnan.h"
    183 #ifdef Honor_FLT_ROUNDS
    184 #include <fenv.h>
    185 #endif
    186 
    187 #ifdef DEBUG
    188 #include "stdio.h"
    189 #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
    190 #endif
    191 
    192 #include "stdlib.h"
    193 #include "string.h"
    194 
    195 #ifdef KR_headers
    196 #define Char char
    197 #else
    198 #define Char void
    199 #endif
    200 
    201 #ifdef MALLOC
    202 extern Char *MALLOC ANSI((size_t));
    203 #else
    204 #define MALLOC malloc
    205 #endif
    206 
    207 #undef IEEE_Arith
    208 #undef Avoid_Underflow
    209 #ifdef IEEE_MC68k
    210 #define IEEE_Arith
    211 #endif
    212 #ifdef IEEE_8087
    213 #define IEEE_Arith
    214 #endif
    215 
    216 #include "errno.h"
    217 #ifdef Bad_float_h
    218 
    219 #ifdef IEEE_Arith
    220 #define DBL_DIG 15
    221 #define DBL_MAX_10_EXP 308
    222 #define DBL_MAX_EXP 1024
    223 #define FLT_RADIX 2
    224 #define DBL_MAX 1.7976931348623157e+308
    225 #endif
    226 
    227 #ifdef IBM
    228 #define DBL_DIG 16
    229 #define DBL_MAX_10_EXP 75
    230 #define DBL_MAX_EXP 63
    231 #define FLT_RADIX 16
    232 #define DBL_MAX 7.2370055773322621e+75
    233 #endif
    234 
    235 #ifdef VAX
    236 #define DBL_DIG 16
    237 #define DBL_MAX_10_EXP 38
    238 #define DBL_MAX_EXP 127
    239 #define FLT_RADIX 2
    240 #define DBL_MAX 1.7014118346046923e+38
    241 #define n_bigtens 2
    242 #endif
    243 
    244 #ifndef LONG_MAX
    245 #define LONG_MAX 2147483647
    246 #endif
    247 
    248 #else /* ifndef Bad_float_h */
    249 #include "float.h"
    250 #endif /* Bad_float_h */
    251 
    252 #ifdef IEEE_Arith
    253 #define Scale_Bit 0x10
    254 #define n_bigtens 5
    255 #endif
    256 
    257 #ifdef IBM
    258 #define n_bigtens 3
    259 #endif
    260 
    261 #ifdef VAX
    262 #define n_bigtens 2
    263 #endif
    264 
    265 #ifndef __MATH_H__
    266 #include "math.h"
    267 #endif
    268 
    269 #ifdef __cplusplus
    270 extern "C" {
    271 #endif
    272 
    273 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
    274 Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
    275 #endif
    276 
    277 typedef union { double d; ULong L[2]; } U;
    278 
    279 #ifdef IEEE_8087
    280 #define word0(x) (x)->L[1]
    281 #define word1(x) (x)->L[0]
    282 #else
    283 #define word0(x) (x)->L[0]
    284 #define word1(x) (x)->L[1]
    285 #endif
    286 #define dval(x) (x)->d
    287 
    288 /* The following definition of Storeinc is appropriate for MIPS processors.
    289  * An alternative that might be better on some machines is
    290  * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
    291  */
    292 #if defined(IEEE_8087) + defined(VAX)
    293 #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
    294 ((unsigned short *)a)[0] = (unsigned short)c, a++)
    295 #else
    296 #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
    297 ((unsigned short *)a)[1] = (unsigned short)c, a++)
    298 #endif
    299 
    300 /* #define P DBL_MANT_DIG */
    301 /* Ten_pmax = floor(P*log(2)/log(5)) */
    302 /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
    303 /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
    304 /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
    305 
    306 #ifdef IEEE_Arith
    307 #define Exp_shift  20
    308 #define Exp_shift1 20
    309 #define Exp_msk1    0x100000
    310 #define Exp_msk11   0x100000
    311 #define Exp_mask  0x7ff00000
    312 #define P 53
    313 #define Bias 1023
    314 #define Emin (-1022)
    315 #define Exp_1  0x3ff00000
    316 #define Exp_11 0x3ff00000
    317 #define Ebits 11
    318 #define Frac_mask  0xfffff
    319 #define Frac_mask1 0xfffff
    320 #define Ten_pmax 22
    321 #define Bletch 0x10
    322 #define Bndry_mask  0xfffff
    323 #define Bndry_mask1 0xfffff
    324 #define LSB 1
    325 #define Sign_bit 0x80000000
    326 #define Log2P 1
    327 #define Tiny0 0
    328 #define Tiny1 1
    329 #define Quick_max 14
    330 #define Int_max 14
    331 
    332 #ifndef Flt_Rounds
    333 #ifdef FLT_ROUNDS
    334 #define Flt_Rounds FLT_ROUNDS
    335 #else
    336 #define Flt_Rounds 1
    337 #endif
    338 #endif /*Flt_Rounds*/
    339 
    340 #else /* ifndef IEEE_Arith */
    341 #undef  Sudden_Underflow
    342 #define Sudden_Underflow
    343 #ifdef IBM
    344 #undef Flt_Rounds
    345 #define Flt_Rounds 0
    346 #define Exp_shift  24
    347 #define Exp_shift1 24
    348 #define Exp_msk1   0x1000000
    349 #define Exp_msk11  0x1000000
    350 #define Exp_mask  0x7f000000
    351 #define P 14
    352 #define Bias 65
    353 #define Exp_1  0x41000000
    354 #define Exp_11 0x41000000
    355 #define Ebits 8	/* exponent has 7 bits, but 8 is the right value in b2d */
    356 #define Frac_mask  0xffffff
    357 #define Frac_mask1 0xffffff
    358 #define Bletch 4
    359 #define Ten_pmax 22
    360 #define Bndry_mask  0xefffff
    361 #define Bndry_mask1 0xffffff
    362 #define LSB 1
    363 #define Sign_bit 0x80000000
    364 #define Log2P 4
    365 #define Tiny0 0x100000
    366 #define Tiny1 0
    367 #define Quick_max 14
    368 #define Int_max 15
    369 #else /* VAX */
    370 #undef Flt_Rounds
    371 #define Flt_Rounds 1
    372 #define Exp_shift  23
    373 #define Exp_shift1 7
    374 #define Exp_msk1    0x80
    375 #define Exp_msk11   0x800000
    376 #define Exp_mask  0x7f80
    377 #define P 56
    378 #define Bias 129
    379 #define Emin (-127)
    380 #define Exp_1  0x40800000
    381 #define Exp_11 0x4080
    382 #define Ebits 8
    383 #define Frac_mask  0x7fffff
    384 #define Frac_mask1 0xffff007f
    385 #define Ten_pmax 24
    386 #define Bletch 2
    387 #define Bndry_mask  0xffff007f
    388 #define Bndry_mask1 0xffff007f
    389 #define LSB 0x10000
    390 #define Sign_bit 0x8000
    391 #define Log2P 1
    392 #define Tiny0 0x80
    393 #define Tiny1 0
    394 #define Quick_max 15
    395 #define Int_max 15
    396 #endif /* IBM, VAX */
    397 #endif /* IEEE_Arith */
    398 
    399 #ifndef IEEE_Arith
    400 #define ROUND_BIASED
    401 #else
    402 #ifdef ROUND_BIASED_without_Round_Up
    403 #undef  ROUND_BIASED
    404 #define ROUND_BIASED
    405 #endif
    406 #endif
    407 
    408 #ifdef RND_PRODQUOT
    409 #define rounded_product(a,b) a = rnd_prod(a, b)
    410 #define rounded_quotient(a,b) a = rnd_quot(a, b)
    411 #ifdef KR_headers
    412 extern double rnd_prod(), rnd_quot();
    413 #else
    414 extern double rnd_prod(double, double), rnd_quot(double, double);
    415 #endif
    416 #else
    417 #define rounded_product(a,b) a *= b
    418 #define rounded_quotient(a,b) a /= b
    419 #endif
    420 
    421 #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
    422 #define Big1 0xffffffff
    423 
    424 #undef  Pack_16
    425 #ifndef Pack_32
    426 #define Pack_32
    427 #endif
    428 
    429 #ifdef NO_LONG_LONG
    430 #undef ULLong
    431 #ifdef Just_16
    432 #undef Pack_32
    433 #define Pack_16
    434 /* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
    435  * This makes some inner loops simpler and sometimes saves work
    436  * during multiplications, but it often seems to make things slightly
    437  * slower.  Hence the default is now to store 32 bits per Long.
    438  */
    439 #endif
    440 #else	/* long long available */
    441 #ifndef Llong
    442 #define Llong long long
    443 #endif
    444 #ifndef ULLong
    445 #define ULLong unsigned Llong
    446 #endif
    447 #endif /* NO_LONG_LONG */
    448 
    449 #ifdef Pack_32
    450 #define ULbits 32
    451 #define kshift 5
    452 #define kmask 31
    453 #define ALL_ON 0xffffffff
    454 #else
    455 #define ULbits 16
    456 #define kshift 4
    457 #define kmask 15
    458 #define ALL_ON 0xffff
    459 #endif
    460 
    461 #ifndef MULTIPLE_THREADS
    462 #define ACQUIRE_DTOA_LOCK(n)	/*nothing*/
    463 #define FREE_DTOA_LOCK(n)	/*nothing*/
    464 #else
    465 #include "thread_private.h"
    466 extern void *__dtoa_locks[];
    467 #define ACQUIRE_DTOA_LOCK(n)	_MUTEX_LOCK(&__dtoa_locks[n])
    468 #define FREE_DTOA_LOCK(n)	_MUTEX_UNLOCK(&__dtoa_locks[n])
    469 #endif
    470 
    471 #define Kmax 9
    472 
    473  struct
    474 Bigint {
    475 	struct Bigint *next;
    476 	int k, maxwds, sign, wds;
    477 	ULong x[1];
    478 	};
    479 
    480  typedef struct Bigint Bigint;
    481 
    482 #ifdef NO_STRING_H
    483 #ifdef DECLARE_SIZE_T
    484 typedef unsigned int size_t;
    485 #endif
    486 extern void memcpy_D2A ANSI((void*, const void*, size_t));
    487 #define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
    488 #else /* !NO_STRING_H */
    489 #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
    490 #endif /* NO_STRING_H */
    491 
    492 #define dtoa __dtoa
    493 #define gdtoa __gdtoa
    494 #define freedtoa __freedtoa
    495 #define strtodg __strtodg
    496 #define g_ddfmt __g_ddfmt
    497 #define g_dfmt __g_dfmt
    498 #define g_ffmt __g_ffmt
    499 #define g_Qfmt __g_Qfmt
    500 #define g_xfmt __g_xfmt
    501 #define g_xLfmt __g_xLfmt
    502 #define strtoId __strtoId
    503 #define strtoIdd __strtoIdd
    504 #define strtoIf __strtoIf
    505 #define strtoIQ __strtoIQ
    506 #define strtoIx __strtoIx
    507 #define strtoIxL __strtoIxL
    508 #define strtord __strtord
    509 #define strtordd __strtordd
    510 #define strtorf __strtorf
    511 #define strtorQ __strtorQ
    512 #define strtorx __strtorx
    513 #define strtorxL __strtorxL
    514 #define strtodI __strtodI
    515 #define strtopd __strtopd
    516 #define strtopdd __strtopdd
    517 #define strtopf __strtopf
    518 #define strtopQ __strtopQ
    519 #define strtopx __strtopx
    520 #define strtopxL __strtopxL
    521 
    522 #define Balloc __Balloc_D2A
    523 #define Bfree __Bfree_D2A
    524 #define ULtoQ __ULtoQ_D2A
    525 #define ULtof __ULtof_D2A
    526 #define ULtod __ULtod_D2A
    527 #define ULtodd __ULtodd_D2A
    528 #define ULtox __ULtox_D2A
    529 #define ULtoxL __ULtoxL_D2A
    530 #define any_on __any_on_D2A
    531 #define b2d __b2d_D2A
    532 #define bigtens __bigtens_D2A
    533 #define cmp __cmp_D2A
    534 #define copybits __copybits_D2A
    535 #define d2b __d2b_D2A
    536 #define decrement __decrement_D2A
    537 #define diff __diff_D2A
    538 #define dtoa_result __dtoa_result_D2A
    539 #define g__fmt __g__fmt_D2A
    540 #define gethex __gethex_D2A
    541 #define hexdig __hexdig_D2A
    542 #define hexnan __hexnan_D2A
    543 #define hi0bits(x) __hi0bits_D2A((ULong)(x))
    544 #define hi0bits_D2A __hi0bits_D2A
    545 #define i2b __i2b_D2A
    546 #define increment __increment_D2A
    547 #define lo0bits __lo0bits_D2A
    548 #define lshift __lshift_D2A
    549 #define match __match_D2A
    550 #define mult __mult_D2A
    551 #define multadd __multadd_D2A
    552 #define nrv_alloc __nrv_alloc_D2A
    553 #define pow5mult __pow5mult_D2A
    554 #define quorem __quorem_D2A
    555 #define ratio __ratio_D2A
    556 #define rshift __rshift_D2A
    557 #define rv_alloc __rv_alloc_D2A
    558 #define s2b __s2b_D2A
    559 #define set_ones __set_ones_D2A
    560 #define strcp __strcp_D2A
    561 #define strtoIg __strtoIg_D2A
    562 #define sulp __sulp_D2A
    563 #define sum __sum_D2A
    564 #define tens __tens_D2A
    565 #define tinytens __tinytens_D2A
    566 #define tinytens __tinytens_D2A
    567 #define trailz __trailz_D2A
    568 #define ulp __ulp_D2A
    569 
    570  extern char *dtoa_result;
    571  extern CONST double bigtens[], tens[], tinytens[];
    572  extern unsigned char hexdig[];
    573 
    574  extern Bigint *Balloc ANSI((int));
    575  extern void Bfree ANSI((Bigint*));
    576  extern void ULtof ANSI((ULong*, ULong*, Long, int));
    577  extern void ULtod ANSI((ULong*, ULong*, Long, int));
    578  extern void ULtodd ANSI((ULong*, ULong*, Long, int));
    579  extern void ULtoQ ANSI((ULong*, ULong*, Long, int));
    580  extern void ULtox ANSI((UShort*, ULong*, Long, int));
    581  extern void ULtoxL ANSI((ULong*, ULong*, Long, int));
    582  extern ULong any_on ANSI((Bigint*, int));
    583  extern double b2d ANSI((Bigint*, int*));
    584  extern int cmp ANSI((Bigint*, Bigint*));
    585  extern void copybits ANSI((ULong*, int, Bigint*));
    586  extern Bigint *d2b ANSI((double, int*, int*));
    587  extern void decrement ANSI((Bigint*));
    588  extern Bigint *diff ANSI((Bigint*, Bigint*));
    589  extern char *dtoa ANSI((double d, int mode, int ndigits,
    590 			int *decpt, int *sign, char **rve));
    591  extern char *g__fmt ANSI((char*, char*, char*, int, ULong, size_t));
    592  extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int));
    593  extern void __hexdig_init_D2A(Void);
    594  extern int hexnan ANSI((CONST char**, FPI*, ULong*));
    595  extern int hi0bits_D2A ANSI((ULong));
    596  extern Bigint *i2b ANSI((int));
    597  extern Bigint *increment ANSI((Bigint*));
    598  extern int lo0bits ANSI((ULong*));
    599  extern Bigint *lshift ANSI((Bigint*, int));
    600  extern int match ANSI((CONST char**, char*));
    601  extern Bigint *mult ANSI((Bigint*, Bigint*));
    602  extern Bigint *multadd ANSI((Bigint*, int, int));
    603  extern char *nrv_alloc ANSI((char*, char **, int));
    604  extern Bigint *pow5mult ANSI((Bigint*, int));
    605  extern int quorem ANSI((Bigint*, Bigint*));
    606  extern double ratio ANSI((Bigint*, Bigint*));
    607  extern void rshift ANSI((Bigint*, int));
    608  extern char *rv_alloc ANSI((int));
    609  extern Bigint *s2b ANSI((CONST char*, int, int, ULong, int));
    610  extern Bigint *set_ones ANSI((Bigint*, int));
    611  extern char *strcp ANSI((char*, const char*));
    612  extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*));
    613  extern double strtod ANSI((const char *s00, char **se));
    614  extern Bigint *sum ANSI((Bigint*, Bigint*));
    615  extern int trailz ANSI((Bigint*));
    616  extern double ulp ANSI((U*));
    617 
    618 #ifdef __cplusplus
    619 }
    620 #endif
    621 /*
    622  * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c.  Prior to
    623  * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0,
    624  * respectively), but now are determined by compiling and running
    625  * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1.
    626  * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=...
    627  * and -DNAN_WORD1=...  values if necessary.  This should still work.
    628  * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
    629  */
    630 #ifdef IEEE_Arith
    631 #ifndef NO_INFNAN_CHECK
    632 #undef INFNAN_CHECK
    633 #define INFNAN_CHECK
    634 #endif
    635 #ifdef IEEE_MC68k
    636 #define _0 0
    637 #define _1 1
    638 #ifndef NAN_WORD0
    639 #define NAN_WORD0 d_QNAN0
    640 #endif
    641 #ifndef NAN_WORD1
    642 #define NAN_WORD1 d_QNAN1
    643 #endif
    644 #else
    645 #define _0 1
    646 #define _1 0
    647 #ifndef NAN_WORD0
    648 #define NAN_WORD0 d_QNAN1
    649 #endif
    650 #ifndef NAN_WORD1
    651 #define NAN_WORD1 d_QNAN0
    652 #endif
    653 #endif
    654 #else
    655 #undef INFNAN_CHECK
    656 #endif
    657 
    658 #undef SI
    659 #ifdef Sudden_Underflow
    660 #define SI 1
    661 #else
    662 #define SI 0
    663 #endif
    664 
    665 #endif /* GDTOAIMP_H_INCLUDED */
    666