-1

我在 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:</p>

#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)

方法 ?

4

1 回答 1

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除以a2 的某个字长的位数的幂。因此,如果由 表示的字长W_TYPE_SIZE是 32 位,则a / Wtype_MAXp1_F除以a2 32。它似乎是某些扩展精度算术的一部分;它a分为一些“高位”和一些“低位”。

在 C 中,您可以通过包含<float.h>并使用FLT_MAX最大有限浮点数floatDBL_MAX最大有限浮点数double和最大有限浮点数来获得最大LDBL_MAX有限浮点数long double。这些值远大于Wtype_MAXp1_F。如果它在您的平台上可用,您可以float通过包含<math.h>和使用INFINITY.

于 2012-12-10T12:00:43.620 回答