このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
整数
整数クラス
MATLAB® には、4 種類の符号付きおよび符号なしの整数クラスがあります。符号付きの型を使うと、正の整数だけでなく負の整数も扱うことができますが、数値の正と負の符号を指定するために 1 ビットを使用するため、符号なしの型のように広範な数値を網羅することはできません。符号なしの型を使うと数値範囲は広くなりますが、ゼロまたは正の数値しか扱えません。
MATLAB では、整数データの保存に対し 1、2、4、8 バイトがサポートされています。データの処理に最小の整数型を使用すれば、メモリ消費量と実行時間を削減できます。たとえば、値 100
を保存するためには 32 ビットの整数は必要ありません。
8 つの整数クラス、各型で保存可能な値の範囲、その型を作成するために必要な MATLAB 変換関数を以下に示します。
クラス | 値の範囲 | 変換関数 |
---|---|---|
符号付き 8 ビット整数 | –27 ~ 27–1 |
|
符号付き 16 ビット整数 | –215 ~ 215–1 |
|
符号付き 32 ビット整数 | –231 ~ 231–1 |
|
符号付き 64 ビット整数 | –263 ~ 263–1 |
|
符号なしの 8 ビット整数 | 0 ~ 28–1 |
|
符号なしの 16 ビット整数 | 0 ~ 216–1 |
|
符号なしの 32 ビット整数 | 0 ~ 232–1 |
|
符号なしの 64 ビット整数 | 0 ~ 264–1 |
|
整数データの作成
MATLAB では既定で、数値データが倍精度浮動小数点 (double
) として保存されます。データを整数として保存するには、double
から希望する整数型に変換しなければなりません。上記の表に示した変換関数のいずれかを使用します。
たとえば、325
を変数 x
に割り当て、16 ビット符号付き整数として保存するには、次のように入力します。
x = int16(325);
整数に変換される数値が小数部分をもつ場合は、MATLAB は最も近い整数に丸めます。非整数部分がちょうど 0.5
である場合は、MATLAB は絶対値の大きい最も近い整数を選択します。
x = 325.499; int16(x)
ans = int16 325
x = x + .001; int16(x)
ans = int16 326
既定の方法以外で、数値を丸める必要がある場合、MATLAB では 4 つの丸め関数、round
、fix
、floor
、ceil
が提供されています。ゼロでない小数部がある場合は、関数 fix
によって既定の方法がオーバーライドされ、"ゼロ方向" に丸められます。
x = 325.9; int16(fix(x))
ans = int16 325
整数と浮動小数点数の両方を含む算術演算の結果は、常に、整数データ型になります。MATLAB では、必要な場合、既定の丸めアルゴリズムに従って結果を丸めます。次の例では、MATLAB は厳密な答え 1426.75
を出した後に、次に最も大きい整数に丸めています。
int16(325)*4.39
ans = int16 1427
整数変換関数は、文字ベクトルなどのその他のクラスを整数に変換する場合にも便利です。
str = 'Hello World';
int8(str)
ans = 1×11 int8 row vector 72 101 108 108 111 32 87 111 114 108 100
NaN
値を整数クラスに変換すると、結果はその整数クラスの 0
の値です。以下に例を示します。
int32(NaN)
ans = int32 0
整数クラスの算術演算
MATLAB では、次のデータ型に対して整数の算術演算を実行できます。
同じ整数データ型をもつ、整数あるいは整数配列。算術演算では、結果はオペランドと同じデータ型をもちます。
x = uint32([132 347 528]) .* uint32(75); class(x)
ans = 'uint32'
整数あるいは整数配列と、スカラー倍精度浮動小数点数。算術演算では、結果は整数オペランドと同じデータ型をもちます。
x = uint32([132 347 528]) .* 75.49; class(x)
ans = 'uint32'
二項演算で、一方のオペランドが整数データ型 (ただし、64 ビット整数以外) の配列で、他方のオペランドがスカラー double である場合、MATLAB では、要素単位の倍精度算術演算を行った後、結果がオリジナルの整数データ型に変換されます。二項演算で、64 ビット整数の配列とスカラー double を使用する場合、MATLAB では、80 ビット拡張精度算術であるかのように演算して精度を失わないようにします。
整数型の複素数を含む演算はサポートされていません。
整数クラスの最大値と最小値
各整数データ型には、データ型で表現できる最大整数値と最小整数値があります。整数クラスの表の「数値範囲」列に、各整数データ型の最大値と最小値がリストされています。
これらの値は、関数 intmax
と関数 intmin
を使用しても得ることができます。
intmax("int8")
ans = int8 127
intmin("int8")
ans = int8 -128
整数データ型の最大値よりも大きい数をこのデータ型に変換する場合、MATLAB では値が最大値に設定されます。同様に、整数データ型の最小値よりも小さい数を変換する場合は、MATLAB によって最小値に設定されます。以下に例を示します。
x = int8(300)
x = int8 127
x = int8(-300)
x = int8 -128
また、整数を含む算術演算の結果が、データ型の最大 (あるいは最小) 値を超える場合、MATLAB では結果が最大 (あるいは最小) 値に設定されます。
x = int8(100)*3
x = int8 127
x = int8(-100)*3
x = int8 -128
変換による精度低下
大きい整数 (flintmax
より大きい整数) の数値配列を作成すると、既定では MATLAB は最初に入力を倍精度として表します。この入力を int64
データ型または uint64
データ型に変換すると、精度が低下することがあります。精度を維持するには、代わりに配列のスカラー要素ごとに int64
または uint64
を呼び出します。
たとえば、int64
を使用して、大きい整数の数値配列を 64 ビット符号付き整数配列に変換します。出力配列で精度が低下します。
Y_inaccurate = int64([-72057594035891654 81997179153022975])
Y_inaccurate = 1×2 int64 row vector
-72057594035891656 81997179153022976
代わりに、スカラー要素ごとに int64
を呼び出すと、正確な配列が返されます。
Y_accurate = [int64(-72057594035891654) int64(81997179153022975)]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975
R2019b 以降、整数の 16 進数値または 2 進数値を使用することでも、精度を低下させることなく整数配列を作成できます。
Y_accurate = [0xFF000000001F123As64 0x1234FFFFFFFFFFFs64]
Y_accurate = 1×2 int64 row vector
-72057594035891654 81997179153022975