小林です。

----- Original Message -----
送信者 : GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp>
件名 : Precision

> ごとけんです
詳細な説明、本当にありがとうございます。

>
>   num.prec(Klass)
>
> のように呼び出すと、
>
>   Klass.induced_from(num)
>
> を呼び出すことになります。Precisionの仕様は以上です。
>
なるほど。なんとなくわかりました。
coerceのSingle版のような感じですね。

>
> しかし、小林さんのBigFloatはnewが2引数であるためこのままでは
> 使えないので議論が必要な気がします。案としては、
....(snip)....
>
BigFloat::new()が2引数である必然性は、現時点ではありません。
BigFloatというより vps.c を書いていた時に、問題となったのが
 c = a op b  # 例えば c = 1.0/3.0
という演算をするときに、a op b は何処まで計算すれば良いか?
で、答えは「c の最大精度まで計算する」という案を採用しました。
しかし、Rubyで通常通りの演算では c は、op 処理をする段階では
まだ存在しないわけですよね。
従って、
  BigFloat::div(c,a,b) # c = a/b
 何ぞというメソッドを追加しない限り、今は意味がありません。
(「ひょっとして、後で使うかな?」程度で、このようになっています)
後、第2引数が文字列なのも、たださぼっているだけです。

>
> 当時の議論で合意したことのひとつにNumericはnewを持つべきでな
> いという話があります。
これは私にはよくわかりません。ただ、いずれにせよ実態を作成しなけ
れば先に進まないので「どのように作成するか?」という方法論が納得
できれば良いことのように思います。

で、以下の説明とnewのどちらが良いかは、私には難しいです。
>
> このパラメーター付クラスとは、Klassという名前のクラスに対し
> てKlass(param)という関数が定義されていて、そのこれはパラメー
> タparamであるようなクラスKlassをを返すモノです。たとえば、
>
>   BigFloat(30)
>
> は幅が30に固定されたBigFloatをあらわすといった具合です。この
> 場合、newの代わりに[]が定義されていたらば、
>
>   BigFloat(30)[1]
>
> で整数1を幅30の浮動小数点数であらわしたBigFloatオブジェクト
> を返すことになります。また、このBigFloat()が定義されていれば、
> これは
>
>   1.prec(BigFloat(30))
>
> と書くこともできます。もちろん、そのためには、各nについて
>
>   BigFloat(n).induced_from
>
> が定義されている必要があります。
>
整数はきっちり変換できるので BigFloat[1] や 1.prec(BigFloat) で充分です。
ただ、3.14.prec(BigFloat(30))なんてのはあり得ますね。
あと、実数からの変換は誤差を伴うので、文字列からの変換も必要と思い
ます(文字列からなら誤差無しで変換できます)。

えぐちさんからもInfinityやNaN等に関するアドバイスをいただきました。
んーっ、考えることはまだまだ山ほどありますね。

とりあえず、BigFloatの公開に辿り着いたので、後これをどのように
料理するか、今後もいろいろとアドバイスしていただければありがた
いです。

それでは

小林 茂雄
E-Mail: shigeo / tinyforest.gr.jp
WWW: http://www.tinyforest.gr.jp