Lines Matching +full:one +full:- +full:to +full:- +full:one

1 This directory contains source for a library of binary -> decimal
2 and decimal -> binary conversion routines, for single-, double-,
3 and extended-precision IEEE binary floating-point arithmetic, and
4 other IEEE-like binary floating-point, including "double double",
7 T. J. Dekker, "A Floating-Point Technique for Extending the
8 Available Precision", Numer. Math. 18 (1971), pp. 224-242
12 "Inside Macintosh: PowerPC Numerics", Addison-Wesley, 1994
14 The conversion routines use double-precision floating-point arithmetic
18 David M. Gay, "Correctly Rounded Binary-Decimal and
19 Decimal-Binary Conversions", Numerical Analysis Manuscript
20 No. 90-10, Bell Labs, Murray Hill, 1990;
21 http://cm.bell-labs.com/cm/cs/what/ampl/REFS/rounding.ps.gz
26 The present conversion routines should be able to use any of IEEE binary,
27 VAX, or IBM-mainframe double-precision arithmetic internally, but I (dmg)
28 have so far only had a chance to test them with IEEE double precision
31 The core conversion routines are strtodg for decimal -> binary conversions
32 and gdtoa for binary -> decimal conversions. These routines operate
33 on arrays of unsigned 32-bit integers of type ULong, a signed 32-bit
36 is supposed to provide #defines that cause gdtoa.h to define its
38 generates a suitable arith.h on all systems where I've been able to
41 The core conversion routines are meant to be called by helper routines
44 of IEEE binary floating-point arithmetic, each indicated by one or
58 For decimal -> binary conversions, there are three families of
59 helper routines: one for round-nearest (or the current rounding
60 mode on IEEE-arithmetic systems that provide the C99 fegetround()
61 function, if compiled with -DHonor_FLT_ROUNDS):
72 one with rounding direction specified:
81 and one for computing an interval (at most one bit wide) that contains
91 The latter call strtoIg, which makes one call on strtodg and adjusts
92 the result to provide the desired interval. On systems where native
93 arithmetic can easily make one-ulp adjustments on values in the
94 desired floating-point format, it might be more efficient to use the
96 illustrates one way to do this for IEEE binary double-precision
97 arithmetic -- but whether this is more efficient remains to be seen.
100 double -- strtod is specified by the C standard, and strtof appears
102 The other functions write their results to their final argument(s):
103 to the final two argument for the strtoI... (interval) functions,
104 and to the final argument for the others (strtop... and strtor...).
106 or float*), to permit at least some type checking. In reality, they
108 values. On systems where long double is the appropriate type, one can
109 pass long double* final argument(s) to these routines. The int value
118 One detail indicated in struct FPI is whether the target binary
120 numbers to 0. On systems that do this, the helper routines for
121 conversion to double-double format (when compiled with
126 value. An alternative would be to drop to 53-bit precision near
127 the bottom of the exponent range. To get correct rounding, this
128 would (in general) require two calls on strtodg (one specifying
129 126-bit arithmetic, then, if necessary, one specifying 53-bit
132 By default, the core routine strtodg and strtod set errno to ERANGE
133 if the result overflows to +Infinity or underflows to 0. Compile
134 these routines with NO_ERRNO #defined to inhibit errno assignments.
139 arithmetic with the default rounding mode (round-to-nearest) and, on
140 systems with IEEE extended-precision registers, double-precision
141 (53-bit) rounding precision. If the machine uses (the equivalent of)
145 appropriate depends on the compiler; for this to work, it may be
146 necessary to #include "float.h" or another system-dependent header
149 Source file strtodnrp.c gives a strtod that does not require 53-bit
151 suffer double rounding due to use of extended-precision registers.
153 one in strtod.c when the latter is run with 53-bit rounding precision.
158 from quiet NaNs are system-dependent. For cross-compilation, you need
159 to determine arith.h and gd_qnan.h suitably, e.g., using the
162 C99's hexadecimal floating-point constants are recognized by the
166 When compiled with -DINFNAN_CHECK, the strto* routines recognize C99's
170 of hexadecimal digits and spaces; if there is only one string of
173 string is assigned to the next available sequence of 32-bit words of
174 fractions bits (starting with the most significant), right-aligned in
177 For binary -> decimal conversions, I've provided just one family
187 which do a "%g" style conversion either to a specified number of decimal
188 places (if their ndig argument is positive), or to the shortest
189 decimal string that rounds to the given binary floating-point value
191 and return either a pointer to the end of the string (a null character)
196 On IEEE-arithmetic systems that provide the C99 fegetround() function,
197 if compiled with -DHonor_FLT_ROUNDS, these routines honor the current
203 For double-double -> decimal, g_ddfmt() assumes IEEE-like arithmetic
205 number of mantissa bits needed to represent the sum of the two double
208 The makefile creates a library, gdtoa.a. To use the helper
209 routines, a program only needs to include gdtoa.h. All the
212 names end in _D2A. To make a "system" library, one could modify
213 these #defines to make the names start with __.
219 manual intervention. On such systems, it's necessary to compile
221 and to provide (or suitably #define) two locks, acquired by
224 only one copy of high powers of 5; omitting this lock would introduce
227 to free the value s returned by dtoa or gdtoa. It's OK to do so whether
234 is called only under very unusual circumstances (decimal -> binary
235 conversion of very long strings) for conversions to and from double
237 or for conversions to extended or quad, it may be appropriate to
239 For extended and quad precisions, -DPRIVATE_MEM=20000 is probably
247 V. Paxson and W. Kahan, "A Program for Testing IEEE Binary-Decimal
249 ftp://ftp.ee.lbl.gov/testbase-report.ps.Z .
253 Some system-dependent additions to CFLAGS in the makefile:
255 HU-UX: -Aa -Ae
256 OSF (DEC Unix): -ieee_with_no_inexact
257 SunOS 4.1x: -DKR_headers -DBad_float_h
259 If you want to put this stuff into a shared library and your
295 When time permits, I (dmg) hope to write in more detail about the
297 Meanwhile, if you wish to write helper functions for other kinds of
298 IEEE-like arithmetic, some explanation of struct FPI and the bits
300 described by FPI *fpi. The bits array is of type ULong, a 32-bit
301 unsigned integer type. Floating-point numbers have fpi->nbits bits,
304 2^e (i.e., 2 to the power of the exponent e), where e is the second
305 argument (be) to gdtoa and is stored in *exp by strtodg. The minimum
306 and maximum exponent values fpi->emin and fpi->emax for normalized
307 floating-point numbers reflect this arrangement. For example, the
309 53 bits, with normalized values of the form 1.xxxxx... times 2^(b-1023),
313 To turn an IEEE double into the representation used by strtodg and gdtoa,
314 we multiply 1.xxxx... by 2^52 (to make it an integer) and reduce the
315 exponent e = (b-1023) by 52:
317 fpi->emin = 1 - 1023 - 52
318 fpi->emax = 1046 - 1023 - 52
320 In various wrappers for IEEE double, we actually write -53 + 1 rather
321 than -52, to emphasize that there are 53 bits including one implicit bit.
322 Field fpi->rounding indicates the desired rounding direction, with
325 FPI_Round_near = unbiased rounding -- the IEEE default,
327 FPI_Round_down = toward -Infinity
330 Field fpi->sudden_underflow indicates whether strtodg should return
331 denormals or flush them to zero. Normal floating-point numbers have
332 bit fpi->nbits in the bits array on. Denormals have it off, with
333 exponent = fpi->emin. Strtodg provides distinct return values for normals
336 Compiling g__fmt.c, strtod.c, and strtodg.c with -DUSE_LOCALE causes
337 the decimal-point character to be taken from the current locale; otherwise
341 netlib's "dtoa.c from fp" and are meant to function equivalently.
345 (Linux) systems -- not reflecting calls on fesetround(), as the C99
346 standard says it should -- when Honor_FLT_ROUNDS is #defined, the
350 Compile with -DUSE_LOCALE to use the current locale; otherwise
351 decimal points are assumed to be '.'. With -DUSE_LOCALE, unless
352 you also compile with -DNO_LOCALE_CACHE, the details about the
354 to change during the program's execution.
356 On machines with a 64-bit long double and perhaps a 113-bit "quad"
357 type, you can invoke "make Printf" to add Printf (and variants, such
358 as Fprintf) to gdtoa.a. These are analogs, declared in stdio1.h, of
363 Please send comments to David M. Gay (dmg at acm dot org, with " at "
364 changed at "@" and " dot " changed to ".").