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

In [ruby-dev :4856 ] the message: "[ruby-dev:4856] Re: compare to NaN
(Re: Re: call for finite/isnan testers) ", on Feb/09 01:48(JST) EGUCHI
Osamu writes:

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

>フリーな SOHO と、サラリーマンな SOHO 足すと
>結構な数になるんぢゃないでしょうか?

なんですかね(?_?

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

そうそう. べつに固定にする必要もないので変数にしようかなとも思ったんで
すが, そこまでする必要もないかなと思って(^^;;;

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

(^^;;; これって, Cで実装しはじめているって意味ですかね?

>keiju> 本来の整数の値はそうだと思いますが....
>このあたりは数学的な良心が入ってくると
>先に進みにくくなりますね。;-)

無限精度はRealにまかせましょう(^^;;;

>方向はあっていると思いますが、考えなければいけないことが、
>多いです。使い勝手もそうなんると問題かも知れません...

ですね. 色々考えて悩んだ覚えがあります.

>keiju> ということで新しいBogfloatのモデル案:
>keiju> 
>keiju> 結局は前のメイルにあった. 動的に固定精度のBigfloatを生成するモデルです.

>実装が数段楽になる上に、失う物は殆んどないと思います。

ですね.

>いま一歩 Precision の内容を理解していないのですけれども、
>有効数字が固定なら、他のクラスとの精度比較に動的な性質が
>なくなるので問題が生じにくくなると想像します。

>ただ動的なクラス生成は、元からあるクラスの実装の、未知のクラスに対する、
>配慮の度合を試すような、結構きびしい種類の柔軟性を提供しそうですね。

うーん. この場合は.

>いままでに動的なクラス生成ってしてますか?
>#クラス定義の文字列を生成してエバルの?

どういうメソッドが必要か完全に調べていないのでわかりませんが, そういう
必要はなさそうです:

テンプレートとなるクラスを1つ定義し. そのサブクラスとして具体的な
Bigfloatを実現するだけでOKそうです.

class BigfloatTmp
  Prec = 256

  def self.prec  # 精度の違うBigfloatどうしてprecを比較したいかも知れ
                 # ないので
    prec
  end

  def prec       #
    Prec
  dnd

  def 演算の実装
  end
  :
end

def Bigfloat(prec)
  bfc = Class.new(BigfloatTmp)
  constset("Bigfloat_#{prec}", bfc)
  bfc.constset("Prec", prec)
end

同名の定数はサブクラスでの定義を優先するという性質を利用しています. 

あ. でも, モジュールにした方がかっこいいかな. その時は,

module BigfloatTmp
  Prec = 256

  def self.prec  # 精度の違うBigfloatどうしてprecを比較したいかも知れ
                 # ないので
    prec
  end

  def prec       #
    Prec
  dnd

  def 演算の実装
  end
  :
end

def Bigfloat(prec)
  bfc = Class.new(Numeric) # or 新Float
  bfc.instance_eval{include BigfloatTmp}
  constset("Bigfloat_#{prec}", bfc)
  bfc.constset("Prec", prec)
end

という感じですね. 常に関数形式で参照できるように.

Bigfloat_classes = {}
def Bigfloat(prec)
  return Bigfloat_classes[prec] if Bigfloat_classes[prec]
  bfc = Class.new(Numeric) # or 新Float
  bfc.include BigfloatTmp
  bfc.constset("Prec", prec)
  constset("Bigfloat_#{prec}", bfc)
  Bigfloat_classes[prec] = bfc
end

とするとさらに完璧かも.

# でも precという言葉は変えた方が良さそうですね.

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