けいじゅ@日本ラショナルソフトウェアです.

In [ruby-math :00607 ] the message: "[ruby-math:00607] Re: int / int -
> ? ", on Aug/26 07:55(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>「無理がある」とは思っていません。が、違う部分があるのは事実
>でしょうね。

うーん. 最後の例を見てください。

>私は、CやFORTRANのモデルに慣れた人ですから、逆に変わってもらうととまど
>うわけで、個人的にはここで満足したいです。

うーん. うーん.

>David Alan BlackのBehaviorとかを使ってくくってもらいたいくらい。# あ、
>それは良いアイディアかも。RAAのbehaviorを見てみてください。

これって、[ruby-dev:14003]で出したやつ(の一般化したもの)でしょう? ただし、
thread safeでない && 振る舞いを変える度に文字列をevalしている ので、
[ruby-dev:14003]のアイディア(の実装したもの)のほうが、まだよいと思います
が?

>|固定であれば, その世界で幾ら変でもそう定義すればそれが仕様になって終わり
>|になるわけですが、Rubyの場合は拡張ができるので、標準セットの中だけで定義
>|できていても、拡張していくうちに破錠するようでは困るかなと。
>|
>|coerceとかはいくら使いにくいといっても、必要なことはどうにか実現可能です
>|が、今回のは互換性を維持しつつ実現するのは実質不可能なんですよね...
>
>おっしゃることが良く分かりません。「望む仕様がある(この場合
>は int/int -> ratinal)」が、それは「互換性を維持しつつ実現す
>るのは実質不可能である」、ということまでは同意しますが、だか
>らどうしろと?

そういう意味ではありません。数値クラスの拡張の機能があるのはよいけど、う
まく拡張できるとは限らない。ってことです.

例えば、Matrixは数値クラスを拡張しているわけですが、Matrix#detのようにあ
るべき仕様を実現できないようなことを言っています。

>まず第一に「私はRationalを実装しません」。これは確実です。私
>はRationalについて十分に理解してませんし、バグなしに作る自信
>も十分なパフォーマンスを出す自信もありません。Bignumでこりま
>した。

Rationalの実装はBignumのように難しくないです。rational.rbでやっているこ
とをCに移しかえるだけですから。つまり、分子と分母の組で実現し、実質的な
計算はIntegerの方に委譲するわけですね。ただし, パフォーマンスを考えると
gcdはこのままのアルゴリズムではまずいでしょうが。

>第二に「だれか他の人にやってもらうのには不安があります」。つ
>まり、将来のRationalはcoerceやPrecisionを含めてRubyの他の部
>分全体との整合性をとって実現されるべき、かなり難しい問題です。
>それができる人がいるのかどうか相当不安です。

そうです? その辺りはまったく心配する必要はないと思います. 本質的なアルゴ
リズムは、CであろうがRubyで書かれていようが変りませんので。

>そういえば、Precisionって使われてるのかなあ。

これって、拡張した(精度を持つ)数値クラスのみで意味がありますからね. そう
いえば、Rationalは対応していないな... あとで、対応しておこうっと。

>第三に、int/int -> rationalにすることによるモデルの変化の心
>理的影響は無視できないと思ってます。つまり、今まで一応はCや
>FORTRANのような「伝統的計算機言語の数値モデル」に従ってきた
>のですが、それから離れることになるわけですよね。たとえば私は
>old type(+数学苦手)なのでこのモデルには不安を感じます。

うーん. どうせ, 一般の処理では割り算なんかめったにしないんだからそんなに
気にしなくていいんじゃないの? 一般の処理では整除はするかも知れませんが? 
でも, それも//を導入すればよいわけだし。

それに、数値処理をしたい場合は今のままでは危険がいっぱいです。

たとえば、以下のメソッド:

  def mean(*numary)
    sum = 0
    for n in numary
      sum += n
    end
    sum / numary.size
  end

でさえもまともに(思った通りに)動作しない。こういう状況はかなりまずい状況
と思いますが?

>> mean(1,2)
=> 1
>> mean(1.0,2.0)
=> 1.5
>> require "mathn"
>> mean(1,2)
=> Rational(3, 2)

上記の例であれば、Cは型があって明確になっていますので(int sumとか
double sumとかで振る舞いが決定される)、Cの場合は思った通りに動作している
と言えますが、というかそういう風に型を固定した関数を書くしかないのですが。

Rubyでは、変数に型がないので、やはり思った通りに動作していないと言ってよ
いでしょ? 

__
..............................石塚 圭樹@日本ラショナルソフトウェア...
----------------------------------->> e-mail: keiju / rational.com <<---