-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 は 96bits float で、0x1p32f は 1^32 だと思います。

なに

const XFtype b = (a / Wtype_MAXp1_F)

意味 ?

4

1 に答える 1

0

「0x1p32f」は 2 32で、タイプはfloatです。これは 16 進浮動小数点形式です。「0x」の後と「p」の前の部分は 16 進数として解釈され、小数点を含む場合があるため、「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です。接尾辞は 10 進浮動小数点定数の場合と同じです。「f」または「F」は を意味floatし、接尾辞がない場合は を意味doubleし、「l」または「L」は を意味しlong doubleます。

a / Wtype_MAXp1_Faあるワードサイズのビット数の累乗を2で除算します。したがって、 で表されるワード サイズW_TYPE_SIZEが 32 ビットの場合、は2 32a / Wtype_MAXp1_Fで除算されます。一部の拡張精度演算の一部のようです。いくつかの「上位ビット」といくつかの「下位ビット」に分かれています。aa

Cでは、最大の有限、最大の有限、および最大の有限を含めて使用することにより、最大の<float.h>有限浮動小数点数を取得できます。これらの値は よりもはるかに大きくなります。プラットフォームで使用できる場合は、 を含めて使用することで、無限大である最高値を取得できます。FLT_MAXfloatDBL_MAXdoubleLDBL_MAXlong doubleWtype_MAXp1_Ffloat<math.h>INFINITY

于 2012-12-10T12:00:43.620 に答える