1 /* 2 * Copyright (c) 1982 Regents of the University of California 3 * @(#)asnumber.h 4.3 02/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 190