我怎样才能获得最高的浮点数?

时间:2012-12-10 06:22:25

标签: c gcc floating-point

我在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)

意味着什么?

1 个答案:

答案 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_Fa除以某个字大小的位数的幂。因此,如果W_TYPE_SIZE表示的字大小为32位,则a / Wtype_MAXp1_Fa除以2 32 。它似乎是一些扩展精度算术的一部分;它将a分成一些“高位”和一些“低位”。

在C中,您可以通过包含<float.h>并使用FLT_MAX获取最大有限floatDBL_MAX获得最大有限值来获得最大有限浮点数{ {1}}和double表示最大有限LDBL_MAX。这些值远大于long double。如果您的平台上有该版块,则可以通过加入Wtype_MAXp1_F并使用float获得最高<math.h>值,即无穷大。