えぐち@エスアンドイー です。

>>> On Tue, 9 Feb 1999 21:50:25 +0900, keiju / rational.com (石塚圭樹 ) said:

keiju> けいじゅ@日本ラショナルソフトウェアです.
keiju> 
keiju> In [ruby-dev :4856 ] the message: "[ruby-dev:4856] Re: compare to NaN
keiju> (Re: Re: call for finite/isnan testers) ", on Feb/09 01:48(JST) EGUCHI
keiju> Osamu writes:
keiju> 
keiju> >えぐち@エスアンドイー です。
keiju> 
keiju> >フリーな SOHO と、サラリーマンな SOHO 足すと
keiju> >結構な数になるんぢゃないでしょうか?
keiju> 
keiju> なんですかね(?_?

私は、「こ〜ばのきかい」に入ってるコンピュータ向けの
プログラムを書いているので、年柄年中ホームオフィスで
お仕事と言うわけではないです。
(特許の方じゃなく、塵埃の方の)クリーンルームで御仕事する人です。

keiju> >keiju> 最初は256にしていたんですが, 文字列に変換するのがえらい手間(コストがか
keiju> >keiju> かりそう)だったので10に変えた覚えがあります. 
keiju> >
keiju> >さっき、気の迷いで 1000 にして見ました。
keiju> >で @prov を Array にして [9, 999, 999]
keiju> >っ手感じです。(COBOL じみてますね ^^;;)
keiju> 
keiju> そうそう. べつに固定にする必要もないので変数にしようかなとも思ったんで
keiju> すが, そこまでする必要もないかなと思って(^^;;;

底を変数にするのは面白そうだけど、何やってるか
わからなくなる危険度100%ですね。^^;;;

keiju> >面倒です!
keiju> >精度について、正しい実装が出来るかあやしぃです。
keiju> >仮数部の精度が動くので、正規化もままなりません。
keiju> >固定精度で正規化されていれば
keiju> >
keiju> >def <=> は
keiju> >	符合の比較
keiju> >	  指数部の比較
keiju> >	    仮数部の比較
keiju> >
keiju> >で出来るのですが、仮数部の大きさが可変なので
keiju> >加減算同様の桁合わせが必要で、めちゃめちゃ効率悪いです。
keiju> >あきらめて Array を List 風に使う方法で実装を考えましたが、
keiju> >まるで Lisp なので途中で考えを放棄しました。 ^^;;;
keiju> 
keiju> (^^;;; これって, Cで実装しはじめているって意味ですかね?

いやぁ、いきなり C って事はさすがにないです。 ;-)
IEEE 754 の巧妙なデータパッキングを見た影響でしょう。

Float#<=> は実は、Integer#<=>そのものだと言うあたりの
影響は受けました。

keiju> >keiju> 本来の整数の値はそうだと思いますが....
keiju> >このあたりは数学的な良心が入ってくると
keiju> >先に進みにくくなりますね。;-)
keiju> 
keiju> 無限精度はRealにまかせましょう(^^;;;

どこかで、「ふっきちゃう」必要有りですね。(^^)

keiju> >方向はあっていると思いますが、考えなければいけないことが、
keiju> >多いです。使い勝手もそうなんると問題かも知れません...
keiju> 
keiju> ですね. 色々考えて悩んだ覚えがあります.
keiju> 
keiju> >keiju> ということで新しいBogfloatのモデル案:
keiju> >keiju> 
keiju> >keiju> 結局は前のメイルにあった. 動的に固定精度のBigfloatを生成するモデルです.
keiju> 
keiju> >実装が数段楽になる上に、失う物は殆んどないと思います。
keiju> 
keiju> ですね.
keiju> 
keiju> >いま一歩 Precision の内容を理解していないのですけれども、
keiju> >有効数字が固定なら、他のクラスとの精度比較に動的な性質が
keiju> >なくなるので問題が生じにくくなると想像します。
keiju> 
keiju> >ただ動的なクラス生成は、元からあるクラスの実装の、未知のクラスに対する、
keiju> >配慮の度合を試すような、結構きびしい種類の柔軟性を提供しそうですね。
keiju> 
keiju> うーん. この場合は.
keiju> 
keiju> >いままでに動的なクラス生成ってしてますか?
keiju> >#クラス定義の文字列を生成してエバルの?
keiju> 
keiju> どういうメソッドが必要か完全に調べていないのでわかりませんが, そういう
keiju> 必要はなさそうです:
keiju> 
keiju> テンプレートとなるクラスを1つ定義し. そのサブクラスとして具体的な
keiju> Bigfloatを実現するだけでOKそうです.
keiju> 
keiju> class BigfloatTmp
keiju>   Prec = 256
...
keiju> end
...
keiju> def Bigfloat(prec)
keiju>   bfc = Class.new(BigfloatTmp)
keiju>   constset("Bigfloat_#{prec}", bfc)
keiju>   bfc.constset("Prec", prec)
keiju> end
keiju> 
keiju> 同名の定数はサブクラスでの定義を優先するという性質を利用しています. 

const_set ですね、
こういう用途につかえるだぁ、、
なるほど、四則/正規化/変換などのアルゴリズムは、
テンプレート側に実装するわけですね。

keiju> あ. でも, モジュールにした方がかっこいいかな. その時は,
keiju> 
keiju> module BigfloatTmp
keiju>   Prec = 256
...
keiju> end
...
keiju> def Bigfloat(prec)
keiju>   bfc = Class.new(Numeric) # or 新Float
keiju>   bfc.instance_eval{include BigfloatTmp}
keiju>   constset("Bigfloat_#{prec}", bfc)
keiju>   bfc.constset("Prec", prec)
keiju> end
keiju> 
keiju> という感じですね. 常に関数形式で参照できるように.
keiju> 
keiju> Bigfloat_classes = {}
keiju> def Bigfloat(prec)
keiju>   return Bigfloat_classes[prec] if Bigfloat_classes[prec]
keiju>   bfc = Class.new(Numeric) # or 新Float
keiju>   bfc.include BigfloatTmp
keiju>   bfc.constset("Prec", prec)
keiju>   constset("Bigfloat_#{prec}", bfc)
keiju>   Bigfloat_classes[prec] = bfc
keiju> end
keiju> 
keiju> とするとさらに完璧かも.
keiju> 
keiju> # でも precという言葉は変えた方が良さそうですね.

どちらの方法も未知の < Number なクラスの大量生産になりませんか?

Prec の枠組で、お互いに未知の数クラスの相互変換が
可能であるか今一歩、理解できていないです。
#相互である必要はないかぁ

具体的に問題にしているのは、
別のクラスとして固定小数点数などを *別の人が* 実装した場合です
#BigfloatTmp由来のクラス同士はうまく行くけど。。。

一般性の格付けの一般解があれば良いのですが、、、

	えぐち