(root)/
glibc-2.38/
sysdeps/
sparc/
sparc32/
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  
      25  __BEGIN_DECLS
      26  
      27  union ieee754_float
      28    {
      29      float f;
      30  
      31      /* This is the IEEE 754 single-precision format.  */
      32      struct
      33        {
      34  #if	__BYTE_ORDER == __BIG_ENDIAN
      35  	unsigned int negative:1;
      36  	unsigned int exponent:8;
      37  	unsigned int mantissa:23;
      38  #endif				/* Big endian.  */
      39  #if	__BYTE_ORDER == __LITTLE_ENDIAN
      40  	unsigned int mantissa:23;
      41  	unsigned int exponent:8;
      42  	unsigned int negative:1;
      43  #endif				/* Little endian.  */
      44        } ieee;
      45  
      46      /* This format makes it easier to see if a NaN is a signalling NaN.  */
      47      struct
      48        {
      49  #if	__BYTE_ORDER == __BIG_ENDIAN
      50  	unsigned int negative:1;
      51  	unsigned int exponent:8;
      52  	unsigned int quiet_nan:1;
      53  	unsigned int mantissa:22;
      54  #endif				/* Big endian.  */
      55  #if	__BYTE_ORDER == __LITTLE_ENDIAN
      56  	unsigned int mantissa:22;
      57  	unsigned int quiet_nan:1;
      58  	unsigned int exponent:8;
      59  	unsigned int negative:1;
      60  #endif				/* Little endian.  */
      61        } ieee_nan;
      62    };
      63  
      64  #define IEEE754_FLOAT_BIAS	0x7f /* Added to exponent.  */
      65  
      66  
      67  union ieee754_double
      68    {
      69      double d;
      70  
      71      /* This is the IEEE 754 double-precision format.  */
      72      struct
      73        {
      74  #if	__BYTE_ORDER == __BIG_ENDIAN
      75  	unsigned int negative:1;
      76  	unsigned int exponent:11;
      77  	/* Together these comprise the mantissa.  */
      78  	unsigned int mantissa0:20;
      79  	unsigned int mantissa1:32;
      80  #endif				/* Big endian.  */
      81  #if	__BYTE_ORDER == __LITTLE_ENDIAN
      82  	/* Together these comprise the mantissa.  */
      83  	unsigned int mantissa1:32;
      84  	unsigned int mantissa0:20;
      85  	unsigned int exponent:11;
      86  	unsigned int negative:1;
      87  #endif				/* Little endian.  */
      88        } ieee;
      89  
      90      /* This format makes it easier to see if a NaN is a signalling NaN.  */
      91      struct
      92        {
      93  #if	__BYTE_ORDER == __BIG_ENDIAN
      94  	unsigned int negative:1;
      95  	unsigned int exponent:11;
      96  	unsigned int quiet_nan:1;
      97  	/* Together these comprise the mantissa.  */
      98  	unsigned int mantissa0:19;
      99  	unsigned int mantissa1:32;
     100  #else
     101  	/* Together these comprise the mantissa.  */
     102  	unsigned int mantissa1:32;
     103  	unsigned int mantissa0:19;
     104  	unsigned int quiet_nan:1;
     105  	unsigned int exponent:11;
     106  	unsigned int negative:1;
     107  #endif
     108        } ieee_nan;
     109    };
     110  
     111  #define IEEE754_DOUBLE_BIAS	0x3ff /* Added to exponent.  */
     112  
     113  
     114  union ieee854_long_double
     115    {
     116      long double d;
     117  
     118      /* This is the IEEE 854 quad-precision format.  */
     119      struct
     120        {
     121  #if	__BYTE_ORDER == __BIG_ENDIAN
     122  	unsigned int negative:1;
     123  	unsigned int exponent:15;
     124  	/* Together these comprise the mantissa.  */
     125  	unsigned int mantissa0:16;
     126  	unsigned int mantissa1:32;
     127  	unsigned int mantissa2:32;
     128  	unsigned int mantissa3:32;
     129  #endif				/* Big endian.  */
     130  #if	__BYTE_ORDER == __LITTLE_ENDIAN
     131  	/* Together these comprise the mantissa.  */
     132  	unsigned int mantissa3:32;
     133  	unsigned int mantissa2:32;
     134  	unsigned int mantissa1:32;
     135  	unsigned int mantissa0:16;
     136  	unsigned int exponent:15;
     137  	unsigned int negative:1;
     138  #endif				/* Little endian.  */
     139        } ieee;
     140  
     141      /* This format makes it easier to see if a NaN is a signalling NaN.  */
     142      struct
     143        {
     144  #if	__BYTE_ORDER == __BIG_ENDIAN
     145  	unsigned int negative:1;
     146  	unsigned int exponent:15;
     147  	unsigned int quiet_nan:1;
     148  	/* Together these comprise the mantissa.  */
     149  	unsigned int mantissa0:15;
     150  	unsigned int mantissa1:32;
     151  	unsigned int mantissa2:32;
     152  	unsigned int mantissa3:32;
     153  #else
     154  	/* Together these comprise the mantissa.  */
     155  	unsigned int mantissa3:32;
     156  	unsigned int mantissa2:32;
     157  	unsigned int mantissa1:32;
     158  	unsigned int mantissa0:15;
     159  	unsigned int quiet_nan:1;
     160  	unsigned int exponent:15;
     161  	unsigned int negative:1;
     162  #endif
     163        } ieee_nan;
     164    };
     165  
     166  #define IEEE854_LONG_DOUBLE_BIAS 0x3fff /* Added to exponent.  */
     167  
     168  __END_DECLS
     169  
     170  #endif /* ieee754.h */