From: Akinori MUSHA Date: 2002-03-24T07:19:21+09:00 Subject: [ruby-dev:16551] Re: BigFloat At Sun, 24 Mar 2002 04:21:59 +0900, akr wrote: > すこし眺めてみたのですが、Rational と足し算できないとか、Numeric なの > に mutable だとか、inspect の結果が Array みたいに見えるとか... 枯れて > いるかといわれるとそれはちょっと違うのではないかという気がします。  二番目の mutable であるという点は、どういう形で問題となるの でしょうか。例えば Rational では require 'rational' r = Rational.new(3,4) r.instance_eval { @denominator = 5 } p r #=> Rational(3, 5) のようなことができてしまいますが、同様のことができるのに禁止 していないということですか?  一番目と三番目はこんな感じですかね。 Index: bigfloat.c =================================================================== RCS file: /src/ruby/ext/bigfloat/bigfloat.c,v retrieving revision 1.2 diff -u -1 -r1.2 bigfloat.c --- bigfloat.c 2002/03/23 20:49:07 1.2 +++ bigfloat.c 2002/03/23 22:04:51 @@ -528,2 +528,8 @@ RSTRING(bg)->ptr); + case T_OBJECT: + if (strcmp(rb_class2name(RBASIC(v)->klass), "Rational") == 0) { + VALUE n = rb_funcall(v, rb_intern("numerator"), 0); + VALUE d = rb_funcall(v, rb_intern("denominator"), 0); + return GetVpValue(BigFloat_div(GetVpValue(n, 1)->obj, d), 1); + } default: @@ -1508,3 +1514,3 @@ VpToString(vp, psz1, 10); - sprintf(pszAll,"[BigFloat:%x,'%s',%u(%u)]",self,psz1,VpPrec(vp)*VpBaseFig(),VpMaxPrec(vp)*VpBaseFig()); + sprintf(pszAll,"#",self,psz1,VpPrec(vp)*VpBaseFig(),VpMaxPrec(vp)*VpBaseFig()); > それはそれとして個人的な感想としては、coerce にからむところをいきなり > 入れてしまうとはなんて大胆な、と思っています。それとも私が理解してない > だけでどうにでもなる話なのかなぁ?  それは BigFloat の仕様や実装の根幹にかかわる問題がありそう という意味でしょうか。  BigFloat は Float の自動拡張まで突っ込んだものではないので、 私はひとつ Numeric が増える程度の認識でしかなかったです。 (coerce の組合せはそれぞれ増えますが) -- / /__ __ Akinori.org / MUSHA.org / ) ) ) ) / FreeBSD.org / Ruby-lang.org Akinori MUSHA aka / (_ / ( (__( @ iDaemons.org / and.or.jp "Somewhere out of a memory.. of lighted streets on quiet nights.."