データ型

Takami Torao Java 9 Scala 2.12 Julia 0.6 #java #scala #julialang
  • このエントリーをはてなブックマークに追加

数値型

整数型

識別子 最小値 最大値 指数表記
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) が表現できなければ正確に表すことができないことが分かる。

Java, Scala

多倍長浮動小数点数に相当するクラスはない。ApfloatJScience などの外部ライブラリを使用する。