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
ceil(x)
小数点以下切り上げです。正方向に最も近い整数へと丸めます。
ceil(-1.1) == -1.0 ceil(-0.9) == -0.0 ceil( 0.9) == 1.0 ceil( 1.1) == 2.0
floor(x)
小数点以下切り捨てです。負方向に最も近い整数へと丸めます。
floor(-1.1) == -2.0 floor(-0.9) == -1.0 floor( 0.9) == 0.0 floor( 1.1) == 1.0
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
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
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
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)