📄 libm_support.h
字号:
#define FP80(ld) ((struct fp80 *)&ld)/* macros to extract signed low and high doubleword of long double */#if defined(SIZE_INT_32)# define HI_DWORD_80(ld) ((((FP80(ld)->sign << 15) | FP80(ld)->exponent) << 16) | \ ((FP80(ld)->hi_significand >> 16) & 0xFFFF))# define LO_DWORD_80(ld) SIGN_EXPAND(FP80(ld)->lo_significand, 32)#elif defined(SIZE_INT_64)# define HI_DWORD_80(ld) ((((FP80(ld)->sign << 15) | FP80(ld)->exponent) << 16) | \ ((FP80(ld)->significand >> 48) & 0xFFFF))# define LO_DWORD_80(ld) SIGN_EXPAND(FP80(ld)->significand, 32)#endif/* macros to extract hi bits of significand. * note that explicit high bit do not count (returns as is) */#if defined(SIZE_INT_32)# define HI_SIGNIFICAND_80(X,NBITS) ((X)->hi_significand >> (31 - (NBITS)))#elif defined(SIZE_INT_64)# define HI_SIGNIFICAND_80(X,NBITS) ((X)->significand >> (63 - (NBITS)))#endif/* macros to check, whether a significand bits are all zero, or some of them are non-zero. * note that SIGNIFICAND_ZERO_80 tests high bit also, but SIGNIFICAND_NONZERO_80 does not */#define SIGNIFICAND_ZERO_32(X) ((X)->significand == 0)#define SIGNIFICAND_NONZERO_32(X) ((X)->significand != 0)#if defined(SIZE_INT_32)# define SIGNIFICAND_ZERO_64(X) (((X)->hi_significand == 0) && ((X)->lo_significand == 0))# define SIGNIFICAND_NONZERO_64(X) (((X)->hi_significand != 0) || ((X)->lo_significand != 0))#elif defined(SIZE_INT_64)# define SIGNIFICAND_ZERO_64(X) ((X)->significand == 0)# define SIGNIFICAND_NONZERO_64(X) ((X)->significand != 0)#endif#if defined(SIZE_INT_32)# define SIGNIFICAND_ZERO_80(X) (((X)->hi_significand == 0x00000000) && ((X)->lo_significand == 0))# define SIGNIFICAND_NONZERO_80(X) (((X)->hi_significand != 0x80000000) || ((X)->lo_significand != 0))#elif defined(SIZE_INT_64)# define SIGNIFICAND_ZERO_80(X) ((X)->significand == 0x0000000000000000)# define SIGNIFICAND_NONZERO_80(X) ((X)->significand != 0x8000000000000000)#endif/* macros to compare long double with constant value, represented as hex */#define SIGNIFICAND_EQ_HEX_32(X,BITS) ((X)->significand == 0x ## BITS)#define SIGNIFICAND_GT_HEX_32(X,BITS) ((X)->significand > 0x ## BITS)#define SIGNIFICAND_GE_HEX_32(X,BITS) ((X)->significand >= 0x ## BITS)#define SIGNIFICAND_LT_HEX_32(X,BITS) ((X)->significand < 0x ## BITS)#define SIGNIFICAND_LE_HEX_32(X,BITS) ((X)->significand <= 0x ## BITS)#if defined(SIZE_INT_32)# define SIGNIFICAND_EQ_HEX_64(X,HI,LO) \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand == 0x ## LO))# define SIGNIFICAND_GT_HEX_64(X,HI,LO) (((X)->hi_significand > 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand > 0x ## LO)))# define SIGNIFICAND_GE_HEX_64(X,HI,LO) (((X)->hi_significand > 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand >= 0x ## LO)))# define SIGNIFICAND_LT_HEX_64(X,HI,LO) (((X)->hi_significand < 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand < 0x ## LO)))# define SIGNIFICAND_LE_HEX_64(X,HI,LO) (((X)->hi_significand < 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand <= 0x ## LO)))#elif defined(SIZE_INT_64)# define SIGNIFICAND_EQ_HEX_64(X,HI,LO) ((X)->significand == 0x ## HI ## LO)# define SIGNIFICAND_GT_HEX_64(X,HI,LO) ((X)->significand > 0x ## HI ## LO)# define SIGNIFICAND_GE_HEX_64(X,HI,LO) ((X)->significand >= 0x ## HI ## LO)# define SIGNIFICAND_LT_HEX_64(X,HI,LO) ((X)->significand < 0x ## HI ## LO)# define SIGNIFICAND_LE_HEX_64(X,HI,LO) ((X)->significand <= 0x ## HI ## LO)#endif#if defined(SIZE_INT_32)# define SIGNIFICAND_EQ_HEX_80(X,HI,LO) \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand == 0x ## LO))# define SIGNIFICAND_GT_HEX_80(X,HI,LO) (((X)->hi_significand > 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand > 0x ## LO)))# define SIGNIFICAND_GE_HEX_80(X,HI,LO) (((X)->hi_significand > 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand >= 0x ## LO)))# define SIGNIFICAND_LT_HEX_80(X,HI,LO) (((X)->hi_significand < 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand < 0x ## LO)))# define SIGNIFICAND_LE_HEX_80(X,HI,LO) (((X)->hi_significand < 0x ## HI) || \ (((X)->hi_significand == 0x ## HI) && ((X)->lo_significand <= 0x ## LO)))#elif defined(SIZE_INT_64)# define SIGNIFICAND_EQ_HEX_80(X,HI,LO) ((X)->significand == 0x ## HI ## LO)# define SIGNIFICAND_GT_HEX_80(X,HI,LO) ((X)->significand > 0x ## HI ## LO)# define SIGNIFICAND_GE_HEX_80(X,HI,LO) ((X)->significand >= 0x ## HI ## LO)# define SIGNIFICAND_LT_HEX_80(X,HI,LO) ((X)->significand < 0x ## HI ## LO)# define SIGNIFICAND_LE_HEX_80(X,HI,LO) ((X)->significand <= 0x ## HI ## LO)#endif#define VALUE_EQ_HEX_32(X,EXP,BITS) \ (((X)->exponent == (EXP)) && (SIGNIFICAND_EQ_HEX_32(X, BITS)))#define VALUE_GT_HEX_32(X,EXP,BITS) (((X)->exponent > (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_GT_HEX_32(X, BITS))))#define VALUE_GE_HEX_32(X,EXP,BITS) (((X)->exponent > (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_GE_HEX_32(X, BITS))))#define VALUE_LT_HEX_32(X,EXP,BITS) (((X)->exponent < (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_LT_HEX_32(X, BITS))))#define VALUE_LE_HEX_32(X,EXP,BITS) (((X)->exponent < (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_LE_HEX_32(X, BITS))))#define VALUE_EQ_HEX_64(X,EXP,HI,LO) \ (((X)->exponent == (EXP)) && (SIGNIFICAND_EQ_HEX_64(X, HI, LO)))#define VALUE_GT_HEX_64(X,EXP,HI,LO) (((X)->exponent > (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_GT_HEX_64(X, HI, LO))))#define VALUE_GE_HEX_64(X,EXP,HI,LO) (((X)->exponent > (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_GE_HEX_64(X, HI, LO))))#define VALUE_LT_HEX_64(X,EXP,HI,LO) (((X)->exponent < (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_LT_HEX_64(X, HI, LO))))#define VALUE_LE_HEX_64(X,EXP,HI,LO) (((X)->exponent < (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_LE_HEX_64(X, HI, LO))))#define VALUE_EQ_HEX_80(X,EXP,HI,LO) \ (((X)->exponent == (EXP)) && (SIGNIFICAND_EQ_HEX_80(X, HI, LO)))#define VALUE_GT_HEX_80(X,EXP,HI,LO) (((X)->exponent > (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_GT_HEX_80(X, HI, LO))))#define VALUE_GE_HEX_80(X,EXP,HI,LO) (((X)->exponent > (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_GE_HEX_80(X, HI, LO))))#define VALUE_LT_HEX_80(X,EXP,HI,LO) (((X)->exponent < (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_LT_HEX_80(X, HI, LO))))#define VALUE_LE_HEX_80(X,EXP,HI,LO) (((X)->exponent < (EXP)) || \ (((X)->exponent == (EXP)) && (SIGNIFICAND_LE_HEX_80(X, HI, LO))))/* macros to compare two long doubles */#define SIGNIFICAND_EQ_32(X,Y) ((X)->significand == (Y)->significand)#define SIGNIFICAND_GT_32(X,Y) ((X)->significand > (Y)->significand)#define SIGNIFICAND_GE_32(X,Y) ((X)->significand >= (Y)->significand)#define SIGNIFICAND_LT_32(X,Y) ((X)->significand < (Y)->significand)#define SIGNIFICAND_LE_32(X,Y) ((X)->significand <= (Y)->significand)#if defined(SIZE_INT_32)# define SIGNIFICAND_EQ_64(X,Y) \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand == (Y)->lo_significand))# define SIGNIFICAND_GT_64(X,Y) (((X)->hi_significand > (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand > (Y)->lo_significand)))# define SIGNIFICAND_GE_64(X,Y) (((X)->hi_significand > (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand >= (Y)->lo_significand)))# define SIGNIFICAND_LT_64(X,Y) (((X)->hi_significand < (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand < (Y)->lo_significand)))# define SIGNIFICAND_LE_64(X,Y) (((X)->hi_significand < (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand <= (Y)->lo_significand)))#elif defined(SIZE_INT_64)# define SIGNIFICAND_EQ_64(X,Y) ((X)->significand == (Y)->significand)# define SIGNIFICAND_GT_64(X,Y) ((X)->significand > (Y)->significand)# define SIGNIFICAND_GE_64(X,Y) ((X)->significand >= (Y)->significand)# define SIGNIFICAND_LT_64(X,Y) ((X)->significand < (Y)->significand)# define SIGNIFICAND_LE_64(X,Y) ((X)->significand <= (Y)->significand)#endif#if defined(SIZE_INT_32)# define SIGNIFICAND_EQ_80(X,Y) \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand == (Y)->lo_significand))# define SIGNIFICAND_GT_80(X,Y) (((X)->hi_significand > (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand > (Y)->lo_significand)))# define SIGNIFICAND_GE_80(X,Y) (((X)->hi_significand > (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand >= (Y)->lo_significand)))# define SIGNIFICAND_LT_80(X,Y) (((X)->hi_significand < (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand < (Y)->lo_significand)))# define SIGNIFICAND_LE_80(X,Y) (((X)->hi_significand < (Y)->hi_significand) || \ (((X)->hi_significand == (Y)->hi_significand) && ((X)->lo_significand <= (Y)->lo_significand)))#elif defined(SIZE_INT_64)# define SIGNIFICAND_EQ_80(X,Y) ((X)->significand == (Y)->significand)# define SIGNIFICAND_GT_80(X,Y) ((X)->significand > (Y)->significand)# define SIGNIFICAND_GE_80(X,Y) ((X)->significand >= (Y)->significand)# define SIGNIFICAND_LT_80(X,Y) ((X)->significand < (Y)->significand)# define SIGNIFICAND_LE_80(X,Y) ((X)->significand <= (Y)->significand)#endif#define VALUE_EQ_32(X,Y) \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_EQ_32(X, Y)))#define VALUE_GT_32(X,Y) (((X)->exponent > (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_GT_32(X, Y))))#define VALUE_GE_32(X,Y) (((X)->exponent > (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_GE_32(X, Y))))#define VALUE_LT_32(X,Y) (((X)->exponent < (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_LT_32(X, Y))))#define VALUE_LE_32(X,Y) (((X)->exponent < (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_LE_32(X, Y))))#define VALUE_EQ_64(X,Y) \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_EQ_64(X, Y)))#define VALUE_GT_64(X,Y) (((X)->exponent > (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_GT_64(X, Y))))#define VALUE_GE_64(X,Y) (((X)->exponent > (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_GE_64(X, Y))))#define VALUE_LT_64(X,Y) (((X)->exponent < (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_LT_64(X, Y))))#define VALUE_LE_64(X,Y) (((X)->exponent < (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_LE_64(X, Y))))#define VALUE_EQ_80(X,Y) \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_EQ_80(X, Y)))#define VALUE_GT_80(X,Y) (((X)->exponent > (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_GT_80(X, Y))))#define VALUE_GE_80(X,Y) (((X)->exponent > (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_GE_80(X, Y))))#define VALUE_LT_80(X,Y) (((X)->exponent < (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_LT_80(X, Y))))#define VALUE_LE_80(X,Y) (((X)->exponent < (Y)->exponent) || \ (((X)->exponent == (Y)->exponent) && (SIGNIFICAND_LE_80(X, Y))))/* add/subtract 1 ulp macros */#if defined(SIZE_INT_32)# define ADD_ULP_80(X) \ if ((++(X)->lo_significand == 0) && \ (++(X)->hi_significand == (((X)->exponent == 0) ? 0x80000000 : 0))) \ { \ (X)->hi_significand |= 0x80000000; \ ++(X)->exponent; \ }# define SUB_ULP_80(X) \ if (--(X)->lo_significand == 0xFFFFFFFF) { \ --(X)->hi_significand; \ if (((X)->exponent != 0) && \ ((X)->hi_significand == 0x7FFFFFFF) && \ (--(X)->exponent != 0)) \ { \ (X)->hi_significand |= 0x80000000; \ } \ }#elif defined(SIZE_INT_64)# define ADD_ULP_80(X) \ if (++(X)->significand == (((X)->exponent == 0) ? 0x8000000000000000 : 0))) { \ (X)->significand |= 0x8000000000000000; \ ++(X)->exponent; \ }# define SUB_ULP_80(X) \ { \ --(X)->significand; \ if (((X)->exponent != 0) && \ ((X)->significand == 0x7FFFFFFFFFFFFFFF) && \ (--(X)->exponent != 0)) \ { \ (X)->significand |= 0x8000000000000000; \ } \ }#endif/* error codes */#define DOMAIN 1 /* argument domain error */#define SING 2 /* argument singularity */#define OVERFLOW 3 /* overflow range error */#define UNDERFLOW 4 /* underflow range error */#define TLOSS 5 /* total loss of precision */#define PLOSS 6 /* partial loss of precision *//* */#define VOLATILE_32 /*volatile*/#define VOLATILE_64 /*volatile*/#define VOLATILE_80 /*volatile*/#define QUAD_TYPE _Quad#endif /*__LIBM_SUPPORT_H_INCLUDED__*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -