From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1999-02-19T19:36:02+09:00 Subject: [ruby-dev:5346] Re: Bigfloat [compare to NaN] けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :5282 ] the message: "[ruby-dev:5282] Re: Bigfloat [compare to NaN] ", on Feb/18 20:24(JST) GOTO Kentaro writes: >ごとけんです >いやぁ,それに関して言わせてもらうと僕は,Integer(1.3) >みたいなインターフェイスがそもそも拡張性に乏しすぎると >思うのです. うーん. 普段は単純でいいんですからね... >> x = Anumber(56).new(10) >> y = Anumber(56).new(10) >> >>とすると, x, yが別のクラスになっているのが気持ち悪いですね. やはり, 生 >>成したクラスはどっかに保持していて, 同じ精度のクラスを調べたら同じクラ >>スを返した方が良いと思います. > >気持悪いという指摘は理解できます.ただ,それが気持以上に >悪いことなのかどうかは僕にはまだわかりません. 数って普通インスタンス数が多いものですから. インスタンスの数だけクラス ができるのはどうも... >もし悪いならば,生成したクラスを登録しておいて新たな生成を >抑制することも出来ると思います. ですね. >>1. クラス生成の方法(クラスを生成するとして) >>2. 変換関数はどうするか? > >1. に関しては,既存クラスに関してはしかたないと >思いますが,今後は採用すべく検討しても良いと思います. > >>Bigfloat(10) ってやった時にクラスを作られると何か間違えないかなあ...っ >>て点です. > >うーん,確かに最初は混乱しやすそうだというのは認めますが, >この手のインターフェイスを否定する理由としてはちょっと弱いと >思います.いままでその手の変換関数は Integer と Float と >Array と String の4つしかなかったわけで. RationalもComplexもありますよ. Matrixはちょっと違いますがあります. RationalとComplexは2引数をとりますが, 自然な拡張になっています. 既にある枠組を否定するからにはそれなりの理由が必要だと思いますよ. >2. に関しては induced_from または new を使いましょう >というのが僕の今の考えです. >> Bigfloat(10)(100) => 10.00000000 >>とかは, とても書けないし... > >Bigfloat(10).new(100) ではいけませんか?? そうですねえ... なぜ, クラスを作るのに楽したくて, インスタンスを作るの に苦労したいのか分かりません. ># ちょっと Bigfloat(10)(100) の意図がわかりませんでしたが. C風に書けば (*Bigfloat(10))(100) のつもりでした. Bigfloat(10)で関数(のポインタ)をかえして, それに100を 適用すると. # Rubyではできませんけどね. >そうかなぁ,パラメトライズされたクラスを関数で生成する案なら, >クラスが毎回生成されるのが悪いかどうかの判断をまず検討して, >悪ければ同じ引数が2度以上与えられたときに新しくクラスを >生成するのを抑制すればいいし,悪くなければそのままバンバン >作っていいし,どちらにせよ型変換は new か induced_from で >出来るのですが…ひょっとして new とか induced_from という >名前が煩わしいと思われるのですか?? そうですね. 型変換でなくてインスタンス生成のインターフェイスになってい るからですけどね. Rational(1,2) Complex(1,1) Matrix[[1,2], [2,4]] などなどとできているのに, Bigfloatだけがなぜ? って感じですか. これらの インスタンスって, リテラルで表現できないので, 簡単にインスタンスが生成 できるインターフェイスを用意するのは重要かと思うんです. インスタンスの生成のインターフェイスは今までと同じようにしたいので, Bigfloat(val, prec=defalt_prec) で, precサイズのオブジェクトの生成. この時に必要であれば, クラスを生成 する. とし, クラス参照を別に用意しませんか? といっても, 名前が悩むんですが... Bigfloat::class(prec) Bigfloat.class(prec) Bigfloat_class(prec) BIGFLOAT(prec) Bigfloat[prec] うーん... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---