Julia 言語の丸め関数

Julia 言語の丸め関数についてまとめました。

丸め関数

floor, ceil, trunc, round があります。

trunc(x)

原点 0 へ向かう方向に最も近い整数へと丸めます。

trunc(-1.1) == -1.0
trunc(-0.9) == -0.0
trunc( 0.9) ==  0.0
trunc( 1.1) ==  1.0

trunc

ceil(x)

小数点以下切り上げです。正方向に最も近い整数へと丸めます。

ceil(-1.1) == -1.0
ceil(-0.9) == -0.0
ceil( 0.9) ==  1.0
ceil( 1.1) ==  2.0

ceil

floor(x)

小数点以下切り捨てです。負方向に最も近い整数へと丸めます。

floor(-1.1) == -2.0
floor(-0.9) == -1.0
floor( 0.9) ==  0.0
floor( 1.1) ==  1.0

floor

round(x)

いわゆる四捨五入ですが、デフォルトだと言葉通りの四捨五入にはなりません。次の "RoundingMode について" を参照してください。

floor(-1.1) == -1.0
floor(-0.9) == -1.0
floor( 0.9) ==  1.0
floor( 1.1) ==  1.0

RoundingMode について

round 関数は丸めたい浮動小数点数につづいて RoundingMode を指定することで挙動を変えられます。差異は小さいながら、時に重要なので違いを理解しておくことが重要です。

RoundNearest

round 関数のデフォルトの丸め規則です。半整数 ( ... -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, ...) は 最も近い偶数 へ丸められるという、ちょっとトリッキーな動きです。

※2019/8/4 追記: Banker's rounding というらしいです。統計量の偏りを小さくすることを目的とした工夫みたいです。こちら の記事がわかりやすかった。

round(-1.5) == round(-1.5, RoundNearest) == -2.0
round(-0.5) == round(-0.5, RoundNearest) == -0.0
round( 0.5) == round( 0.5, RoundNearest) ==  0.0
round( 1.5) == round( 1.5, RoundNearest) ==  2.0

RoundingMode:RoundNearest

RoundNearestTiesAway

半整数は原点 0 から離れる方向に丸められます。絶対値を丸めているとも言えます。C/C++ 言語の round 関数と同じ挙動です。

round(-1.5, RoundNearestTiesAway) == -2.0
round(-0.5, RoundNearestTiesAway) == -1.0
round( 0.5, RoundNearestTiesAway) ==  1.0
round( 1.5, RoundNearestTiesAway) ==  2.0

RoundingMode:RoundNearestTiesAway

RoundNearestTiesUp

半整数は正の方向へ切り上げられます。Java/JavaScript 言語の round 関数と同じ挙動です。

round(-1.5, RoundNearestTiesUp) == -1.0
round(-0.5, RoundNearestTiesUp) == -0.0
round( 0.5, RoundNearestTiesUp) ==  1.0
round( 1.5, RoundNearestTiesUp) ==  2.0

RoundingMode:RoundNearestTiesUp

RoundToZero

trunc 関数と同じく原点 0 へ向かって丸めます。trunc(x) == round(x, RoundToZero) となります。

RoundUp

ceil 関数と同じく小数点以下切り上げです。ceil(x) == round(x, RoundUp) となります。

RoundDown

floor 関数と同じく小数点以下切り捨てです。floor(x) == round(x, RoundDown) となります。

RoundFromZero

ドキュメントによると BigFloat 型の数値を丸める場合にのみ使われるようです。よくわかりません。


個人的には、ほぼ整数だとわかっている数の Int 型への変換に RoundNearest を、ランダムな浮動小数点数を丸めたい場合に RoundNearestTiesUp を使っていることが多いような気がします。

# a, b は半整数
c = round(Int, a + b)

# d ∈ [-3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0]
d = round(cos(rand(Float64)*π)*3, RoundNearestTiesUp)

参考