floor とは、切り捨てる関数ですが、
Swiftに限らず、大抵のコンパイル言語には、 整数型のfloor関数は有りません。
なぜなら、普通に、整数型の除算が『切り捨て』だからです。
ところが、負数だと、演算結果が異なる!
-10から+10までの整数を3で割ってみると、下表の値になります。
同じ値を浮動小数点にしてfloor関数した結果を併記します。
網掛けしたところの演算結果に差が出ています。整数型を単純に除算すると、0の方向に切り捨てられるためです。でも、Pythonの//
演算子のようにfloorした結果が欲しい。
そこで、整数型のfloor演算子を定義します。
floor演算子
Pythonに合わせて//
演算子としたいところですが、コメント
になってしまうため、|/|
としてみました。
infix operator |/| : MultiplicationPrecedence // floor
func |/|(lhs: Int, rhs: Int) -> Int {
return (lhs - ((lhs % rhs + rhs) % rhs)) / rhs
}
より汎用的にするならば、Int
をBinaryInteger
にするのがよいかも。
使い方は、/
のところを|/|
とするだけ。
floor演算子
let a10 = -10 |/| 3 //-4
let a9 = -9 |/| 3 //-3
let a8 = -8 |/| 3 //-3
floor関数
|/|
を忘れそうなので、整数型のfloor関数も用意しておきます。
func floor(_ lhs: Int, _ rhs: Int) -> Int { lhs |/| rhs }
floor関数
let a10 = floor(-10, 3) //-4
let a9 = floor( -9, 3) //-3
let a8 = floor( -8, 3) //-3
これで安心して除算できます。
以上