4.2.6.13 半精度浮動小数点数 【Professional版のみ】 【V1.05.00以降】

半精度浮動小数点型(half-precision floating-point type)を使用することができます。

半精度浮動小数点型は次の特徴を持ちます。

-

型名を__fp16とします。

-

サイズは2バイトです。整列条件も2バイトです。

-

データの内部表現はIEEE754-2008 のbinary16 に準拠します。

-

符号部1ビット,指数部5ビット,仮数部10ビット(隠れビットを含む場合は11ビット)

-

指数部のバイアスは0xf(例 1.0は16進数ビット表現での0x3c00)

-

演算は,__fp16型同士の代入,__fp16型からfloat型への変換,float型から__fp16型への変換のみをサポートします。その他の演算は,float型へ変換してから行い,その結果はfloat型に対する同演算と同じ型を持ちます。__fp16型からdouble型への変換も,一度float型に変換してから行います。

-

float型から__fp16型への変換時は非正規化数をサポートせず,丸めモードに従った正規化数にフラッシュします。

-

丸めモードは-Xround=nearestしかサポートしません。

-

浮動小数点定数に対する接尾語はありません。

-

関数仮引数型,関数返却型に指定できません。__fp16 型の値を関数間で受け渡す場合は,floatなど別の型にキャストして受け渡すか,ポインタで受け渡すか,__fp16型をメンバに持つ構造体引数を使って受け渡します。

-

呼び出し先に仮引数型が無い場合,既定の実引数拡張によりfloat型へ変換した後,さらにdouble型に変換してから受け渡します。

プロトタイプ宣言がない,仮引数並びがない,可変個数実引数,のいずれかの場合です。

-

実引数に指定した場合は,仮引数型に変換してから受け渡します。仮引数型が無い場合,既定の実引数拡張によりfloat型へ変換後,double型に変換してから受け渡します。

-

構造体メンバ,共用体メンバ,配列要素に指定でます。ビットフィールドメンバには指定できません。

 

extern __fp16 hpvar1, hpvar2, hpvar3;
extern float fvar;
extern double dvar;
extern int ivar;
 
/* 外部変数定義 */
__fp16 hpvar = 1.0;
 
void fun() {
  /* 定数代入 */
  hpvar = 1.0;
 
  /* __fp16同士の代入 */
  hpvar1 = hpvar2;
 
  /* 単精度浮動小数への型変換 */
  fvar = hpvar;                                          /* fvar = (float)hpvar; と同義 */
 
  /* 倍精度浮動小数への型変換 */
  dvar = hpvar;                                 /* dvar = (double)(float)hpvar; と同義 */
 
  /* 倍精度浮動小数からの型変換 */
  hpvar = dvar;                                 /* hpvar = (__fp16)(float)dvar; と同義 */
 
  /* 整数への型変換 */
  ivar = hpvar;                                    /* ivar = (int)(float)hpvar; と同義 */
 
  /* 整数からの型変換 */
  hpvar = ivar;                                 /* hpvar = (__fp16)(float)ivar; と同義 */
 
  /* 算術演算 */
  hpvar3 = hpvar1 + hpvar2;   /* hpvar3 = (__fp16)((float)hpvar1 + (float)hpvar2;) と同義 */
}