|
|
1.1 root 1: /* flonum.h - Floating point package
2: Copyright (C) 1987 Free Software Foundation, Inc.
3:
4: This file is part of GAS, the GNU Assembler.
5:
6: GAS is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 1, or (at your option)
9: any later version.
10:
11: GAS is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with GAS; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20: /***********************************************************************\
21: * *
22: * Arbitrary-precision floating point arithmetic. *
23: * *
24: * *
25: * Notation: a floating point number is expressed as *
26: * MANTISSA * (2 ** EXPONENT). *
27: * *
28: * If this offends more traditional mathematicians, then *
29: * please tell me your nomenclature for flonums! *
30: * *
31: \***********************************************************************/
32:
33: #import "bignum.h"
34:
35: /***********************************************************************\
36: * *
37: * Variable precision floating point numbers. *
38: * *
39: * Exponent is the place value of the low littlenum. E.g.: *
40: * If 0: low points to the units littlenum. *
41: * If 1: low points to the LITTLENUM_RADIX littlenum. *
42: * If -1: low points to the 1/LITTLENUM_RADIX littlenum. *
43: * *
44: \***********************************************************************/
45:
46: /* JF: A sign value of 0 means we have been asked to assemble NaN
47: A sign value of 'P' means we've been asked to assemble +Inf
48: A sign value of 'N' means we've been asked to assemble -Inf
49: */
50: struct FLONUM_STRUCT {
51: LITTLENUM_TYPE * low; /* low order littlenum of a bignum */
52: LITTLENUM_TYPE * high; /* high order littlenum of a bignum */
53: LITTLENUM_TYPE * leader; /* -> 1st non-zero littlenum */
54: /* If flonum is 0.0, leader==low-1 */
55: long int exponent; /* base LITTLENUM_RADIX */
56: char sign; /* '+' or '-' */
57: };
58:
59: typedef struct FLONUM_STRUCT FLONUM_TYPE;
60:
61: struct const_FLONUM_STRUCT {
62: const LITTLENUM_TYPE * low; /* low order littlenum of a bignum */
63: const LITTLENUM_TYPE * high; /* high order littlenum of a bignum */
64: const LITTLENUM_TYPE * leader; /* -> 1st non-zero littlenum */
65: /* If flonum is 0.0, leader==low-1 */
66: long int exponent; /* base LITTLENUM_RADIX */
67: char sign; /* '+' or '-' */
68: };
69:
70: typedef struct const_FLONUM_STRUCT const_FLONUM_TYPE;
71:
72:
73: /***********************************************************************\
74: * *
75: * Since we can (& do) meet with exponents like 10^5000, it *
76: * is silly to make a table of ~ 10,000 entries, one for each *
77: * power of 10. We keep a table where item [n] is a struct *
78: * FLONUM_FLOATING_POINT representing 10^(2^n). We then *
79: * multiply appropriate entries from this table to get any *
80: * particular power of 10. For the example of 10^5000, a table *
81: * of just 25 entries suffices: 10^(2^-12)...10^(2^+12). *
82: * *
83: \***********************************************************************/
84:
85:
86: extern const const_FLONUM_TYPE flonum_positive_powers_of_ten[];
87: extern const const_FLONUM_TYPE flonum_negative_powers_of_ten[];
88: extern const int table_size_of_flonum_powers_of_ten;
89: /* Flonum_XXX_powers_of_ten[] table has */
90: /* legal indices from 0 to */
91: /* + this number inclusive. */
92:
93:
94:
95: /***********************************************************************\
96: * *
97: * Declare worker functions. *
98: * *
99: \***********************************************************************/
100:
101: extern void flonum_multip(
102: const_FLONUM_TYPE *a,
103: FLONUM_TYPE *b,
104: FLONUM_TYPE *product);
105: extern void flonum_copy(
106: FLONUM_TYPE *in,
107: FLONUM_TYPE *out);
108: extern int atof_generic(
109: char **address_of_string_pointer,
110: const char *string_of_decimal_marks,
111: const char *string_of_decimal_exponent_marks,
112: FLONUM_TYPE *address_of_generic_floating_point_number);
113:
114:
115: /***********************************************************************\
116: * *
117: * Declare error codes. *
118: * *
119: \***********************************************************************/
120:
121: #define ERROR_EXPONENT_OVERFLOW (2)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.