0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SwiftAdvent Calendar 2023

Day 25

[Swift] 整数型のfloor演算子

Last updated at Posted at 2023-12-25

floor とは、切り捨てる関数ですが、

Swiftに限らず、大抵のコンパイル言語には、 整数型のfloor関数は有りません。
なぜなら、普通に、整数型の除算が『切り捨て』だからです。

ところが、負数だと、演算結果が異なる!

-10から+10までの整数を3で割ってみると、下表の値になります。
同じ値を浮動小数点にしてfloor関数した結果を併記します。

floor.png

網掛けしたところの演算結果に差が出ています。整数型を単純に除算すると、0の方向に切り捨てられるためです。でも、Pythonの//演算子のようにfloorした結果が欲しい。

そこで、整数型のfloor演算子を定義します。

floor演算子

Pythonに合わせて//演算子としたいところですが、コメントになってしまうため、|/|としてみました。

infix operator |/| : MultiplicationPrecedence // floor
func |/|(lhs: Int, rhs: Int) -> Int {
    return (lhs - ((lhs % rhs + rhs) % rhs)) / rhs
}

より汎用的にするならば、IntBinaryIntegerにするのがよいかも。

使い方は、/のところを|/|とするだけ。

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

これで安心して除算できます。

以上

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?