(root)/
glibc-2.38/
sysdeps/
ieee754/
ldbl-128ibm/
ieee754.h
       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  #define _IEEE754_H 1
      20  
      21  #include <features.h>
      22  
      23  #include <bits/endian.h>
      24  #include <bits/floatn.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  	/* Together these comprise the mantissa.  */
      84  	unsigned int mantissa1:32;
      85  	unsigned int mantissa0:20;
      86  	unsigned int exponent:11;
      87  	unsigned int negative:1;
      88  #endif				/* Little endian.  */
      89        } ieee;
      90  
      91      /* This format makes it easier to see if a NaN is a signalling NaN.  */
      92      struct
      93        {
      94  #if	__BYTE_ORDER == __BIG_ENDIAN
      95  	unsigned int negative:1;
      96  	unsigned int exponent:11;
      97  	unsigned int quiet_nan:1;
      98  	/* Together these comprise the mantissa.  */
      99  	unsigned int mantissa0:19;
     100  	unsigned int mantissa1:32;
     101  #else
     102  	/* Together these comprise the mantissa.  */
     103  	unsigned int mantissa1:32;
     104  	unsigned int mantissa0:19;
     105  	unsigned int quiet_nan:1;
     106  	unsigned int exponent:11;
     107  	unsigned int negative:1;
     108  #endif
     109        } ieee_nan;
     110    };
     111  
     112  #define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
     113  
     114  
     115  #if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
     116  /* long double is IEEE 128 bit */
     117  union ieee854_long_double
     118    {
     119      long double d;
     120  
     121      /* This is the IEEE 854 quad-precision format.  */
     122      struct
     123        {
     124  #if	__BYTE_ORDER == __BIG_ENDIAN
     125  	unsigned int negative:1;
     126  	unsigned int exponent:15;
     127  	/* Together these comprise the mantissa.  */
     128  	unsigned int mantissa0:16;
     129  	unsigned int mantissa1:32;
     130  	unsigned int mantissa2:32;
     131  	unsigned int mantissa3:32;
     132  #endif				/* Big endian.  */
     133  #if	__BYTE_ORDER == __LITTLE_ENDIAN
     134  	/* Together these comprise the mantissa.  */
     135  	unsigned int mantissa3:32;
     136  	unsigned int mantissa2:32;
     137  	unsigned int mantissa1:32;
     138  	unsigned int mantissa0:16;
     139  	unsigned int exponent:15;
     140  	unsigned int negative:1;
     141  #endif				/* Little endian.  */
     142        } ieee;
     143  
     144      /* This format makes it easier to see if a NaN is a signalling NaN.  */
     145      struct
     146        {
     147  #if	__BYTE_ORDER == __BIG_ENDIAN
     148  	unsigned int negative:1;
     149  	unsigned int exponent:15;
     150  	unsigned int quiet_nan:1;
     151  	/* Together these comprise the mantissa.  */
     152  	unsigned int mantissa0:15;
     153  	unsigned int mantissa1:32;
     154  	unsigned int mantissa2:32;
     155  	unsigned int mantissa3:32;
     156  #else
     157  	/* Together these comprise the mantissa.  */
     158  	unsigned int mantissa3:32;
     159  	unsigned int mantissa2:32;
     160  	unsigned int mantissa1:32;
     161  	unsigned int mantissa0:15;
     162  	unsigned int quiet_nan:1;
     163  	unsigned int exponent:15;
     164  	unsigned int negative:1;
     165  #endif
     166        } ieee_nan;
     167    };
     168  
     169  #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */
     170  #endif
     171  
     172  
     173  #if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 0 || __GNUC_PREREQ (7, 0)
     174  /* IBM extended format for long double.
     175  
     176     Each long double is made up of two IEEE doubles.  The value of the
     177     long double is the sum of the values of the two parts.  The most
     178     significant part is required to be the value of the long double
     179     rounded to the nearest double, as specified by IEEE.  For Inf
     180     values, the least significant part is required to be one of +0.0 or
     181     -0.0.  No other requirements are made; so, for example, 1.0 may be
     182     represented as (1.0, +0.0) or (1.0, -0.0), and the low part of a
     183     NaN is don't-care.  */
     184  union ibm_extended_long_double
     185    {
     186  # if __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1 && __GNUC_PREREQ (7, 0)
     187     __ibm128 ld;
     188  # else
     189     long double ld;
     190  # endif
     191      union ieee754_double d[2];
     192     };
     193  #endif
     194  
     195  __END_DECLS
     196  
     197  #endif /* ieee754.h */