我在libgcc中读了一些代码:
UDWtype __fixunsxfDI (XFtype a)
{
if (a < 0)
return 0;
/* Compute high word of result, as a flonum. */
const XFtype b = (a / Wtype_MAXp1_F);
/* Convert that to fixed (but not to DWtype!),
and shift it into the high word. */
UDWtype v = (UWtype) b;
v <<= W_TYPE_SIZE;
/* Remove high part from the XFtype, leaving the low part as flonum. */
a -= (XFtype)v;
/* Convert that to fixed (but not to DWtype!) and add it in.
Sometimes A comes out negative. This is significant, since
A has more bits than a long int does. */
if (a < 0)
v -= (UWtype) (- a);
else
v += (UWtype) a;
return v;
}
关于XFType:
typedef float XFtype __attribute__ ((mode (XF)));
关于Wtype_MAXp1_F:
#if W_TYPE_SIZE == 8
# define Wtype_MAXp1_F 0x1p8f
#elif W_TYPE_SIZE == 16
# define Wtype_MAXp1_F 0x1p16f
#elif W_TYPE_SIZE == 32
# define Wtype_MAXp1_F 0x1p32f
#elif W_TYPE_SIZE == 64
# define Wtype_MAXp1_F 0x1p64f
#else
# error "expand the table"
#endif
我认为XFType是96位浮点数,0x1p32f是1 ^ 32。
什么
const XFtype b =(a / Wtype_MAXp1_F)
意味着什么?
答案 0 :(得分:0)
“0x1p32f”是2 32 并且类型为float
。这是十六进制浮点格式。 “0x”之后和“p”之前的部分被解释为十六进制数字并且可以包括小数点,因此,在“0x3.5p1”中,“3.5”表示3 + 5/16 = 3.3125 10 子>。 “p”之后的数字是一个整数,表示乘以第一部分的2的幂。所以“0x1p32f”是1•2 32 ,“0x3.5p-1”是3.3125 10 •2 -1 = 1.65625 10 子>。后缀与十进制浮点常量相同:“f”或“F”表示float
,后缀表示double
,“l”或“L”表示long double
a / Wtype_MAXp1_F
将a
除以某个字大小的位数的幂。因此,如果W_TYPE_SIZE
表示的字大小为32位,则a / Wtype_MAXp1_F
将a
除以2 32 。它似乎是一些扩展精度算术的一部分;它将a
分成一些“高位”和一些“低位”。
在C中,您可以通过包含<float.h>
并使用FLT_MAX
获取最大有限float
,DBL_MAX
获得最大有限值来获得最大有限浮点数{ {1}}和double
表示最大有限LDBL_MAX
。这些值远大于long double
。如果您的平台上有该版块,则可以通过加入Wtype_MAXp1_F
并使用float
获得最高<math.h>
值,即无穷大。