|
|
1.1 root 1: /*
2: * Copyright (c) 1982 Regents of the University of California
3: * @(#)asnumber.h 4.3 2/14/82
4: */
5:
6: union Ib_int{ /* byte */
7: u_char Ib_uchar[1];
8: char Ichar;
9: };
10: union Iw_int{ /* word */
11: u_char Iw_uchar[2];
12: u_short Iw_ushort[1];
13: short Iw_short;
14: };
15: union Il_int{ /* long word */
16: u_char Il_uchar[4];
17: u_short Il_ushort[2];
18: u_int Il_ulong[1];
19: int Il_long;
20: };
21:
22: union Iq_int{ /* quad word */
23: u_char Iq_uchar[8];
24: u_short Iq_ushort[4];
25: u_int Iq_ulong[2];
26: };
27:
28: union Io_int{ /* octal word */
29: u_char Io_uchar[16];
30: u_short Io_ushort[8];
31: u_int Io_ulong[4];
32: union Iq_int Io_quad[2];
33: };
34:
35: union Ff_float{
36: u_char Ff_uchar[4];
37: u_short Ff_ushort[2];
38: u_int Ff_ulong[1];
39: float Ff_value;
40: };
41:
42: union Fd_float{
43: u_char Fd_uchar[8];
44: u_short Fd_ushort[4];
45: u_int Fd_ulong[2];
46: double Fd_value;
47: };
48:
49: union Fg_float{
50: u_char Fg_uchar[8];
51: u_short Fg_ushort[4];
52: u_int Fg_ulong[2];
53: };
54:
55: union Fh_float{
56: u_char Fh_uchar[16];
57: u_short Fh_ushort[8];
58: u_int Fh_ulong[4];
59: };
60:
61: struct as_number{
62: union {
63: union Ib_int numIb_int;
64: union Iw_int numIw_int;
65: union Il_int numIl_int;
66: union Iq_int numIq_int;
67: union Io_int numIo_int;
68: union Ff_float numFf_float;
69: union Fd_float numFd_float;
70: union Fg_float numFg_float;
71: union Fh_float numFh_float;
72: }num_num;
73: char num_tag; /* the key field: TYPB..TYPUNPACKED */
74: char num_sign; /* when unpacked, the sign */
75: short num_exponent; /* when unpacked, the unexcessed exp */
76: };
77: typedef struct as_number Bignum;
78:
79: extern Bignum Znumber; /* one all zero'ed out */
80:
81: #define num_uchar num_num.numIq_int.Iq_uchar
82: #define num_uint num_num.numIq_int.Iq_ulong
83: #define num_ulong num_num.numIq_int.Iq_ulong
84: #define num_ushort num_num.numIq_int.Iq_ushort
85: /*
86: * The following definitions must all be consistent.
87: * They define the granularity of working on longs, quad and octal
88: * words. Currently, the granularity is as large as it can be: 32 bits
89: * in a chunk.
90: */
91: #define CH_N 4 /* number of pieces */
92: #define CH_BITS 32 /* number of bits per piece */
93: #define CH_FIELD(x) ((x).num_num.numIo_int.Io_ulong)
94: typedef u_int *chptr; /* basic data type */
95: #define SIGNBIT 0x80000000
96:
97: #define HOC (CH_N - 1) /* high order chunk */
98: #if 0
99: #define MAXINT_1 ((unsigned)(1<<(CH_BITS - 1)))
100: #define MAXINT_10 ((unsigned)((MAXINT_1/(unsigned)10)))
101: #define MAXINT_5 ((unsigned)((MAXINT_1/(unsigned)5)))
102: #else not 0
103: /*
104: * These values were computed using dc, so are exact.
105: * Only MAXINT_10 and MAXINT_5 are used in the programs.
106: */
107: #define MAXINT_1 2147483648
108: #define MAXINT_10 214748364
109: #define MAXINT_5 429496729
110: #endif not 0
111:
112: Bignum as_atoi(); /* converts string to integer */
113: Bignum as_atof(); /* converts string to float */
114: Bignum bigatof(); /* converts string to float */
115: Bignum floatconvert(); /* converts amongst float #s */
116: Bignum intconvert(); /* converts amongst float #s */
117: Bignum bignumconvert(); /* converts amongst float #s */
118: Bignum bignumpack(); /* converts UNPACKED bignum to bignum */
119: Bignum bignumunpack(); /* converts bignum to UNPACKED bignum */
120:
121: /*
122: * Definitions for overflows.
123: */
124: typedef u_int Ovf;
125:
126: #define OVF_ADDV (1<<0) /* integer: adding two vectors overflowed */
127: #define OVF_LSHIFT (1<<1) /* integer: left shifting a vector lost bits */
128: #define OVF_POSOVF (1<<2) /* integer: positive number overflowed */
129: #define OVF_MAXINT (1<<3) /* integer: the number was the maxint + 1*/
130: #define OVF_F (1<<4) /* float: F overflow */
131: #define OVF_D (1<<5) /* float: D overflow */
132: #define OVF_G (1<<6) /* float: G overflow */
133: #define OVF_H (1<<7) /* float: H overflow */
134: #define OVF_OVERFLOW (1<<9) /* overflow in conversion */
135: #define OVF_UNDERFLOW (1<<10) /* underflow in conversion */
136:
137: Ovf posovf();
138: Ovf numclear();
139: Ovf numshift();
140: Ovf numaddv();
141: Ovf numaddd();
142: Ovf num1comp();
143: Ovf numnegate();
144:
145: /*
146: * Definitions to unpack big numbers numbers into
147: * a 128 bit fraction and 16 bit excess-free exponent,
148: * and an 8 copy bits for the sign.
149: *
150: * The fraction is represented as a normalized binary number,
151: * 128 bits long, with the binary point between bits 127 and the
152: * hypothetical 128'th bit. This hypothetical 128'th bit
153: * is always assumed to be one.
154: */
155: /*
156: * A map entry is NOTAKE if the corresponding byte is
157: * not to be taken
158: *
159: * The maps are for going from packed to unpacked format (b_up)
160: * and from unpacked to packed format (b_p)
161: * for the mantissa (b_upmmap) and for the exponent(b_upemap)
162: *
163: * byte #i in the packed number goes to byte #b_upmmap[i] in the unpacked
164: */
165: #define NOTAKE -1
166: struct ty_bigdesc{
167: char b_upmmap[16]; /* byte x of float goes to up_mmap[x] in mant */
168: char b_pmmap[16]; /* inverse of upmmap */
169: char b_upemap[2]; /* byte x of float goes to up_emap[x] in exp */
170: char b_pemap[2]; /* inverse of upemap */
171: char b_mlshift; /* left shift quantity to justify to left */
172: char b_ershift; /* right shift quantity to r justify exponent */
173: short b_msigbits; /* # sig bits in mantissa */
174: char b_esigbits; /* # sig bits in exponent */
175: short b_eexcess; /* exponent excess */
176: };
177: extern struct ty_bigdesc ty_bigdesc[];
178: /*
179: * Bit manipulations
180: */
181: #define ONES(n) ((1 << (n)) - 1)
182: /*
183: * Assertions
184: */
185: #if 1
186: #define assert(x, str) if (!(x)) panic("%s%s\n", "x", str)
187: #else
188: #define assert(x, str)
189: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.