Bignum limits?

Hi,

is there a limit on a Bignum size ?
I get this:

irb> a=2262144; a % 1020
=> 62605349934298300416

irb> a=2262145; a
(irb):1: warning: in a
b, b may be too big
=> Infinity

But then,

irb(main):004:0> b=a+a; b % 10**20
=> 25210699868596600832

and even:

irb> c=a31; c % 1020
=> 54593967939561455616

The problem continues here:

irb> d=a32; d % 1020
(irb):21: warning: in a**b, b may be too big
(irb):21: warning: Bignum out of Float range
=> NaN

But I can compute this value anyway:

irb> e=c*a; e % 10**20
=> 85551374411818336256

Is there a bug in the ** method ?

Jean-Claude A. wrote:

=> Infinity
It’s with ruby 1.8.5. Don’t try to print the
result with ruby 1.8.2, because the computation works,
and the result is large ! :slight_smile:

For example, in 1.8.2:

irb(main):001:0> a=2100000000; a%1020
=> 4130048177787109376

(computations with 3**n are much more slower,
but it was expected, since ruby uses base 2)

Paul L. wrote:

What version of Ruby do you have? I ran the same test and didn’t get this
message. And what platform? Mine:

$ ruby -v
ruby 1.8.4 (2005-12-24) [i386-linux]

% ruby -v
ruby 1.8.5 (2006-08-25) [powerpc-darwin8.7.0]
(that is, MacOS X 10.4.7)

Jean-Claude A. wrote:

Hi,

is there a limit on a Bignum size ?

AFAIK no, apart from increasingly long computation times.

I get this:

irb> a=2262144; a % 1020
=> 62605349934298300416

irb> a=2262145; a
(irb):1: warning: in a
b, b may be too big
=> Infinity

What version of Ruby do you have? I ran the same test and didn’t get
this
message. And what platform? Mine:

$ ruby -v
ruby 1.8.4 (2005-12-24) [i386-linux]

Using irb I computed 2**262145 and compared it to an authoritative
source,
it is correct, no errors or warnings.

// snip examples

Is there a bug in the ** method ?

On my system, using your examples, I cannot produce any of the warnings
you
are showing, and the results look correct.

Jean-Claude A. wrote:

(that is, MacOS X 10.4.7)
Okay, I think you are seeing a version-specific bug. Any other reader
comments?

Le 2 septembre 2006 à 11:47, Paul L. a écrit :

% ruby -v
ruby 1.8.5 (2006-08-25) [powerpc-darwin8.7.0]
(that is, MacOS X 10.4.7)

Okay, I think you are seeing a version-specific bug. Any other reader
comments?

I’ve made the test with ruby 1.8.4 : it works fine. Then, I upgraded to
ruby 1.8.5 and it fails as described by the OP.

FWIW :

14:13 fred@talisker:~> ruby -v
ruby 1.8.5 (2006-08-25) [i386-freebsd5]

Fred

F. Senault wrote:

I’ve made the test with ruby 1.8.4 : it works fine. Then, I upgraded to
ruby 1.8.5 and it fails as described by the OP.

FWIW :

14:13 fred@talisker:~> ruby -v
ruby 1.8.5 (2006-08-25) [i386-freebsd5]

Fred

Thanks for the answers.
Actually, it’s not a bug, it’s a feature :slight_smile:

Here’s a piece of bignum.c, with “@” on the important lines:


VALUE
rb_big_pow(x, y)
VALUE x, y;
{
double d;
long yy;

 if (y == INT2FIX(0)) return INT2FIX(1);
 switch (TYPE(y)) {
   case T_FLOAT:
     d = RFLOAT(y)->value;
     break;

@ case T_BIGNUM:
@ rb_warn(“in a**b, b may be too big”);
@ d = rb_big2dbl(y);
break;

   case T_FIXNUM:
     yy = FIX2LONG(y);
     if (yy > 0) {
         VALUE z = x;

@ if (RBIGNUM(x)->len * SIZEOF_BDIGITS * yy > 1024*1024) {
@ rb_warn(“in a**b, b may be too big”);
@ d = (double)yy;
break;
}

Hence, 2^y when y is a bignum (that is, y > 2^30 - 1), always
raises a warning. And if y is a Fixnum, that depends on
the size of the result (a warning when there is about 1 million
binary digits). It’s rather annoying to get a float in that case…
but I guess it’s supposed to prevent a very long computation (that
cannot be interrupted by Ctrl-C) when there is a mistake in the
program.

On 9/2/06, Jean-Claude A. [email protected] wrote:

Hence, 2^y when y is a bignum (that is, y > 2^30 - 1), always
raises a warning. And if y is a Fixnum, that depends on
the size of the result (a warning when there is about 1 million
binary digits). It’s rather annoying to get a float in that case…
but I guess it’s supposed to prevent a very long computation (that
cannot be interrupted by Ctrl-C) when there is a mistake in the
program.

And it’s really not a limit on Bignums in general, just on the argument
to ^.

One limit WOULD be how much memory is available, but that’s going to
be hardware dependent.


Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/