ごとけんです

随分前に申告した分ですが、Float のサブクラスとして C の 
double と float に相当する DoubleFloat と SingleFloat につい
てです。

もう忘れられているでしょうから、改めて説明すると、

  DoubleFloat < Float 

は新しく導入される抽象クラス Float のサブクラスであることを
除いて現行の Float と同じモノです。 to_f やリテラルの評価値
は DoubleFloat になります。その他で唯一の例外は unpack のテ
ンプレート f と e, E が SingleFloat を返すことです。

SingleFloat オブジェクトを得るには num.prec や 
SingleFloat.induced_from を使う必要があります。 
  # リテラルをもらえるならやっぱり欲しいかも。

さて、改めて実装しはじめて思い出しましたが、API をどうしたも
んだかと迷っています。 grep -i *.h の結果は

config.h:#define SIZEOF_FLOAT 4
intern.h:VALUE rb_float_new _((double));
intern.h:VALUE rb_Float _((VALUE));
ruby.h:#define T_FLOAT  0x06
ruby.h:struct RFloat {
ruby.h:#define RFLOAT(obj)  (R_CAST(RFloat)(obj))
ruby.h:EXTERN VALUE rb_cFloat;
ruby.h:EXTERN VALUE rb_eFloatDomainError;

となるのですが、このうち、ruby.h で定義されている、T_FLOAT,
struct RFloat, RFLOAT の扱いに困っています。いま考えているの
は、

* T_FLOAT は廃止して
    #define T_DFLOAT 0x06
    #define T_SFLOAT 0x0f

* struct RFloat も廃止して
    struct RDFloat {
	struct RBasic basic;
	double value;
    };
    struct RSFloat {
	struct RBasic basic;
	double value;
    };


* RFLOAT も廃止して
    #define RDFLOAT(obj) (R_CAST(RDFloat)(obj))
    #define RSFLOAT(obj) (R_CAST(RSFloat)(obj))

とするモノです。また、numric.c で定義されている flo_*() は
すべて、dflo_*() を返すようにしようと思っています。

別の案としては、既存のFloatはAPIは一切変えずにクラス名前を表
す文字列だけ変えて、逆に、新しく作られる抽象クラスとしての
Float の API をaflo_ などとして追加するというモノが考えられ
ます。

御意見お待ちしてます。

-- gotoken