4.2.4.13
半精度浮動小数点数 【Professional版のみ】 【V1.05.00以降】
半精度浮動小数点型(half-precision floating-point type)を使用することができます。
半精度浮動小数点型は次の特徴を持ちます。
- | データの内部表現は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;) と同義 */
}
|