Main Content

整数

整数クラス

MATLAB® には、4 種類の符号付きおよび符号なしの整数クラスがあります。符号付きの型を使うと、正の整数だけでなく負の整数も扱うことができますが、数値の正と負の符号を指定するために 1 ビットを使用するため、符号なしの型のように広範な数値を網羅することはできません。符号なしの型を使うと数値範囲は広くなりますが、ゼロまたは正の数値しか扱えません。

MATLAB では、整数データの保存に対し 1、2、4、8 バイトがサポートされています。データの処理に最小の整数型を使用すれば、メモリ消費量と実行時間を削減できます。たとえば、値 100 を保存するためには 32 ビットの整数は必要ありません。

8 つの整数クラス、各型で保存可能な値の範囲、その型を作成するために必要な MATLAB 変換関数を以下に示します。

クラス

値の範囲

変換関数

符号付き 8 ビット整数

–27 ~ 27–1

int8

符号付き 16 ビット整数

–215 ~ 215–1

int16

符号付き 32 ビット整数

–231 ~ 231–1

int32

符号付き 64 ビット整数

–263 ~ 263–1

int64

符号なしの 8 ビット整数

0 ~ 28–1

uint8

符号なしの 16 ビット整数

0 ~ 216–1

uint16

符号なしの 32 ビット整数

0 ~ 232–1

uint32

符号なしの 64 ビット整数

0 ~ 264–1

uint64

整数データの作成

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 つの丸め関数、roundfixfloorceil が提供されています。ゼロでない小数部がある場合は、関数 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