(__ieee754_coshl): Fix overflow threshold constant
[kopensolaris-gnu/glibc.git] / sysdeps / ieee754 / ieee754.h
1 /* Copyright (C) 1992, 1995, 1996, 1999 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Library General Public License as
6    published by the Free Software Foundation; either version 2 of the
7    License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Library General Public License for more details.
13
14    You should have received a copy of the GNU Library General Public
15    License along with the GNU C Library; see the file COPYING.LIB.  If not,
16    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17    Boston, MA 02111-1307, USA.  */
18
19 #ifndef _IEEE754_H
20
21 #define _IEEE754_H 1
22 #include <features.h>
23
24 #include <endian.h>
25
26 __BEGIN_DECLS
27
28 union ieee754_float
29   {
30     float f;
31
32     /* This is the IEEE 754 single-precision format.  */
33     struct
34       {
35 #if     __BYTE_ORDER == __BIG_ENDIAN
36         unsigned int negative:1;
37         unsigned int exponent:8;
38         unsigned int mantissa:23;
39 #endif                          /* Big endian.  */
40 #if     __BYTE_ORDER == __LITTLE_ENDIAN
41         unsigned int mantissa:23;
42         unsigned int exponent:8;
43         unsigned int negative:1;
44 #endif                          /* Little endian.  */
45       } ieee;
46
47     /* This format makes it easier to see if a NaN is a signalling NaN.  */
48     struct
49       {
50 #if     __BYTE_ORDER == __BIG_ENDIAN
51         unsigned int negative:1;
52         unsigned int exponent:8;
53         unsigned int quiet_nan:1;
54         unsigned int mantissa:22;
55 #endif                          /* Big endian.  */
56 #if     __BYTE_ORDER == __LITTLE_ENDIAN
57         unsigned int mantissa:22;
58         unsigned int quiet_nan:1;
59         unsigned int exponent:8;
60         unsigned int negative:1;
61 #endif                          /* Little endian.  */
62       } ieee_nan;
63   };
64
65 #define IEEE754_FLOAT_BIAS      0x7f /* Added to exponent.  */
66
67
68 union ieee754_double
69   {
70     double d;
71
72     /* This is the IEEE 754 double-precision format.  */
73     struct
74       {
75 #if     __BYTE_ORDER == __BIG_ENDIAN
76         unsigned int negative:1;
77         unsigned int exponent:11;
78         /* Together these comprise the mantissa.  */
79         unsigned int mantissa0:20;
80         unsigned int mantissa1:32;
81 #endif                          /* Big endian.  */
82 #if     __BYTE_ORDER == __LITTLE_ENDIAN
83 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
84         unsigned int mantissa0:20;
85         unsigned int exponent:11;
86         unsigned int negative:1;
87         unsigned int mantissa1:32;
88 # else
89         /* Together these comprise the mantissa.  */
90         unsigned int mantissa1:32;
91         unsigned int mantissa0:20;
92         unsigned int exponent:11;
93         unsigned int negative:1;
94 # endif
95 #endif                          /* Little endian.  */
96       } ieee;
97
98     /* This format makes it easier to see if a NaN is a signalling NaN.  */
99     struct
100       {
101 #if     __BYTE_ORDER == __BIG_ENDIAN
102         unsigned int negative:1;
103         unsigned int exponent:11;
104         unsigned int quiet_nan:1;
105         /* Together these comprise the mantissa.  */
106         unsigned int mantissa0:19;
107         unsigned int mantissa1:32;
108 #else
109 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
110         unsigned int mantissa0:19;
111         unsigned int quiet_nan:1;
112         unsigned int exponent:11;
113         unsigned int negative:1;
114         unsigned int mantissa1:32;
115 # else
116         /* Together these comprise the mantissa.  */
117         unsigned int mantissa1:32;
118         unsigned int mantissa0:19;
119         unsigned int quiet_nan:1;
120         unsigned int exponent:11;
121         unsigned int negative:1;
122 # endif
123 #endif
124       } ieee_nan;
125   };
126
127 #define IEEE754_DOUBLE_BIAS     0x3ff /* Added to exponent.  */
128
129
130 union ieee854_long_double
131   {
132     long double d;
133
134     /* This is the IEEE 854 double-extended-precision format.  */
135     struct
136       {
137 #if     __BYTE_ORDER == __BIG_ENDIAN
138         unsigned int negative:1;
139         unsigned int exponent:15;
140         unsigned int empty:16;
141         unsigned int mantissa0:32;
142         unsigned int mantissa1:32;
143 #endif
144 #if     __BYTE_ORDER == __LITTLE_ENDIAN
145 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
146         unsigned int exponent:15;
147         unsigned int negative:1;
148         unsigned int empty:16;
149         unsigned int mantissa0:32;
150         unsigned int mantissa1:32;
151 # else
152         unsigned int mantissa1:32;
153         unsigned int mantissa0:32;
154         unsigned int exponent:15;
155         unsigned int negative:1;
156         unsigned int empty:16;
157 # endif
158 #endif
159       } ieee;
160
161     /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
162     struct
163       {
164 #if     __BYTE_ORDER == __BIG_ENDIAN
165         unsigned int negative:1;
166         unsigned int exponent:15;
167         unsigned int empty:16;
168         unsigned int one:1;
169         unsigned int quiet_nan:1;
170         unsigned int mantissa0:30;
171         unsigned int mantissa1:32;
172 #endif
173 #if     __BYTE_ORDER == __LITTLE_ENDIAN
174 # if    __FLOAT_WORD_ORDER == BIG_ENDIAN
175         unsigned int exponent:15;
176         unsigned int negative:1;
177         unsigned int empty:16;
178         unsigned int mantissa0:30;
179         unsigned int quiet_nan:1;
180         unsigned int one:1;
181         unsigned int mantissa1:32;
182 # else
183         unsigned int mantissa1:32;
184         unsigned int mantissa0:30;
185         unsigned int quiet_nan:1;
186         unsigned int one:1;
187         unsigned int exponent:15;
188         unsigned int negative:1;
189         unsigned int empty:16;
190 # endif
191 #endif
192       } ieee_nan;
193   };
194
195 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
196
197 __END_DECLS
198
199 #endif /* ieee754.h */