root/lib/ieee754.in.h

/* [<][>][^][v][top][bottom][index][help] */
     1 /* Copyright (C) 1992-2023 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 */

/* [<][>][^][v][top][bottom][index][help] */