From: Tadayoshi Funaba Date: 2000-07-05T16:23:16+09:00 Subject: [ruby-dev:10221] Re: modulo and remainder ふなばです。 At 2000-07-05T13:51:16+0900 (2451730.70227JD), matz@netlab.co.jp (Yukihiro Matsumoto) wrote: matz> 最大の問題は matz> v = x / y matz> w = x % y matz> または matz> v, w = x.divmod(y) matz> としたときに matz> y * v + w = x matz> が成立していなかったことです。 matz> 次の問題はFloat/Rational/Integerでdivmodの挙動が異なってい matz> たことです。 僕もおかしいとは思っていてましたが、僕の理解は、実装のバグというもので した。そして、仕様としては、modulo のほうを選んでいるのだと思っていま した。どうしてかというと、かなり前に、ruby-list で、% の仕様について話 があって、そのときに、% の振舞いを決め、それを受けて、remainder もこの ときに生まれたからです。問題はこのときの対処が、ずいぶんと不完全なもの だったということですね。 matz> どちらを解決するためにも現状の振舞を変更する必要があります。 matz> で、前者を満たす方法はふたつあります。ひとつはfloorで丸める matz> moduloとtruncate(0方向への丸め)で丸めるremainderです。で、後 matz> 者を解決するため、すべての数クラスでこの挙動を揃える必要があ matz> ります。 なんらかの対処が必要なことは確かで、僕はそれをずっと待ってました。まつ もとさんが、対処しようとしてくれていることは、たいへん、うれしく思って います。 matz> で、今回の変更で私はremaidnerに揃えることを選んだというわけ matz> です。なにか強いポリシーがあってremainderの方を選んだわけで matz> はないのです。私は負の数を含むmodulo/remainderを使ったことは matz> ありませんし、残念なことに実際に変更が行われるまで「どっちで matz> も一緒」という意見しか聞けなかったので、それを疑う余地はなく、 matz> ただ実装がより簡単な方を選んだだけです。 ここで、僕は、ちょっと考えが違うのですが、「揃える」ことは大切なのだと 思いますが、それは、どちらかひとつを選ぶことには、ならないかもしれない と思うのです。modulo と remainder の両方を用意してもいいと思います。基 本的に、今までと同じですね。 揃えるべきは、/ と % の組の振舞いで (もちろん、すべての Numeric な classで)、このふたつの演算の振舞いが、floor-modulo なものか、 truncate-remainder なのかをハッキリさせればよいのではないかと思います (僕は floor/moduloに一票)。なんか違うかな? さらに、divmod (floor-modulo)、divrem (truncate-remainder) とすれば完 璧 (?)。 matz> |僕としては、最後の Common Lisp 流 mod、rem メソッドを導入、% を どちら matz> |かの別名とする、が一番ありがたく、その場合は、% が mod (modulo) の別名 matz> |であれば、この上ないです。 matz> 了解です。その線を検討します。 よろしくお願いしますです。 ああでも、みんなこのことに関心ないみたいだなあ。ちょっとして、オレって、 modulo の熱狂的ファンなのか? ふなば ただよし