From: Tadashi Saito Date: 2003-07-13T00:55:04+09:00 Subject: [ruby-dev:20642] [BigDecimal] 標準添付案 This is a multi-part message in MIME format. ------=_NextPart_000_00ED_01C348D9.659F7D00 Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: 7bit 斎藤です。 ----- Original Message ----- From: "石塚圭樹" Sent: Saturday, July 12, 2003 5:36 AM Subject: [ruby-dev:20637] [BigDecimal] 標準添付案 [Re: Re: [BigDecimal] renaming proposal] > sin/cos/**などの関数は省いて四則演算などの基本的な演算のみにする. これ > は, すでにそういう方針で行こうとしていますよね. あれ、** も省くのでしたっけ。 それとも Bigdecimal ** Bigdecimalはできない、という話でしょうか。 > あと, coerceですが, > > まず, Stringとのcoerceは絶対なし. BigDecimalの簡略した表現(リテラル)な > ど別スレッドで話題になっていますが, これらがボツになってもです. > > # 松本さんのメイル[ruby-dev:20630]は良く理解できなかったですが, 同じと > # ころを指しているのでは? とかってにそうぞうしていす. ここの解釈は合っていると思います。 > つぎに, Floatとのcoerceはやめた方が良いと思います. たぶん,小林さんも > FloatとBigDecimalを直接演算させることはやってない思います. Floatから > BigDecimalに変換するのにビミョーな誤差がでるので暗黙的変換はかなり使い > づらいからです. ですので, Float - > BigDecimalは明示的変換にする方が良 > い(つまり, 使う本人がわかって使うぶんには良い)と思います. 自分も賛成です。自分も、Floatとのcoerceを話題にしようか 悩んでいた所でした。 ・StringやFloatのcoerceの削除 ・FloatからBigDecimalへの明示的な変換の実装(Float#to_d) ・それらに伴う添付文章の削除・追加 を含むパッチを、以前のString#to_d等とマージして、メールに添付して みました。よかったら使ってください。 > あと, クラス名ですね. BigDecimalでもまあ良いと思いますが, BigDecimalは > Floatの代わりになるものであり、10進系を強調するとすればBigをとって > Decimal または Decimalnum, Decinum みたいのが良いと思います。 逆に > BigDecimalというと FloatのBigなもをイメージするのであまりよくないかな > と... 実は自分も同じようなことを考えていました。もし改名が許されるなら、 自分は「Decimal」がいいと思います。数に対して「Big」という形容詞をつけるの なら、値が大きいということを意味するのが自然だと思いますが、 (Bignumとは違って)BigDecimalはそうとは限らないからです。 またDecimalなら「小数」「10進」両方の意味を持っているので、それだけで 十分意味を語れると思います。 --- 斎藤ただし ------=_NextPart_000_00ED_01C348D9.659F7D00 Content-Type: application/octet-stream; name="to_d.patch" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="to_d.patch" ? o=0A= ? lib/o=0A= Index: bigdecimal.c=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /src/ruby/ext/bigdecimal/bigdecimal.c,v=0A= retrieving revision 1.9=0A= diff -u -r1.9 bigdecimal.c=0A= --- bigdecimal.c 1 Jul 2003 14:14:18 -0000 1.9=0A= +++ bigdecimal.c 12 Jul 2003 15:26:58 -0000=0A= @@ -135,7 +135,6 @@=0A= static Real *=0A= GetVpValue(VALUE v, int must)=0A= {=0A= - double dv;=0A= Real *pv;=0A= VALUE bg;=0A= char szD[128];=0A= @@ -153,40 +152,6 @@=0A= case T_FIXNUM:=0A= sprintf(szD, "%d", FIX2INT(v));=0A= return VpCreateRbObject(VpBaseFig() * 2 + 1, szD);=0A= - case T_FLOAT:=0A= - pv =3D VpCreateRbObject(VpDblFig()*2,"0");=0A= - dv =3D RFLOAT(v)->value;=0A= - /* From float */=0A= - if (isinf(dv)) {=0A= - VpException(VP_EXCEPTION_INFINITY,"Computation including = infinity",0);=0A= - if(dv=3D=3DVpGetDoublePosInf()) {=0A= - VpSetPosInf(pv);=0A= - } else {=0A= - VpSetNegInf(pv);=0A= - }=0A= - } else=0A= - if (isnan(dv)) {=0A= - VpException(VP_EXCEPTION_NaN,"Computation including NaN(Not = a number)",0);=0A= - VpSetNaN(pv);=0A= - } else {=0A= - if (VpIsNegDoubleZero(dv)) {=0A= - VpSetNegZero(pv);=0A= - } else if(dv=3D=3D0.0) {=0A= - VpSetPosZero(pv);=0A= - } else if(dv=3D=3D1.0) {=0A= - VpSetOne(pv);=0A= - } else if(dv=3D=3D-1.0) {=0A= - VpSetOne(pv);=0A= - pv->sign =3D -pv->sign;=0A= - } else {=0A= - VpDtoV(pv,dv);=0A= - }=0A= - }=0A= - return pv;=0A= - case T_STRING:=0A= - SafeStringValue(v);=0A= - return VpCreateRbObject(strlen(RSTRING(v)->ptr) + VpBaseFig() + = 1,=0A= - RSTRING(v)->ptr);=0A= case T_BIGNUM:=0A= bg =3D rb_big2str(v, 10);=0A= return VpCreateRbObject(strlen(RSTRING(bg)->ptr) + VpBaseFig() = + 1,=0A= @@ -1253,6 +1218,81 @@=0A= return obj;=0A= }=0A= =0A= +static VALUE=0A= +str_to_d(VALUE str)=0A= +{=0A= + ENTER(1);=0A= + Real *a;=0A= +=0A= + SafeStringValue(str);=0A= + GUARD_OBJ(a, VpCreateRbObject(strlen(RSTRING(str)->ptr) + = VpBaseFig() + 1,=0A= + RSTRING(str)->ptr));=0A= + return ToValue(a);=0A= +}=0A= +=0A= +static VALUE=0A= +fix_to_d(VALUE num)=0A= +{=0A= + ENTER(1);=0A= + Real *a;=0A= + char szD[128];=0A= +=0A= + sprintf(szD, "%d", FIX2INT(num));=0A= + GUARD_OBJ(a,VpCreateRbObject(VpBaseFig() * 2 + 1, szD));=0A= + return ToValue(a);=0A= +}=0A= +=0A= +static VALUE=0A= +big_to_d(VALUE x)=0A= +{=0A= + ENTER(1);=0A= + Real *a;=0A= + VALUE bg;=0A= +=0A= + bg =3D rb_big2str(x, 10);=0A= + GUARD_OBJ(a,VpCreateRbObject(strlen(RSTRING(bg)->ptr) + VpBaseFig() = + 1,=0A= + RSTRING(bg)->ptr));=0A= + return ToValue(a);=0A= +}=0A= +=0A= +static VALUE=0A= +flo_to_d(num)=0A= + VALUE num;=0A= +{=0A= + ENTER(1);=0A= + Real *pv;=0A= + double dv;=0A= +=0A= + GUARD_OBJ(pv,VpCreateRbObject(VpDblFig()*2,"0"));=0A= + dv =3D RFLOAT(num)->value;=0A= + if (isinf(dv)) {=0A= + VpException(VP_EXCEPTION_INFINITY,"Computation including infinity",0);=0A= + if(dv=3D=3DVpGetDoublePosInf()) {=0A= + VpSetPosInf(pv);=0A= + } else {=0A= + VpSetNegInf(pv);=0A= + }=0A= + } else=0A= + if (isnan(dv)) {=0A= + VpException(VP_EXCEPTION_NaN,"Computation including NaN(Not a = number)",0);=0A= + VpSetNaN(pv);=0A= + } else {=0A= + if (VpIsNegDoubleZero(dv)) {=0A= + VpSetNegZero(pv);=0A= + } else if(dv=3D=3D0.0) {=0A= + VpSetPosZero(pv);=0A= + } else if(dv=3D=3D1.0) {=0A= + VpSetOne(pv);=0A= + } else if(dv=3D=3D-1.0) {=0A= + VpSetOne(pv);=0A= + pv->sign =3D -pv->sign;=0A= + } else {=0A= + VpDtoV(pv,dv);=0A= + }=0A= + }=0A= + return ToValue(pv);=0A= +}=0A= +=0A= =0A= #ifdef USE_MUTABLE_METHOD=0A= /**** Following methods are all MUTABLE and not currently activated. = ****/=0A= @@ -1450,6 +1490,12 @@=0A= rb_define_method(rb_cBigDecimal, "finite?", BigDecimal_IsFinite, = 0);=0A= rb_define_method(rb_cBigDecimal, "truncate", BigDecimal_truncate, = -1);=0A= rb_define_method(rb_cBigDecimal, "_dump", BigDecimal_dump, -1);=0A= +=0A= + /* misc utility methods */=0A= + rb_define_method(rb_cString, "to_d", str_to_d, 0);=0A= + rb_define_method(rb_cFixnum, "to_d", fix_to_d, 0);=0A= + rb_define_method(rb_cBignum, "to_d", big_to_d, 0);=0A= + rb_define_method(rb_cFloat, "to_d", flo_to_d, 0);=0A= =0A= #ifdef USE_MUTABLE_METHOD=0A= rb_define_singleton_method(rb_cBigDecimal, "assign!", = BigDecimal_assign, 3);=0A= Index: bigdecimal_en.html=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /src/ruby/ext/bigdecimal/bigdecimal_en.html,v=0A= retrieving revision 1.4=0A= diff -u -r1.4 bigdecimal_en.html=0A= --- bigdecimal_en.html 27 Jun 2003 04:38:57 -0000 1.4=0A= +++ bigdecimal_en.html 12 Jul 2003 15:26:58 -0000=0A= @@ -97,7 +97,8 @@=0A= "new" method creates a new BigDecimal object.
=0A= a=3DBigDecimal::new(s[,n])
=0A= where:
=0A= -s: Initial value string.
=0A= +s: Initial value string. "Infinity", "+Infinity", "-Infinity", and = "NaN" can also be used unless false is specified by mode method.=0A= +
=0A= n: Maximum number of significant digits of a. n must be a Fixnum object.=0A= If n is omitted or is equal to 0,then the maximum number of significant = digits of a is determined from the length of s.=0A= =0A= @@ -507,6 +508,12 @@=0A=
  • >
  • =0A=
  • >=3D
  • =0A= =0A= +

    Instance methods in other classes

    =0A= +=0A=
    =0A= =0A=

    About 'coerce'

    =0A= @@ -520,30 +527,6 @@=0A=
    If A has coerce mthod,then B will translate A to corresponding =0A= BigDecimal object and the operation is performed,otherwise an error = occures.
    =0A= =0A= -=0A= -Attention must be paid when a String is to be translated to BigDecimal.=0A= -Translation stops without error at the character representing non digit.=0A= -For instance,"10XX" is translated to 10,"XXXX" is translated to 0.
    =0A= -String representing zero or infinity such as = "Infinity","+Infinity","-Infinity",and "NaN" can also be translated to = BigDecimal unless false is specified by mode method.
    =0A= -=0A= -BigDecimal class supports coerce method(for the details about coerce = method,see Ruby documentations). This means the most binary operation = can be performed if the BigDecimal object is at the left hand side of = the operation.

    =0A= -=0A= - For example:=0A= -
    =0A=
    -  a =3D BigDecimal.E(20)=0A=
    -  c =3D a * "0.123456789123456789123456789" # A String is changed to =
    BigDecimal object.=0A=
    -
    =0A= -is performed normally.
    =0A= - But,because String does not have coerce method,the following example = can not be performed.
    =0A= -=0A= -
    =0A=
    -  a =3D BigDecimal.E(20)=0A=
    -  c =3D "0.123456789123456789123456789" * a # ERROR=0A=
    -
    =0A= -=0A= -If you actually have any inconvenience about the error above.=0A= -You can define a new class derived from String class,=0A= -and define coerce method within the new class.
    =0A= =0A=
    =0A= =0A= Index: bigdecimal_ja.html=0A= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=0A= RCS file: /src/ruby/ext/bigdecimal/bigdecimal_ja.html,v=0A= retrieving revision 1.4=0A= diff -u -r1.4 bigdecimal_ja.html=0A= --- bigdecimal_ja.html 27 Jun 2003 04:38:57 -0000 1.4=0A= +++ bigdecimal_ja.html 12 Jul 2003 15:26:58 -0000=0A= @@ -104,7 +104,10 @@=0A=
  • new
  • =0A= =90V=82=B5=82=A2 BigDecimal = =83I=83u=83W=83F=83N=83g=82=F0=90=B6=90=AC=82=B5=82=DC=82=B7=81B
    =0A= a=3DBigDecimal::new(s[,n])
    =0A= -s = =82=CD=8F=89=8A=FA=92l=82=F0=95=B6=8E=9A=97=F1=82=C5=8Ew=92=E8=82=B5=82=DC= =82=B7=81D=0A= +s = =82=CD=8F=89=8A=FA=92l=82=F0=95=B6=8E=9A=97=F1=82=C5=8Ew=92=E8=82=B5=82=DC= =82=B7=81D=96=B3=8C=C0=91=E5=82=E2=94=F1=90=94=82=F0=95\=82=B7=95=B6=8E=9A= =82=C6=82=B5=82=C4=81A=0A= +"Infinity"=81A"+Infinity"=81A"-Infinity"=81A"NaN"=82=E0=8Eg=97p=82=C5=82= =AB=82=DC=82=B7=0A= +(=91=E5=95=B6=8E=9A=81E=8F=AC=95=B6=8E=9A=82=F0=8B=E6=95=CA=82=B5=82=DC=82= =B7)=81B=82=BD=82=BE=82=B5=81Amode =83=81=83\=83b=83h=82=C5 false =82=F0=0A= +=8Ew=92=E8=82=B5=82=BD=8F=EA=8D=87=82=CD=97=E1=8AO=82=AA=94=AD=90=B6=82=B5= =82=DC=82=B7=81B
    =0A= n =82=CD=95K=97v=82=C8=97L=8C=F8=8C=85=90=94=81ia = =82=CC=8D=C5=91=E5=97L=8C=F8=8C=85=90=94=81j=82=F0=90=AE=90=94=82=C5=8Ew=92= =E8=82=B5=82=DC=82=B7=81B=0A= n =82=AA 0 = =82=DC=82=BD=82=CD=8F=C8=97=AA=82=B3=82=EA=82=BD=82=C6=82=AB=82=CD=81An = =82=CC=92l=82=CD s = =82=CC=97L=8C=F8=8C=85=90=94=82=C6=82=DD=82=C8=82=B3=82=EA=82=DC=82=B7=81= B=0A= s =82=CC=97L=8C=F8=8C=85=90=94=82=E6=82=E8 n = =82=AA=8F=AC=82=B3=82=A2=82=C6=82=AB=82=E0 n=3D0 = =82=CC=82=C6=82=AB=82=C6=93=AF=82=B6=82=C5=82=B7=81B=0A= @@ -493,32 +496,17 @@=0A=
  • >
  • =0A=
  • >=3D
  • =0A= =0A= +

    =91=BC=83N=83=89=83X=82=CC=83C=83=93=83X=83^=83=93=83X=83=81=83\=83= b=83h

    =0A= +
      =0A= +
    • String#to_d, Fixnum#to_d, Bignum#to_d, = Float#to_d
    • =0A= +=82=BB=82=EA=82=BC=82=EA=82=CC=83=8C=83V=81[=83o=82=CC=92l=82=C9=91=CE=89= =9E=82=B7=82=E9BigDecimal=82=F0=95=D4=82=B5=82=DC=82=B7=81B=0A= +
      =0A= +
    =0A=

    coerce=82=C9=82=C2=82=A2=82=C4

    =0A= BigDecimal = =83I=83u=83W=83F=83N=83g=82=AA=8EZ=8Fp=89=89=8EZ=8Eq=82=CC=8D=B6=82=C9=82= =A0=82=E9=82=C6=82=AB=82=CD=81ABigDecimal =83I=83u=83W=83F=83N=83g=82=AA=0A= = =89E=82=C9=82=A0=82=E9=83I=83u=83W=83F=83N=83g=82=F0(=95K=97v=82=C8=82=E7= ) BigDecimal = =82=C9=95=CF=8A=B7=82=B5=82=C4=82=A9=82=E7=8Cv=8EZ=82=B5=82=DC=82=B7=81B=0A= =8F]=82=C1=82=C4=81ABigDecimal = =83I=83u=83W=83F=83N=83g=88=C8=8AO=82=C5=82=E0=90=94=92l=82=F0=88=D3=96=A1= =82=B7=82=E9=82=E0=82=CC=82=C8=82=E7=89E=82=C9=92u=82=AF=82=CE=0A= =89=89=8EZ=82=CD=89=C2=94\=82=C5=82=B7=81B

    =0A= -=95=B6=8E=9A=97=F1=82=C5=90=94=92l=82=F0=97^=82=A6=82=E9=8F=EA=8D=87=82=CD= =92=8D=88=D3=82=AA=95K=97v=82=C5=82=B7=81B=90=94=92l=82=C9=95=CF=8A=B7=82= =C5=82=AB=82=C8=82=A2=95=B6=8E=9A=82=AA=82=A0=82=E9=82=C6=81A=0A= -=92P=82=C9=95=CF=8A=B7=82=F0=8E~=82=DF=82=E9=82=BE=82=AF=82=C5=83G=83=89= =81[=82=C9=82=CD=82=C8=82=E8=82=DC=82=B9=82=F1=81B"10XX"=82=C8=82=E7=82P=82= O=81A"XXXX"=82=CD=82O=0A= -=82=C6=88=B5=82=ED=82=EA=82=DC=82=B7=81B
    =0A= -
    =0A=
    -   a =3D BigDecimal.E(20)=0A=
    -   c =3D a * "0.123456789123456789123456789" # =95=B6=8E=9A=82=F0 =
    BigDecimal =82=C9=95=CF=8A=B7=82=B5=82=C4=82=A9=82=E7=8Cv=8EZ=0A=
    -
    =0A= -=96=B3=8C=C0=91=E5=82=E2=94=F1=90=94=82=F0=95\=82=B7=95=B6=8E=9A=82=C6=82= =B5=82=C4=81A"Infinity"=81A"+Infinity"=81A"-Infinity"=81A"NaN"=0A= -=82=E0=8Eg=97p=82=C5=82=AB=82=DC=82=B7(=91=E5=95=B6=8E=9A=81E=8F=AC=95=B6= =8E=9A=82=F0=8B=E6=95=CA=82=B5=82=DC=82=B7)=81B=82=BD=82=BE=82=B5=81Amode= =83=81=83\=83b=83h=82=C5 false =82=F0=0A= -=8Ew=92=E8=82=B5=82=BD=8F=EA=8D=87=82=CD=97=E1=8AO=82=AA=94=AD=90=B6=82=B5= =82=DC=82=B7=81B=0A= -
    =0A= -=82=DC=82=BD=81ABigDecimal=83N=83=89=83X=82=CD = coerce=81iRuby=96{=8EQ=8F=C6=81j=82=F0=83T=83|=81[=83g=82=B5=82=C4=82=A2=82= =DC=82=B7=81B=0A= -=8F]=82=C1=82=C4=81ABigDecimal = =83I=83u=83W=83F=83N=83g=82=AA=89E=82=C9=82=A0=82=E9=8F=EA=8D=87=82=E0=91= =E5=92=EF=82=CD=91=E5=8F=E4=95v=82=C5=82=B7=81B=0A= -=82=BD=82=BE=81A=8C=BB=8D=DD=82=CC Ruby = =83C=83=93=83^=83v=83=8A=83^=82=CC=8Ed=97l=8F=E3=81A=95=B6=8E=9A=97=F1=82= =AA=8D=B6=82=C9=82=A0=82=E9=82=C6=8Cv=8EZ=82=C5=82=AB=82=DC=82=B9=82=F1=81= B
    =0A= -
    =0A=
    -  a =3D BigDecimal.E(20)=0A=
    -  c =3D "0.123456789123456789123456789" * a # =83G=83=89=81[=0A=
    -
    =0A= -=95K=97v=90=AB=82=AA=82=A0=82=E9=82=C6=82=CD=8Ev=82=A2=82=DC=82=B9=82=F1= =82=AA=81A=82=C7=82=A4=82=B5=82=C4=82=E0=82=C6=8C=BE=82=A4=90l=82=CD=0A= - String = =83I=83u=83W=83F=83N=83g=82=F0=8Cp=8F=B3=82=B5=82=BD=90V=82=BD=82=C8=83N=83= =89=83X=82=F0=8D=EC=90=AC=82=B5=82=C4=82=A9=82=E7=81A=0A= -=82=BB=82=CC=83N=83=89=83X=82=C5 coerce = =82=F0=83T=83|=81[=83g=82=B5=82=C4=82=AD=82=BE=82=B3=82=A2=81B=0A= =0A=
    =0A=
    =0A= ------=_NextPart_000_00ED_01C348D9.659F7D00--