From: matz@... (Yukihiro Matsumoto) Date: 2000-07-05T13:51:16+09:00 Subject: [ruby-dev:10214] Re: modulo and remainder まつもと ゆきひろです In message "[ruby-dev:10204] Re: modulo and remainder" on 00/07/04, Tadayoshi Funaba writes: |実は、僕もまつもとさんの意図がよくわからないかもしれないです。僕は、簡 |単に一貫性も互換性も確保できると思っているのですが、まつもとさんは、そ |う思ってないのかなあ。僕の考えが浅はかなのかしら。そもそも、これまでの |問題も、仕様の問題なのか、実装の課題を解決できなかったのか、よくわから |ないままです。 最大の問題は v = x / y w = x % y または v, w = x.divmod(y) としたときに y * v + w = x が成立していなかったことです。 次の問題はFloat/Rational/Integerでdivmodの挙動が異なってい たことです。 どちらを解決するためにも現状の振舞を変更する必要があります。 で、前者を満たす方法はふたつあります。ひとつはfloorで丸める moduloとtruncate(0方向への丸め)で丸めるremainderです。で、後 者を解決するため、すべての数クラスでこの挙動を揃える必要があ ります。 で、今回の変更で私はremaidnerに揃えることを選んだというわけ です。なにか強いポリシーがあってremainderの方を選んだわけで はないのです。私は負の数を含むmodulo/remainderを使ったことは ありませんし、残念なことに実際に変更が行われるまで「どっちで も一緒」という意見しか聞けなかったので、それを疑う余地はなく、 ただ実装がより簡単な方を選んだだけです。 moduloを用意しなかったことは不適切だったと思いますが、modulo という名前のメソッドだけ追加することは難しくありません。 |で、僕が一番困るのが、modulo がまったくなくなってしまうことです。大抵 |の場合、僕が必要なのは、modulo のほうです。単純に、一利用者として困る |のです。Common Lisp なら mod、Scheme なら modulo、Python、Perl、Ruby |では、% で提供されていると認識しています (正しい?)。 正しいと思います。いずれにせよなんらかの形でmoduloを得る方法 は提供します。 |つぎに、% の振舞いが変り、remainder がなくなるのは、互換性を損うので、 |望ましくないと思います。僕もすでに書いたコードを調べなきゃならないです。 |ただ、僕は、remainder のほうをつかった憶えはないです。なので、 |remainder がなくなっても、それはあまり気にしないかもしれないです。 すでに述べた理由によりどこかで振舞が変わるのは不可避だと思い ます。どれが一番望ましいか、あるいは非互換性が問題にならない かという違いはあるでしょうが、残念ながら私には判断できません。 |僕としては、最後の Common Lisp 流 mod、rem メソッドを導入、% を どちら |かの別名とする、が一番ありがたく、その場合は、% が mod (modulo) の別名 |であれば、この上ないです。 了解です。その線を検討します。 |とりあえず、この Common Lisp を基にした仕様で、まつもとさんが、望む一 |貫性なりなんなりが、確保できないものかと思うのですが、数学な人達はどう |思うかしら。 私も知りたいです。というか、いろんな人の意見が聞きたいんです けどねえ。 |でも、Ruby では、整数は floor に応答しません。ここで、Ruby は負けてい |ると思います。いちいち、型を検査すべきなのでしょうか。でも、それはより |一般的なコードを書くことの妨げにしかならないように思います。 | |一利用者としては、すべての数値クラスで、floor、ceil trunc, round がつ |かえて、to_i は trunc の別名ということになれば、すっきりすると思うので |すが。 むむ、たしかに総称的に扱えるようにより高いクラスでfloor, ceil, round, truncate使えるようにした方が良いでしょうね。こ れも考えてみます。 まつもと ゆきひろ /:|}