Edited at

SwiftにFloat系の余り演算メソッドが2つある理由

More than 1 year has passed since last update.

前回、SwiftのFloat系の余りの%演算子が廃止になり、その代わりに2つのメソッドを使うようになったという記事を書きました。

Float系の演算で余り演算子(%)が廃止、それに変わるメソッドはだるま落としと最寄駅

しかし、整数の方は引き続き%演算子があり、2つのメソッドも使えないのでそれがなぜかという疑問を書いたところ、以下のメール(?)の紹介を受けました(Dさん、ありがとうございました)。

https://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20160411/014983.html


メールに書いてある内容

たとえば10.0を0.1で割ったときの余りを考えます。

FloatGaiyou.png

数式の上では余りは0ですが、2進数では0.1が正確に表現できないため、これは0.1より少し大きい値になります。

Float_0_1_Kakudai.png

そのズレが蓄積して10.0のところもズレてしまいます。

10_0Kakudai.png

ここから普通に余り(10.0と同じまたは低いところまでの距離)を求めると下の図のような9.9に近いポイントとの距離が余りになってしまいます。

9_9_and_Amari.png

この現象を避ける(被害を軽減する)ために、最寄り駅方式のメソッドがあるそうです。

Float_Moyorieki.png