数値データ型
Juliaの数値データ型は、整数型と浮動小数点数型に分かれる。
整数型は符号付き、符号なしに、それぞれ1,2,4,8,16バイト長が用意されている。名前はU?Int(8|16|32|64|128)
で、2x5=10通りある。直交性が美しい。
byte型はなくて、代わりにUInt8を用いる。真偽値を表すBool
型もある。実態は8ビット整数のようだ。
浮動小数点数は、Float(16|32|64)
の3つが用意されている。
デフォルトとなる型は、システムによって変わる。64bitシステムでは、
julia> typeof(1)
Int64
julia> typeof(1.0)
Float64
となるが、32ビットシステムではそれぞれInt32, Float32になるそうだ。いまどきなかなか周りにないので確認のしようがないが。
BigInt, BigFloat
数学者向けのシステムらしく、無限精度の整数、浮動小数点数もデフォルトで用意されている。これは、GNU のGMP, GPFRライブラリを内部で使っているそうだ。十分長い整数リテラルを書くと自然にBigInt
になる。シームレスで素晴らしい。
julia> typeof(11111111111111111111111111111111111111111111)
BigInt
一方BigFloat
のほうは明示的に作らないとできないようだ。しかも浮動小数点リテラルから作ろうとすると、リテラルの時点でFloat64
に丸められてしまうの意味がない。なので、parseを使って作るのが正解らしい。
julia> typeof(0.123456789123456789123456789123456789)
Float64
julia> a = BigFloat(0.123456789123456789123456789123456789)
0.1234567891234567837965840908509562723338603973388671875
julia> a = parse(BigFloat, "0.123456789123456789123456789123456789")
0.1234567891234567891234567891234567890000000000000000000000000000000000000000004
基本的な演算子はすべてBigIntをサポートしているようなので、ほとんど意識せずに利用できる。
julia> BigInt(111111111) ^ 5
16935087723754847838236041084523023336551
演算子
演算子は、割に普通だが、その1に書いたように÷
演算子があったりする。ビット演算のxorは^
で表現する言語が多い(C, Java, Pythonなど)のだが、Juliaではべき乗に使ってしまっているので、⊻
というなんと読んだらいいのかわからない記号を導入している。これはREPLでは\xor + tab
で出る。
julia> 0x01 ⊻ 0x02
0x03
CやJavaにあるインクリメント、デクリメント演算子++
,--
は無い。+=
や-=
はある。全ての2項演算子に用意されている。
julia> a = 1
1
julia> a += 1
2
演算子と関数
Juliaの演算子は基本的に関数で、関数としても利用できる。
julia> +(1, 2)
3
このとき+
と(
の間にスペースが入るとパースに失敗するので要注意。
ユーザ定義演算子
Juliaではユーザが演算子を定義できる。といっても演算子として使える記号の種類や、そのパース時の優先順位は決まっている。ドキュメントを探しても見つからないのだけど、
ここのソースで定義されているようだ。schemeでパースしているのか??びっくりだ。
演算子を定義する方法は関数の定義と同じ。演算子は関数だから当然だ。∙
という演算子で2つ組のタプルを返すようにしてみよう。
julia> ∙(x, y) = x, y
∙ (generic function with 1 method)
julia> 1 ∙ 2
(1, 2)
ソースを見ると、本当にさまざまな記号が演算子として使えるようだ。ただこれらの記号には相互に見分けのつかないものも多いし、そもそもどう打ったらいいのかわからない。下手に多用すると、誰にも読めないメンテ不能のソースが爆誕しそうで恐ろしい。