データ型
数値型
整数型
識別子 | 幅 | 最小値 | 最大値 | 指数表記 |
---|---|---|---|---|
INT8 | 8bit | -128 | 127 | |
INT16 | 16bit | -32768 | 32767 | |
INT32 | 32bit | -2147483648 | 2147483647 | \(\pm 2.15\times 10^{9}\) |
INT64 | 64bit | -9223372036854775808 | 9223372036854775807 | \(\pm 9.22\times 10^{18}\) |
INT128 | 128bit | -170141183460469231731687303715884105728 | 170141183460469231731687303715884105727 | \(\pm 1.70\times 10^{38}\) |
UINT8 | 8bit | 0 | 255 | |
UINT16 | 16bit | 0 | 65535 | |
UINT32 | 32bit | 0 | 4294967295 | \(4.29\times 10^{9}\) |
UINT64 | 64bit | 0 | 18446744073709551615 | \(1.84\times 10^{19}\) |
UINT128 | 128bit | 0 | 340282366920938463463374607431768211455 | \(3.40\times 10^{38}\) |
浮動小数点型
識別子 | 指数 | 仮数 | 最大値/最小値 | \(2\epsilon\) |
---|---|---|---|---|
FLOAT16 | 5bit | 10bit | ±6.55e4 | 6.0e-8 |
FLOAT32 | 8bit | 23bit | ±3.4028235e38 | 1.4e-45 |
FLOAT64 | 11bit | 52bit | ±1.7976931348623157e308 | 4.9e-324 |
一般的なプログラミング言語の浮動小数点数は IEEE 754 形式で表される。機械イプシロン \(2\epsilon\) とは 1 より大きい最小の数と1との差である。
言語ごとの数値型
Java
型 | 意味 | ラッパー |
---|---|---|
byte |
8bit符号付き整数 | Byte |
short |
16bit符号付き整数 | Short |
int |
32bit符号付き整数 | Integer |
long |
64bit符号付き整数 | Long |
float |
32bit浮動小数点 | Float |
double |
64bit浮動小数点 | Double |
これらはプリミティブ型 (primitive type) と呼ばれ C/C++ での同じサイズの型と同じ。機能 (メソッド) はラッパークラスに用意されている。符号なし整数は用意されていない。
Scala
型 | 意味 |
---|---|
Byte |
8bit符号付き整数 |
Short |
16bit符号付き整数 |
Int |
32bit符号付き整数 |
Long |
64bit符号付き整数 |
Float |
32bit浮動小数点 |
Double |
64bit浮動小数点 |
Java と同様だが糖衣構文によりラッパークラス (scala.runtime.RichXxx
) のメソッドを使用できる。
Julia
Int8 |
8bit符号付き整数 |
Int16 |
16bit符号付き整数 |
Int32 |
32bit符号付き整数 |
Int64 |
64bit符号付き整数 |
Int128 |
128bit符号付き整数 |
UInt8 |
8bit符号無し整数 |
UInt16 |
16bit符号無し整数 |
UInt32 |
32bit符号無し整数 |
UInt64 |
64bit符号無し整数 |
UInt128 |
128bit符号無し整数 |
Float16 |
16bit浮動小数点 |
Float32 |
32bit浮動小数点 |
Float64 |
64bit浮動小数点 |
符号付き、符号なしの整数と浮動小数点を扱える。科学計算や数値解析で大量の実数を扱うために半精度浮動小数点が含まれている (GPU によっては Float32
より高速な演算が可能)。
多倍長整数
Java
jshell> import java.math.BigInteger
jshell> i = BigInteger.ONE
jshell> for(int j=0; j<1000; j++){
i = i.multiply(BigInteger.TWO);
}
jshell> i
i ==> 10715086071862673209...
jshell> i.doubleValue()
$89 ==> 1.0715086071862673E301
任意精度整数の演算は BigInteger
を使用する。
Scala
scala> var i = BigInt(1)
scala> for(j <- 0 until 1000) i *= 2
scala> i
res33: scala.math.BigInt = 10715086071862673209...
scala> i.toDouble
res34: Double = 1.0715086071862673E301
任意精度整数の演算は BigInt
を使用する。
Julia
julia> i = BigInt(1)
julia> for j in 1:1000 i *= 2 end
julia> i
10715086071862673209...
julia> Float64(i)
1.0715086071862673e301
BigInt
を使用する。
多倍長固定小数点数
10 進数演算を正確に行うための数値型。桁数が多く丸めの方法が規定されている財務・金融計算が主な用途。
Java
jshell> import java.math.BigDecimal
jshell> import java.math.RoundingMode
jshell> BigDecimal.TEN.divide(new BigDecimal(6), 3, RoundingMode.HALF_EVEN)
$101 ==> 1.667
BigDecimal
を使用する。
Julia
多倍長固定小数点に相当するクラスはない。
Scala
scala> (BigDecimal(10) / BigDecimal(6)).setScale(4, BigDecimal.RoundingMode.HALF_UP)
res37: scala.math.BigDecimal = 1.6667
BigDecimal
を使用する。Java と異なり標準的な演算子オーバーロードが利用できる。
多倍長浮動小数点数
浮動小数点数の指数部、仮数部に任意の桁数を指定できる数値型。FPU の支援は期待できないが 64bit 浮動小数点型で精度が足りない場合に利用することができる。
Julia
julia> x = BigFloat(100, 2, RoundNearest)
9.6e+01
julia> x.exp, x.prec, x.sign
(7, 2, 1)
julia> BigFloat(10) / 6
1.6666666666...
julia> for e in 2:10
println("$e: $(BigFloat(100, e, RoundNearest))")
end
2: 9.6e+01
3: 9.6e+01
4: 9.6e+01
5: 1.00e+02
6: 1.00e+02
7: 1.000e+02
8: 1.000e+02
9: 1.000e+02
10: 1.0000e+02
BigFloat
は指数部と仮数部、符号ビットに分かれており任意精度の浮動小数点を表すことができる。GNU GMP, MPFR ライブラリを利用している。
precision
には仮数部のビット数を指定する。上記の実行例を見れば 100 (2進数で \(0.1100100\times 2^7\)) は仮数部で最低 11001 (5bit) が表現できなければ正確に表すことができないことが分かる。