1 #ifndef _IEEE_FP_H_ 2 #define _IEEE_FP_H_ 3 4 #include "_ansi.h" 5 6 #include <machine/ieeefp.h> 7 #include <float.h> 8 #include <stdint.h> 9 10 _BEGIN_STD_C 11 12 #ifndef _LDBL_EQ_DBL 13 14 #ifndef LDBL_MANT_DIG 15 #error "LDBL_MANT_DIG not defined - should be found in float.h" 16 17 #elif LDBL_MANT_DIG == DBL_MANT_DIG 18 #error "double and long double are the same size but LDBL_EQ_DBL is not defined" 19 20 #elif LDBL_MANT_DIG == 53 21 /* This happens when doubles are 32-bits and long doubles are 64-bits. */ 22 #define EXT_EXPBITS 11 23 #define EXT_FRACHBITS 20 24 #define EXT_FRACLBITS 32 25 #define __ieee_ext_field_type unsigned long 26 27 #elif LDBL_MANT_DIG == 64 28 #define EXT_EXPBITS 15 29 #define EXT_FRACHBITS 32 30 #define EXT_FRACLBITS 32 31 #define __ieee_ext_field_type unsigned int 32 33 #elif LDBL_MANT_DIG == 65 34 #define EXT_EXPBITS 15 35 #define EXT_FRACHBITS 32 36 #define EXT_FRACLBITS 32 37 #define __ieee_ext_field_type unsigned int 38 39 #elif LDBL_MANT_DIG == 112 40 #define EXT_EXPBITS 15 41 #define EXT_FRACHBITS 48 42 #define EXT_FRACLBITS 64 43 #define __ieee_ext_field_type unsigned long long 44 45 #elif LDBL_MANT_DIG == 113 46 #define EXT_EXPBITS 15 47 #define EXT_FRACHBITS 48 48 #define EXT_FRACLBITS 64 49 #define __ieee_ext_field_type unsigned long long 50 51 #else 52 #error Unsupported value for LDBL_MANT_DIG 53 #endif 54 55 #define EXT_EXP_INFNAN ((1 << EXT_EXPBITS) - 1) /* 32767 */ 56 #define EXT_EXP_BIAS ((1 << (EXT_EXPBITS - 1)) - 1) /* 16383 */ 57 #define EXT_FRACBITS (EXT_FRACLBITS + EXT_FRACHBITS) 58 59 typedef struct ieee_ext 60 { 61 __ieee_ext_field_type ext_fracl : EXT_FRACLBITS; 62 __ieee_ext_field_type ext_frach : EXT_FRACHBITS; 63 __ieee_ext_field_type ext_exp : EXT_EXPBITS; 64 __ieee_ext_field_type ext_sign : 1; 65 } ieee_ext; 66 67 typedef union ieee_ext_u 68 { 69 long double extu_ld; 70 struct ieee_ext extu_ext; 71 } ieee_ext_u; 72 73 #endif /* ! _LDBL_EQ_DBL */ 74 75 76 /* FLOATING ROUNDING */ 77 78 typedef int fp_rnd; 79 #define FP_RN 0 /* Round to nearest */ 80 #define FP_RM 1 /* Round down */ 81 #define FP_RP 2 /* Round up */ 82 #define FP_RZ 3 /* Round to zero (trunate) */ 83 84 fp_rnd fpgetround (void); 85 fp_rnd fpsetround (fp_rnd); 86 87 /* EXCEPTIONS */ 88 89 typedef int fp_except; 90 #define FP_X_INV 0x10 /* Invalid operation */ 91 #define FP_X_DX 0x80 /* Divide by zero */ 92 #define FP_X_OFL 0x04 /* Overflow exception */ 93 #define FP_X_UFL 0x02 /* Underflow exception */ 94 #define FP_X_IMP 0x01 /* imprecise exception */ 95 96 fp_except fpgetmask (void); 97 fp_except fpsetmask (fp_except); 98 fp_except fpgetsticky (void); 99 fp_except fpsetsticky (fp_except); 100 101 /* INTEGER ROUNDING */ 102 103 typedef int fp_rdi; 104 #define FP_RDI_TOZ 0 /* Round to Zero */ 105 #define FP_RDI_RD 1 /* Follow float mode */ 106 107 fp_rdi fpgetroundtoi (void); 108 fp_rdi fpsetroundtoi (fp_rdi); 109 110 #define __IEEE_DBL_EXPBIAS 1023 111 #define __IEEE_FLT_EXPBIAS 127 112 113 #define __IEEE_DBL_EXPLEN 11 114 #define __IEEE_FLT_EXPLEN 8 115 116 117 #define __IEEE_DBL_FRACLEN (64 - (__IEEE_DBL_EXPLEN + 1)) 118 #define __IEEE_FLT_FRACLEN (32 - (__IEEE_FLT_EXPLEN + 1)) 119 120 #define __IEEE_DBL_MAXPOWTWO ((double)(1L << 32 - 2) * (1L << (32-11) - 32 + 1)) 121 #define __IEEE_FLT_MAXPOWTWO ((float)(1L << (32-8) - 1)) 122 123 #define __IEEE_DBL_NAN_EXP 0x7ff 124 #define __IEEE_FLT_NAN_EXP 0xff 125 126 #ifdef __ieeefp_isnanf 127 #define isnanf(x) __ieeefp_isnanf(x) 128 #endif 129 130 #ifdef __ieeefp_isinff 131 #define isinff(x) __ieeefp_isinff(x) 132 #endif 133 134 #ifdef __ieeefp_finitef 135 #define finitef(x) __ieeefp_finitef(x) 136 #endif 137 138 #ifdef _DOUBLE_IS_32BITS 139 #undef __IEEE_DBL_EXPBIAS 140 #define __IEEE_DBL_EXPBIAS __IEEE_FLT_EXPBIAS 141 142 #undef __IEEE_DBL_EXPLEN 143 #define __IEEE_DBL_EXPLEN __IEEE_FLT_EXPLEN 144 145 #undef __IEEE_DBL_FRACLEN 146 #define __IEEE_DBL_FRACLEN __IEEE_FLT_FRACLEN 147 148 #undef __IEEE_DBL_MAXPOWTWO 149 #define __IEEE_DBL_MAXPOWTWO __IEEE_FLT_MAXPOWTWO 150 151 #undef __IEEE_DBL_NAN_EXP 152 #define __IEEE_DBL_NAN_EXP __IEEE_FLT_NAN_EXP 153 154 #undef __ieee_double_shape_type 155 #define __ieee_double_shape_type __ieee_float_shape_type 156 157 #endif /* _DOUBLE_IS_32BITS */ 158 159 _END_STD_C 160 161 #endif /* _IEEE_FP_H_ */ 162