From: nobu.nakada@... Date: 2000-07-12T07:50:12+09:00 Subject: [ruby-dev:10291] Re: bignum division has bug? なかだです。 At Tue, 11 Jul 2000 21:57:01 +0900, Hiroshi IGARASHI wrote: > > いがらしです。報告だけですみませんが… > > CVS latestで miniruby -e 'p 2**29/2**30' が落ちます。 > また、 2**30/2**30 や 2**28/2**29 は平気なのですが、 > 1/2**30 は駄目です。 パッチだけですみませんが…。 Index: bignum.c =================================================================== RCS file: /home/cvs/ruby/bignum.c,v retrieving revision 1.18 diff -u -2 -p -r1.18 bignum.c --- bignum.c 2000/07/11 08:27:06 1.18 +++ bignum.c 2000/07/11 22:33:51 @@ -897,10 +897,21 @@ bigdivmod(x, y, divp, modp) bigdivrem(x, y, divp, &mod); if (RBIGNUM(x)->sign != RBIGNUM(y)->sign && RBIGNUM(mod)->len > 0) { - if (divp) *divp = bigadd(*divp, rb_int2big(1), 0); - if (modp) *modp = bigadd(mod, y, 1); + if (divp) { + VALUE div = *divp; + if (FIXNUM_P(div)) + *divp = rb_int2inum(FIX2LONG(div) + 1); + else + *divp = bigadd(div, rb_int2big(1), 0); + } + if (modp) { + if (FIXNUM_P(mod)) + *modp = rb_int2inum(FIX2LONG(mod) + 1); + else + *modp = bigadd(mod, y, 1); + } } else { - if (divp) *divp = bignorm(*divp); - if (modp) *modp = bignorm(mod); + if (divp && !FIXNUM_P(*divp)) *divp = bignorm(*divp); + if (modp) *modp = FIXNUM_P(mod) ? mod : bignorm(mod); } } -- そうだ 強気に ちょっと インチキに☆彡 中田 "Bugるくらいがちょうどいいかも;-)" 伸悦