Julia/Mathematical Operations and Elementary Functions
一般的な言語にある二項演算は使える
特筆
x ÷ y: 整数除算(余りを捨てる)
x % y(rem)で余りだけもらえる
x \ y: y / xに等しい
何に使うの?
x ⊻ y bitwise xor
REPLでは\xor<TAB>で変換できる
x ⊼ y bitwise nand
x ⊽ y bitwise nor
x >>> y logical right shift
x >> y arithmetic right shift
falseに対する除算は強制的に0に変換する効果を持つ
strong zeroとして振る舞う、と書かれている
ストゼロ
code:jl
julia> Inf * 0
NaN
julia> Inf * false
0.0
julia> NaN * 0
NaN
julia> NaN * false
0.0
破壊的バージョンもある
+= -= *= /= \= ÷= %= ^= &= |= ⊻= >>>= >>= <<=
code:jl
julia> x = 42
42
julia> x ⊻= 1
43
julia> x ⊻= 1
42
暗号系の処理実装するのに便利そう
二項演算をベクトル化したバージョンがほぼ全ての二項演算に対して用意されている
.をprefixした形をとる e.g. .* .^
code:jl
3-element Vector{Int64}:
2
4
6
連鎖させてもシングルループで動作する
等長のベクトル同士でも動く
code:jl
5-element Vector{Float64}:
1.0
1.0
1.0
1.0
1.0
xs .* 2は(*).(xs, 2)に等しい
比較演算は一般的なものが使える
一般に、NaN同士の比較はfalseである
これだと多少困ることがある
タプルや構造体同士の比較のとき
code:jl
julia> (true, "ok", NaN) == (true, "ok", NaN)
false
isequalはNaN同士をtrueとして比較する
code:jl
julia> isequal((true, "ok", NaN), (true, "ok", NaN))
true
isfinite, isnan, isinfがある
また、isequalは0.0と-0.0とをfalseとして比較する
比較はいくらでもチェインさせることができる
code:jl
julia> x = 666
666
julia> 0 < x <= 1000
true
便利!!
精度が落ちるような変換はエラーになる
roundを使うとよい
code:jl
julia> x = 42.195
42.195
julia> Int32(x)
ERROR: InexactError: Int32(42.195)
Stacktrace:
@ Base ./float.jl:973
julia> round(Int32, x)
42
トリッキーだが、256 % UInt8みたいな書き方もできる
剰余をとるかたちになる
ほか、一般的な丸め関数がある
特筆
mod2pi
code:jl
julia> mod2pi(2π + 1)
0.9999999999999998