17.6. 型変換

17.6.1. 暗黙型変換

OpenCLではvoid、halfを除いたスカラ型の暗黙の型変換をサポートします。暗黙型変換では、単なるビット構成の再解釈ではなく、同一の値に変換します。

17.6.2. 明示的型変換(キャスト)

明示的型変換もOpenCLはサポートしますが、ベクトル型はサポート外です。例えば以下のキャストは不正です。

float4 num;
int4 i = (int4) num; //(1)

(1)

不正なベクトル型キャスト。

例外としては、スカラ型をベクトル型にキャストする場合です。

int x = 10;
int4 i = (int4) x; //(1)

(1)

有効なキャスト。

この例では、(10,10,10,10)として正常に(スカラ型からベクトル型へ)キャストが行なわれます。

17.6.3. 変換関数

ベクトルのキャストを行なう場合は、convert変換関数を使うことができます。

定義. 

destType convert_destType<_sat><_roundingMode> (sourceType)

定義の中の<>`で囲まれた箇所はオプションなので除外できます。一番シンプルな例は、オプションを使わない場合です。<_sat>は演算結果の飽和を指定、<_roundingMode>`は丸めモードの指定します。

uint4 num = (uint4)(...);
int4 y = convert_int4(num); //(1)

(1)

符号無し整数に変換しています。

uint4 num = (uint4)(...);
int4 y = convert_int4_sat(num); //(1)

(1)

符号無し整数に変換し、値が溢れる場合は結果を飽和させます。

uint4 num = (uint4)(...);
int4 y = convert_int4_sat_rtz(num); //(1)

(1)

0への丸めモードで符号無し整数に変換します。値が溢れる場合は結果を飽和させます。

次に簡単な例を見てみましょう。

サンプル. 

float x = 12345.12345f;
uint y = convert_uint(x);
printf("convert_uint: %u\n",y);

float2 x_v2 = (float2)(1.234f, 4.9f);
uint2 y_v2 = convert_uint2(x_v2);
printf("convert_uint2: %#v2u\n", y_v2);

float4 x_v4 = (float4)(1.234f, FLT_MIN, MAXFLOAT, -MAXFLOAT); //(1)
int4 y_v4_sat = convert_int4_sat(x_v4);
printf("convert_int4_sat: %#v4d\n", y_v4_sat);

int4 y_v4_sat_rtz = convert_int4_sat_rtz(x_v4);
printf("convert_int4_sat_rtz: %#v4d\n", y_v4_sat_rtz);

int4 y_v4_sat_rtp = convert_int4_sat_rtp(x_v4);
printf("convert_int4_sat_rtp: %#v4d\n", y_v4_sat_rtp);

(1)

FLT_MINは「0x1.0p-126f」、MAXFLOATはfloatが取れる有限の最大値です。

出力. 

convert_uint: 12345
convert_uint2: 1,4
convert_int4_sat: 1,0,2147483647,-2147483648
convert_int4_sat_rtz: 1,0,2147483647,-2147483648
convert_int4_sat_rtp: 2,1,2147483647,-2147483648
komatsumasaki-no-Mac-mini:build komatsu$

変換関数は数学的直感として理解するものなので、細かくは説明はしません。この例では、飽和によりint型の最大、最小値に、float型の最大、最小値が変換されていることが分かるかと思います。

丸めモードはrtz(0への丸め)がデフォルト設定です。

Note

丸めモードについては、「表:丸めモード」(???) を参照ください。

Copyright 2018-2019, by Masaki Komatsu