root / lab4 / .minix-src / include / sys / ieee754.h @ 14
History | View | Annotate | Download (6.44 KB)
1 | 13 | up20180614 | /* $NetBSD: ieee754.h,v 1.15 2014/02/01 16:39:52 matt Exp $ */
|
---|---|---|---|
2 | |||
3 | /*
|
||
4 | * Copyright (c) 1992, 1993
|
||
5 | * The Regents of the University of California. All rights reserved.
|
||
6 | *
|
||
7 | * This software was developed by the Computer Systems Engineering group
|
||
8 | * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
|
||
9 | * contributed to Berkeley.
|
||
10 | *
|
||
11 | * All advertising materials mentioning features or use of this software
|
||
12 | * must display the following acknowledgement:
|
||
13 | * This product includes software developed by the University of
|
||
14 | * California, Lawrence Berkeley Laboratory.
|
||
15 | *
|
||
16 | * Redistribution and use in source and binary forms, with or without
|
||
17 | * modification, are permitted provided that the following conditions
|
||
18 | * are met:
|
||
19 | * 1. Redistributions of source code must retain the above copyright
|
||
20 | * notice, this list of conditions and the following disclaimer.
|
||
21 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
22 | * notice, this list of conditions and the following disclaimer in the
|
||
23 | * documentation and/or other materials provided with the distribution.
|
||
24 | * 3. Neither the name of the University nor the names of its contributors
|
||
25 | * may be used to endorse or promote products derived from this software
|
||
26 | * without specific prior written permission.
|
||
27 | *
|
||
28 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
29 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
30 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
31 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
32 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
33 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
34 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
35 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
36 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
37 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
38 | * SUCH DAMAGE.
|
||
39 | *
|
||
40 | * @(#)ieee.h 8.1 (Berkeley) 6/11/93
|
||
41 | */
|
||
42 | #ifndef _SYS_IEEE754_H_
|
||
43 | #define _SYS_IEEE754_H_
|
||
44 | |||
45 | /*
|
||
46 | * NOTICE: This is not a standalone file. To use it, #include it in
|
||
47 | * your port's ieee.h header.
|
||
48 | */
|
||
49 | |||
50 | #include <machine/endian.h> |
||
51 | |||
52 | /*
|
||
53 | * <sys/ieee754.h> defines the layout of IEEE 754 floating point types.
|
||
54 | * Only single-precision and double-precision types are defined here;
|
||
55 | * 128-bit long doubles are define here IFF __HAVE_LONG_DOUBLE equals 128.
|
||
56 | * Otherwise extended types, if available, are defined in the machine-dependent
|
||
57 | * header.
|
||
58 | */
|
||
59 | |||
60 | /*
|
||
61 | * Define the number of bits in each fraction and exponent.
|
||
62 | *
|
||
63 | * k k+1
|
||
64 | * Note that 1.0 x 2 == 0.1 x 2 and that denorms are represented
|
||
65 | *
|
||
66 | * (-exp_bias+1)
|
||
67 | * as fractions that look like 0.fffff x 2 . This means that
|
||
68 | *
|
||
69 | * -126
|
||
70 | * the number 0.10000 x 2 , for instance, is the same as the normalized
|
||
71 | *
|
||
72 | * -127 -128
|
||
73 | * float 1.0 x 2 . Thus, to represent 2 , we need one leading zero
|
||
74 | *
|
||
75 | * -129
|
||
76 | * in the fraction; to represent 2 , we need two, and so on. This
|
||
77 | *
|
||
78 | * (-exp_bias-fracbits+1)
|
||
79 | * implies that the smallest denormalized number is 2
|
||
80 | *
|
||
81 | * for whichever format we are talking about: for single precision, for
|
||
82 | *
|
||
83 | * -126 -149
|
||
84 | * instance, we get .00000000000000000000001 x 2 , or 1.0 x 2 , and
|
||
85 | *
|
||
86 | * -149 == -127 - 23 + 1.
|
||
87 | */
|
||
88 | #define SNG_EXPBITS 8 |
||
89 | #define SNG_FRACBITS 23 |
||
90 | |||
91 | struct ieee_single {
|
||
92 | #if _BYTE_ORDER == _BIG_ENDIAN
|
||
93 | u_int sng_sign:1;
|
||
94 | u_int sng_exp:SNG_EXPBITS; |
||
95 | u_int sng_frac:SNG_FRACBITS; |
||
96 | #else
|
||
97 | u_int sng_frac:SNG_FRACBITS; |
||
98 | u_int sng_exp:SNG_EXPBITS; |
||
99 | u_int sng_sign:1;
|
||
100 | #endif
|
||
101 | }; |
||
102 | |||
103 | #define DBL_EXPBITS 11 |
||
104 | #define DBL_FRACHBITS 20 |
||
105 | #define DBL_FRACLBITS 32 |
||
106 | #define DBL_FRACBITS (DBL_FRACHBITS + DBL_FRACLBITS)
|
||
107 | |||
108 | struct ieee_double {
|
||
109 | #if _BYTE_ORDER == _BIG_ENDIAN
|
||
110 | u_int dbl_sign:1;
|
||
111 | u_int dbl_exp:DBL_EXPBITS; |
||
112 | u_int dbl_frach:DBL_FRACHBITS; |
||
113 | u_int dbl_fracl:DBL_FRACLBITS; |
||
114 | #else
|
||
115 | u_int dbl_fracl:DBL_FRACLBITS; |
||
116 | u_int dbl_frach:DBL_FRACHBITS; |
||
117 | u_int dbl_exp:DBL_EXPBITS; |
||
118 | u_int dbl_sign:1;
|
||
119 | #endif
|
||
120 | }; |
||
121 | |||
122 | #if __HAVE_LONG_DOUBLE + 0 == 128 |
||
123 | |||
124 | #define EXT_EXPBITS 15 |
||
125 | #define EXT_FRACHBITS 48 |
||
126 | #define EXT_FRACLBITS 64 |
||
127 | #define EXT_FRACBITS (EXT_FRACLBITS + EXT_FRACHBITS)
|
||
128 | |||
129 | #define EXT_TO_ARRAY32(u, a) do { \ |
||
130 | (a)[0] = (uint32_t)((u).extu_ext.ext_fracl >> 0); \ |
||
131 | (a)[1] = (uint32_t)((u).extu_ext.ext_fracl >> 32); \ |
||
132 | (a)[2] = (uint32_t)((u).extu_ext.ext_frach >> 0); \ |
||
133 | (a)[3] = (uint32_t)((u).extu_ext.ext_frach >> 32); \ |
||
134 | } while(/*CONSTCOND*/0) |
||
135 | |||
136 | struct ieee_ext {
|
||
137 | #if _BYTE_ORDER == _BIG_ENDIAN
|
||
138 | uint64_t ext_sign:1;
|
||
139 | uint64_t ext_exp:EXT_EXPBITS; |
||
140 | uint64_t ext_frach:EXT_FRACHBITS; |
||
141 | uint64_t ext_fracl; |
||
142 | #else
|
||
143 | uint64_t ext_fracl; |
||
144 | uint64_t ext_frach:EXT_FRACHBITS; |
||
145 | uint64_t ext_exp:EXT_EXPBITS; |
||
146 | uint64_t ext_sign:1;
|
||
147 | #endif
|
||
148 | }; |
||
149 | #endif /* __HAVE_LONG_DOUBLE == 128 */ |
||
150 | |||
151 | /*
|
||
152 | * Floats whose exponent is in [1..INFNAN) (of whatever type) are
|
||
153 | * `normal'. Floats whose exponent is INFNAN are either Inf or NaN.
|
||
154 | * Floats whose exponent is zero are either zero (iff all fraction
|
||
155 | * bits are zero) or subnormal values.
|
||
156 | *
|
||
157 | * At least one `signalling NaN' and one `quiet NaN' value must be
|
||
158 | * implemented. It is left to the architecture to specify how to
|
||
159 | * distinguish between these.
|
||
160 | */
|
||
161 | #define SNG_EXP_INFNAN 255 |
||
162 | #define DBL_EXP_INFNAN 2047 |
||
163 | #if __HAVE_LONG_DOUBLE + 0 == 128 |
||
164 | #define EXT_EXP_INFNAN 0x7fff |
||
165 | #endif
|
||
166 | |||
167 | /*
|
||
168 | * Exponent biases.
|
||
169 | */
|
||
170 | #define SNG_EXP_BIAS 127 |
||
171 | #define DBL_EXP_BIAS 1023 |
||
172 | #if __HAVE_LONG_DOUBLE + 0 == 128 |
||
173 | #define EXT_EXP_BIAS 16383 |
||
174 | #endif
|
||
175 | |||
176 | /*
|
||
177 | * Convenience data structures.
|
||
178 | */
|
||
179 | union ieee_single_u {
|
||
180 | float sngu_f;
|
||
181 | struct ieee_single sngu_sng;
|
||
182 | }; |
||
183 | |||
184 | #define sngu_sign sngu_sng.sng_sign
|
||
185 | #define sngu_exp sngu_sng.sng_exp
|
||
186 | #define sngu_frac sngu_sng.sng_frac
|
||
187 | #define SNGU_ZEROFRAC_P(u) ((u).sngu_frac != 0) |
||
188 | |||
189 | union ieee_double_u {
|
||
190 | double dblu_d;
|
||
191 | struct ieee_double dblu_dbl;
|
||
192 | }; |
||
193 | |||
194 | #define dblu_sign dblu_dbl.dbl_sign
|
||
195 | #define dblu_exp dblu_dbl.dbl_exp
|
||
196 | #define dblu_frach dblu_dbl.dbl_frach
|
||
197 | #define dblu_fracl dblu_dbl.dbl_fracl
|
||
198 | #define DBLU_ZEROFRAC_P(u) (((u).dblu_frach|(u).dblu_fracl) != 0) |
||
199 | |||
200 | #if __HAVE_LONG_DOUBLE + 0 == 128 |
||
201 | union ieee_ext_u {
|
||
202 | long double extu_ld; |
||
203 | struct ieee_ext extu_ext;
|
||
204 | }; |
||
205 | |||
206 | #define extu_exp extu_ext.ext_exp
|
||
207 | #define extu_sign extu_ext.ext_sign
|
||
208 | #define extu_fracl extu_ext.ext_fracl
|
||
209 | #define extu_frach extu_ext.ext_frach
|
||
210 | #define EXTU_ZEROFRAC_P(u) (((u).extu_frach|(u).extu_fracl) != 0) |
||
211 | |||
212 | #ifndef LDBL_NBIT
|
||
213 | #define LDBL_IMPLICIT_NBIT 1 /* our NBIT is implicit */ |
||
214 | #endif
|
||
215 | |||
216 | #endif /* __HAVE_LONG_DOUBLE */ |
||
217 | |||
218 | #endif /* _SYS_IEEE754_H_ */ |