小林です。

----- Original Message -----
送信者 : GOTO Kentaro <gotoken / math.sci.hokudai.ac.jp>
件名 : [ruby-math:00039] BigFloat


>
> ちょっとよく分からないですが、その場合仮数部は何桁なんですか??
>
仮数部は整数配列でダイナミックに割り当てますので何桁
でも可能です。
内部では以下のように表現されます(xxxxxの部分が整数配列)。

BigFloat値 = 0.xxxxxxxxxx * BASE ** exponent

32ビット整数の場合、BASEは 10000 のunsigned longで固定、
exponentはlongです。

具体的には C ですので、以下のような構造体です。
typedef struct {
    unsigned long MaxPrec; // 配列frac[]の最大サイズ
    unsigned long  Prec;   // 配列frac[]の使用サイズ
    long sign;          // 符号+その他
    long exponent;             // 指数
    unsigned long frac[1];  // 仮数部の配列
} Real;

例えば、1234.5678なら
Prec=2,exponent=1でfrac[0]=1234,frac[1]=5687
となります。

> ちなみに、僕がそのころRubyでつくっていた IEEE754Float をのぞ
> いてみたら仮数部を整数としてもち、その数を2進数表記した幅を
> 仮数部の精度としていました。
>
> どうも IEEE574Float(52).induced_from(1.0) をロス無く行えるこ
> とを狙っていた「よう」です ^^;;;
2進とすれば、機械表現と親和性が高いというメリットがありますね。
私の場合、10進ベースです。プログラムが作りやすい(私にとって)
のと、人間が数値を書くときは10進ですので、書いたものは誤差無
く内部表現に変換できるというメリットがあります(と思っています)。


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