From: Tadayoshi Funaba Date: 2000-07-04T23:11:04+09:00 Subject: [ruby-dev:10204] Re: modulo and remainder ふなばです。 At 2000-07-04T14:05:17+0900 (2451729.712JD), matz@netlab.co.jp (Yukihiro Matsumoto) wrote: matz> ruby-talkの話ですが、ruby-devにふります。 matz> ruby-mathな話かもしれませんが、ふなばさんは参加しておられな matz> いので。 どうも。数学も英語も苦手な僕としては、ありがたいことです。 matz> うーむ、moduloが必要だという点については理解しました。 matz> ふなばさんとしては「moduloがあれば良い」という立場なのでしょ matz> うか? それともPython流divmodでないと良くないという立場なの matz> でしょうか? (中略) matz> ruby-talkにも書きましたが、ありえる選択肢としては matz> * Python流 matz> * 現状(+modulo) matz> くらいを考えてます。でも、CL流のmod,remメソッドを導入(%はそ matz> のどちらかへのalias)というのもありえると思います。 実は、僕もまつもとさんの意図がよくわからないかもしれないです。僕は、簡 単に一貫性も互換性も確保できると思っているのですが、まつもとさんは、そ う思ってないのかなあ。僕の考えが浅はかなのかしら。そもそも、これまでの 問題も、仕様の問題なのか、実装の課題を解決できなかったのか、よくわから ないままです。 僕は数学が得意なわけではないし、「正しい」ことをしようとしているわけで ないと思います。 で、僕が一番困るのが、modulo がまったくなくなってしまうことです。大抵 の場合、僕が必要なのは、modulo のほうです。単純に、一利用者として困る のです。Common Lisp なら mod、Scheme なら modulo、Python、Perl、Ruby では、% で提供されていると認識しています (正しい?)。 つぎに、% の振舞いが変り、remainder がなくなるのは、互換性を損うので、 望ましくないと思います。僕もすでに書いたコードを調べなきゃならないです。 ただ、僕は、remainder のほうをつかった憶えはないです。なので、 remainder がなくなっても、それはあまり気にしないかもしれないです。 僕としては、最後の Common Lisp 流 mod、rem メソッドを導入、% を どちら かの別名とする、が一番ありがたく、その場合は、% が mod (modulo) の別名 であれば、この上ないです。 Common Lisp の floor は、オプショナルな引数をとることができ、多値を返 します。Python の divmod は、つぎのようなものではないかと思います。 (defun divmod (x y) (multiple-value-list (floor x y))) で、Ruby もこれでいいと思います。そうでなければならないわけではない、 のかもしれませんが、僕にとっては、望ましいです。 また、floor の代りに、truncate をつかうと、divrem (?) もできそうですが、 これもあっていいと思います。 (defun divrem (x y) (multiple-value-list (truncate x y))) Ruby の floor、to_i (trunc)、modulo、remainder は、つぎのように考えら れるかもしれません。 (defun ruby-floor (x) ;; #floor (car (multiple-value-list (floor x)))) (defun ruby-trunc (x) ;; #to_i (#trunc) (car (multiple-value-list (truncate x)))) (defun ruby-modulo (x y) ;; #modulo (cadr (multiple-value-list (floor x y)))) (defun ruby-remainder (x y) ;; #remainder (cadr (multiple-value-list (truncate x y)))) 別段 quotient があってはよくない、という考えはないです。 とりあえず、この Common Lisp を基にした仕様で、まつもとさんが、望む一 貫性なりなんなりが、確保できないものかと思うのですが、数学な人達はどう 思うかしら。 ところで、Common Lisp の floor 関数は、浮動小数点数も整数も受けつけま すよね。Scheme も Python でも同じです。 でも、Ruby では、整数は floor に応答しません。ここで、Ruby は負けてい ると思います。いちいち、型を検査すべきなのでしょうか。でも、それはより 一般的なコードを書くことの妨げにしかならないように思います。 一利用者としては、すべての数値クラスで、floor、ceil trunc, round がつ かえて、to_i は trunc の別名ということになれば、すっきりすると思うので すが。 ふなば ただよし