Home | History | Annotate | Line # | Download | only in sys
      1 /*	$NetBSD: ieee754.h,v 1.18 2024/05/12 10:34:56 rillig Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 1992, 1993
      5  *	The Regents of the University of California.  All rights reserved.
      6  *
      7  * This software was developed by the Computer Systems Engineering group
      8  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
      9  * contributed to Berkeley.
     10  *
     11  * All advertising materials mentioning features or use of this software
     12  * must display the following acknowledgement:
     13  *	This product includes software developed by the University of
     14  *	California, Lawrence Berkeley Laboratory.
     15  *
     16  * Redistribution and use in source and binary forms, with or without
     17  * modification, are permitted provided that the following conditions
     18  * are met:
     19  * 1. Redistributions of source code must retain the above copyright
     20  *    notice, this list of conditions and the following disclaimer.
     21  * 2. Redistributions in binary form must reproduce the above copyright
     22  *    notice, this list of conditions and the following disclaimer in the
     23  *    documentation and/or other materials provided with the distribution.
     24  * 3. Neither the name of the University nor the names of its contributors
     25  *    may be used to endorse or promote products derived from this software
     26  *    without specific prior written permission.
     27  *
     28  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     29  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     30  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     31  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     32  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     33  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     34  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     37  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     38  * SUCH DAMAGE.
     39  *
     40  *	@(#)ieee.h	8.1 (Berkeley) 6/11/93
     41  */
     42 #ifndef _SYS_IEEE754_H_
     43 #define _SYS_IEEE754_H_
     44 
     45 /*
     46  * NOTICE: This is not a standalone file.  To use it, #include it in
     47  * your port's ieee.h header.
     48  */
     49 
     50 #include <machine/endian.h>
     51 
     52 /*
     53  * <sys/ieee754.h> defines the layout of IEEE 754 floating point types.
     54  * Only single-precision and double-precision types are defined here;
     55  * 128-bit long doubles are defined here IFF __HAVE_LONG_DOUBLE equals 128.
     56  * Otherwise extended types, if available, are defined in the machine-dependent
     57  * header.
     58  */
     59 
     60 /*
     61  * Define the number of bits in each fraction and exponent.
     62  *
     63  *		     k	         k+1
     64  * Note that  1.0 x 2  == 0.1 x 2      and that denorms are represented
     65  *
     66  *					  (-exp_bias+1)
     67  * as fractions that look like 0.fffff x 2             .  This means that
     68  *
     69  *			 -126
     70  * the number 0.10000 x 2    , for instance, is the same as the normalized
     71  *
     72  *		-127			   -128
     73  * float 1.0 x 2    .  Thus, to represent 2    , we need one leading zero
     74  *
     75  *				  -129
     76  * in the fraction; to represent 2    , we need two, and so on.  This
     77  *
     78  *						     (-exp_bias-fracbits+1)
     79  * implies that the smallest denormalized number is 2
     80  *
     81  * for whichever format we are talking about: for single precision, for
     82  *
     83  *						-126		-149
     84  * instance, we get .00000000000000000000001 x 2    , or 1.0 x 2    , and
     85  *
     86  * -149 == -127 - 23 + 1.
     87  */
     88 #define	SNG_EXPBITS	8
     89 #define	SNG_FRACBITS	23
     90 
     91 struct ieee_single {
     92 #if _BYTE_ORDER == _BIG_ENDIAN
     93 	unsigned int	sng_sign:1;
     94 	unsigned int	sng_exp:SNG_EXPBITS;
     95 	unsigned int	sng_frac:SNG_FRACBITS;
     96 #else
     97 	unsigned int	sng_frac:SNG_FRACBITS;
     98 	unsigned int	sng_exp:SNG_EXPBITS;
     99 	unsigned int	sng_sign:1;
    100 #endif
    101 };
    102 
    103 #define	DBL_EXPBITS	11
    104 #define	DBL_FRACHBITS	20
    105 #define	DBL_FRACLBITS	32
    106 #define	DBL_FRACBITS	(DBL_FRACHBITS + DBL_FRACLBITS)
    107 
    108 struct ieee_double {
    109 #if _BYTE_ORDER == _BIG_ENDIAN
    110 	unsigned int	dbl_sign:1;
    111 	unsigned int	dbl_exp:DBL_EXPBITS;
    112 	unsigned int	dbl_frach:DBL_FRACHBITS;
    113 	unsigned int	dbl_fracl:DBL_FRACLBITS;
    114 #else
    115 	unsigned int	dbl_fracl:DBL_FRACLBITS;
    116 	unsigned int	dbl_frach:DBL_FRACHBITS;
    117 	unsigned int	dbl_exp:DBL_EXPBITS;
    118 	unsigned int	dbl_sign:1;
    119 #endif
    120 };
    121 
    122 #if __HAVE_LONG_DOUBLE + 0 == 128
    123 
    124 #define	EXT_EXPBITS	15
    125 #define EXT_FRACHBITS	48
    126 #define	EXT_FRACLBITS	64
    127 #define	EXT_FRACBITS	(EXT_FRACLBITS + EXT_FRACHBITS)
    128 
    129 #define	EXT_TO_ARRAY32(u, a) do {				\
    130 	(a)[0] = (uint32_t)((u).extu_ext.ext_fracl >>  0);	\
    131 	(a)[1] = (uint32_t)((u).extu_ext.ext_fracl >> 32);	\
    132 	(a)[2] = (uint32_t)((u).extu_ext.ext_frach >>  0);	\
    133 	(a)[3] = (uint32_t)((u).extu_ext.ext_frach >> 32);	\
    134 } while (0)
    135 
    136 struct ieee_ext {
    137 #if _BYTE_ORDER == _BIG_ENDIAN
    138 	uint64_t ext_sign:1;
    139 	uint64_t ext_exp:EXT_EXPBITS;
    140 	uint64_t ext_frach:EXT_FRACHBITS;
    141 	uint64_t ext_fracl;
    142 #else
    143 	uint64_t ext_fracl;
    144 	uint64_t ext_frach:EXT_FRACHBITS;
    145 	uint64_t ext_exp:EXT_EXPBITS;
    146 	uint64_t ext_sign:1;
    147 #endif
    148 };
    149 #endif /* __HAVE_LONG_DOUBLE == 128 */
    150 
    151 /*
    152  * Floats whose exponent is in [1..INFNAN) (of whatever type) are
    153  * `normal'.  Floats whose exponent is INFNAN are either Inf or NaN.
    154  * Floats whose exponent is zero are either zero (iff all fraction
    155  * bits are zero) or subnormal values.
    156  *
    157  * At least one `signalling NaN' and one `quiet NaN' value must be
    158  * implemented.  It is left to the architecture to specify how to
    159  * distinguish between these.
    160  */
    161 #define	SNG_EXP_INFNAN	255
    162 #define	DBL_EXP_INFNAN	2047
    163 #if __HAVE_LONG_DOUBLE + 0 == 128
    164 #define	EXT_EXP_INFNAN	0x7fff
    165 #endif
    166 
    167 /*
    168  * Exponent biases.
    169  */
    170 #define	SNG_EXP_BIAS	127
    171 #define	DBL_EXP_BIAS	1023
    172 #if __HAVE_LONG_DOUBLE + 0 == 128
    173 #define	EXT_EXP_BIAS	16383
    174 #endif
    175 
    176 /*
    177  * Convenience data structures.
    178  */
    179 union ieee_single_u {
    180 	float			sngu_f;
    181 	struct ieee_single	sngu_sng;
    182 };
    183 
    184 #define	sngu_sign	sngu_sng.sng_sign
    185 #define	sngu_exp	sngu_sng.sng_exp
    186 #define	sngu_frac	sngu_sng.sng_frac
    187 #define	SNGU_ZEROFRAC_P(u)	((u).sngu_frac != 0)
    188 
    189 union ieee_double_u {
    190 	double			dblu_d;
    191 	struct ieee_double	dblu_dbl;
    192 };
    193 
    194 #define	dblu_sign	dblu_dbl.dbl_sign
    195 #define	dblu_exp	dblu_dbl.dbl_exp
    196 #define	dblu_frach	dblu_dbl.dbl_frach
    197 #define	dblu_fracl	dblu_dbl.dbl_fracl
    198 #define	DBLU_ZEROFRAC_P(u)	(((u).dblu_frach|(u).dblu_fracl) != 0)
    199 
    200 #if __HAVE_LONG_DOUBLE + 0 == 128
    201 union ieee_ext_u {
    202 	long double		extu_ld;
    203 	struct ieee_ext		extu_ext;
    204 };
    205 
    206 #define extu_exp	extu_ext.ext_exp
    207 #define extu_sign	extu_ext.ext_sign
    208 #define extu_fracl	extu_ext.ext_fracl
    209 #define extu_frach	extu_ext.ext_frach
    210 #define	EXTU_ZEROFRAC_P(u)	(((u).extu_frach|(u).extu_fracl) != 0)
    211 
    212 #ifndef LDBL_NBIT
    213 #define LDBL_IMPLICIT_NBIT	1	/* our NBIT is implicit */
    214 #endif
    215 
    216 #endif /* __HAVE_LONG_DOUBLE */
    217 
    218 #endif /* _SYS_IEEE754_H_ */
    219