Julia入門 数字・文字列の組み込み型について

Juliaの組み込み型について。
http://nullbyte.hatenablog.com/entry/2015/05/30/001107:title:前回からの流れで辞書型について調べようか思ったけど、型の話を先にちょっと押さえておいたほうがいいかなと。

数字の型

以下のような型が用意されている。

意味
Bool 真偽値
Int8 8bitの符号あり整数
Uint8 8bitの符号なし整数
Int16 16bitの符号あり整数
Uint16 16bitの符号なし整数
Int32 32bitの符号あり整数
Uint32 32bitの符号なし整数
Int64 64bitの符号あり整数
Uint64 64bitの符号なし整数
Int128 128bitの符号あり整数
Uint128 128bitの符号なし整数
Float16 16bitの浮動小数点型
Float32 32bitの浮動小数点型
Float64 64bitの浮動小数点型
Complex64 64bitの複素数
Complex128 128bitの複素数

整数を宣言した場合、64bit環境ではデフォルトInt64の整数になる。
小数点付きの数字はFloat64になる。
複素数グローバル変数のimに入っていて、デフォルトではComplex64になる。

julia> typeof(256)
Int64

julia> typeof(1.234)
Float64

julia> typeof(2 * im + 1)
Complex{Int64} (constructor with 1 method)

デフォルト以外の型の数字が欲しい時には、各型を小文字にした関数がコンストラクタとして用意されているので、それを使って生成する必要がある。

julia> c = int128(2) ^ 127 - 1
170141183460469231731687303715884105727

julia> typeof(c)
Int128

ちなみに、128bitで収まらないような巨大な数字を計算したい場合は(RSA暗号とか?)、BigInt / BigFloatという型が使える。
(詳しくは公式ドキュメントを参照のこと)

julia> intval = typemax(Int128)     # typemax: 指定した型の最大値を返す
170141183460469231731687303715884105727

julia> intval + 1      # 桁あふれしてしまう
-170141183460469231731687303715884105728

julia> bigintval = BigInt(intval)
170141183460469231731687303715884105727

julia> bigintval + 1     # OK
170141183460469231731687303715884105728

上記の例のように、Juliaでは型の上限値を超えた値はを代入すると桁あふれする。
必要な型をあらかじめ考えておくこと。

数字に関する組み込み関数は公式ドキュメント(数学計算数字関係)を参照。

文字列

ASCII文字列のASCIIString型、UTF8文字列のUTF8String型がある。

julia> ascii_str = "abc"
"abc"

julia> typeof(ascii_str)
ASCIIString (constructor with 2 methods)

julia> utf8_str = "文字列"
"文字列"

julia> typeof(utf8_str)
UTF8String (constructor with 2 methods)

ちなみに、ASCIIString型とUTF8String型でも、結合などはそのまま行うことができる。

julia> ascii_str * utf8_str      # 結合
"abc日本語"

また、一文字を表すChar型もあり、リテラルではシングルコーテーションで宣言する。

julia> ch = 'c'
'c'

julia> typeof(ch)
Char

julia> not_ch = "c"
"c"

julia> typeof(not_ch)    # ダブルコーテーションで宣言すると、Stringになる
ASCIIString (constructor with 2 methods)

julia> string(ch, "har")    # CharとStringは*では結合できないので、string関数を使う
"char"

julia> ch * "har"
ERROR: `*` has no method matching *(::Char, ::ASCIIString)

julia> "some_string"[4]    # Stringから添え字アクセスした時の返り値の文字列もCharになる
'e'

julia> typeof("some_string"[4])
Char

そのほか、文字列型用の関数の一覧は公式ドキュメントを参照のこと。