From: gotoken@... (GOTO Kentaro) Date: 2000-01-07T14:21:49+09:00 Subject: [ruby-dev:8866] DoubleFloat ごとけんです 随分前に申告した分ですが、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