root/maint/gnulib/lib/ieee754.in.h

/* [previous][next][first][last][top][bottom][index][help] */
   1 /* Copyright (C) 1992-2021 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 Lesser General Public
   6    License as published by the Free Software Foundation; either
   7    version 2.1 of the 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    Lesser General Public License for more details.
  13 
  14    You should have received a copy of the GNU Lesser General Public
  15    License along with the GNU C Library; if not, see
  16    <https://www.gnu.org/licenses/>.  */
  17 
  18 #ifndef _IEEE754_H
  19 
  20 #define _IEEE754_H 1
  21 
  22 #ifndef _GL_GNULIB_HEADER
  23 /* Ordinary glibc usage.  */
  24 # include <features.h>
  25 # include <endian.h>
  26 #else
  27 /* Gnulib usage.  */
  28 # ifndef __BEGIN_DECLS
  29 #  ifdef __cplusplus
  30 #   define __BEGIN_DECLS        extern "C" {
  31 #   define __END_DECLS          }
  32 #  else
  33 #   define __BEGIN_DECLS
  34 #   define __END_DECLS
  35 #  endif
  36 # endif
  37 # ifndef __FLOAT_WORD_ORDER
  38 #  define __LITTLE_ENDIAN       1234
  39 #  define __BIG_ENDIAN          4321
  40 #  ifdef WORDS_BIGENDIAN
  41 #   define __BYTE_ORDER __BIG_ENDIAN
  42 #  else
  43 #   define __BYTE_ORDER __LITTLE_ENDIAN
  44 #  endif
  45 #  define __FLOAT_WORD_ORDER __BYTE_ORDER
  46 # endif
  47 #endif
  48 
  49 __BEGIN_DECLS
  50 
  51 union ieee754_float
  52   {
  53     float f;
  54 
  55     /* This is the IEEE 754 single-precision format.  */
  56     struct
  57       {
  58 #if     __BYTE_ORDER == __BIG_ENDIAN
  59         unsigned int negative:1;
  60         unsigned int exponent:8;
  61         unsigned int mantissa:23;
  62 #endif                          /* Big endian.  */
  63 #if     __BYTE_ORDER == __LITTLE_ENDIAN
  64         unsigned int mantissa:23;
  65         unsigned int exponent:8;
  66         unsigned int negative:1;
  67 #endif                          /* Little endian.  */
  68       } ieee;
  69 
  70     /* This format makes it easier to see if a NaN is a signalling NaN.  */
  71     struct
  72       {
  73 #if     __BYTE_ORDER == __BIG_ENDIAN
  74         unsigned int negative:1;
  75         unsigned int exponent:8;
  76         unsigned int quiet_nan:1;
  77         unsigned int mantissa:22;
  78 #endif                          /* Big endian.  */
  79 #if     __BYTE_ORDER == __LITTLE_ENDIAN
  80         unsigned int mantissa:22;
  81         unsigned int quiet_nan:1;
  82         unsigned int exponent:8;
  83         unsigned int negative:1;
  84 #endif                          /* Little endian.  */
  85       } ieee_nan;
  86   };
  87 
  88 #define IEEE754_FLOAT_BIAS      0x7f /* Added to exponent.  */
  89 
  90 
  91 union ieee754_double
  92   {
  93     double d;
  94 
  95     /* This is the IEEE 754 double-precision format.  */
  96     struct
  97       {
  98 #if     __BYTE_ORDER == __BIG_ENDIAN
  99         unsigned int negative:1;
 100         unsigned int exponent:11;
 101         /* Together these comprise the mantissa.  */
 102         unsigned int mantissa0:20;
 103         unsigned int mantissa1:32;
 104 #endif                          /* Big endian.  */
 105 #if     __BYTE_ORDER == __LITTLE_ENDIAN
 106 # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
 107         unsigned int mantissa0:20;
 108         unsigned int exponent:11;
 109         unsigned int negative:1;
 110         unsigned int mantissa1:32;
 111 # else
 112         /* Together these comprise the mantissa.  */
 113         unsigned int mantissa1:32;
 114         unsigned int mantissa0:20;
 115         unsigned int exponent:11;
 116         unsigned int negative:1;
 117 # endif
 118 #endif                          /* Little endian.  */
 119       } ieee;
 120 
 121     /* This format makes it easier to see if a NaN is a signalling NaN.  */
 122     struct
 123       {
 124 #if     __BYTE_ORDER == __BIG_ENDIAN
 125         unsigned int negative:1;
 126         unsigned int exponent:11;
 127         unsigned int quiet_nan:1;
 128         /* Together these comprise the mantissa.  */
 129         unsigned int mantissa0:19;
 130         unsigned int mantissa1:32;
 131 #else
 132 # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
 133         unsigned int mantissa0:19;
 134         unsigned int quiet_nan:1;
 135         unsigned int exponent:11;
 136         unsigned int negative:1;
 137         unsigned int mantissa1:32;
 138 # else
 139         /* Together these comprise the mantissa.  */
 140         unsigned int mantissa1:32;
 141         unsigned int mantissa0:19;
 142         unsigned int quiet_nan:1;
 143         unsigned int exponent:11;
 144         unsigned int negative:1;
 145 # endif
 146 #endif
 147       } ieee_nan;
 148   };
 149 
 150 #define IEEE754_DOUBLE_BIAS     0x3ff /* Added to exponent.  */
 151 
 152 
 153 union ieee854_long_double
 154   {
 155     long double d;
 156 
 157     /* This is the IEEE 854 double-extended-precision format.  */
 158     struct
 159       {
 160 #if     __BYTE_ORDER == __BIG_ENDIAN
 161         unsigned int negative:1;
 162         unsigned int exponent:15;
 163         unsigned int empty:16;
 164         unsigned int mantissa0:32;
 165         unsigned int mantissa1:32;
 166 #endif
 167 #if     __BYTE_ORDER == __LITTLE_ENDIAN
 168 # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
 169         unsigned int exponent:15;
 170         unsigned int negative:1;
 171         unsigned int empty:16;
 172         unsigned int mantissa0:32;
 173         unsigned int mantissa1:32;
 174 # else
 175         unsigned int mantissa1:32;
 176         unsigned int mantissa0:32;
 177         unsigned int exponent:15;
 178         unsigned int negative:1;
 179         unsigned int empty:16;
 180 # endif
 181 #endif
 182       } ieee;
 183 
 184     /* This is for NaNs in the IEEE 854 double-extended-precision format.  */
 185     struct
 186       {
 187 #if     __BYTE_ORDER == __BIG_ENDIAN
 188         unsigned int negative:1;
 189         unsigned int exponent:15;
 190         unsigned int empty:16;
 191         unsigned int one:1;
 192         unsigned int quiet_nan:1;
 193         unsigned int mantissa0:30;
 194         unsigned int mantissa1:32;
 195 #endif
 196 #if     __BYTE_ORDER == __LITTLE_ENDIAN
 197 # if    __FLOAT_WORD_ORDER == __BIG_ENDIAN
 198         unsigned int exponent:15;
 199         unsigned int negative:1;
 200         unsigned int empty:16;
 201         unsigned int mantissa0:30;
 202         unsigned int quiet_nan:1;
 203         unsigned int one:1;
 204         unsigned int mantissa1:32;
 205 # else
 206         unsigned int mantissa1:32;
 207         unsigned int mantissa0:30;
 208         unsigned int quiet_nan:1;
 209         unsigned int one:1;
 210         unsigned int exponent:15;
 211         unsigned int negative:1;
 212         unsigned int empty:16;
 213 # endif
 214 #endif
 215       } ieee_nan;
 216   };
 217 
 218 #define IEEE854_LONG_DOUBLE_BIAS 0x3fff
 219 
 220 __END_DECLS
 221 
 222 #endif /* ieee754.h */

/* [previous][next][first][last][top][bottom][index][help] */