Bignum limits ?

  • Thread starter Jean-Claude Arbaut
  • Start date
J

Jean-Claude Arbaut

Hi,

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

irb> a=2**262144; a % 10**20
=> 62605349934298300416

irb> a=2**262145; 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=a**31; c % 10**20
=> 54593967939561455616

The problem continues here:

irb> d=a**32; d % 10**20
(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 ?
 
J

Jean-Claude Arbaut

Jean-Claude Arbaut said:
Hi,

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

irb> a=2**262144; a % 10**20
=> 62605349934298300416

irb> a=2**262145; a
(irb):1: warning: in a**b, b may be too big
=> 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 ! :)

For example, in 1.8.2:

irb(main):001:0> a=2**100000000; a%10**20
=> 4130048177787109376

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

Jean-Claude Arbaut

Paul said:
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)
 
F

F. Senault

Le 2 septembre 2006 à 11:47, Paul Lutus a écrit :
Jean-Claude Arbaut said:
Paul said:
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)

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
 
J

Jean-Claude Arbaut

F. Senault said:
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 :)

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.
 
R

Rick DeNatale

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,770
Messages
2,569,585
Members
45,080
Latest member
mikkipirss

Latest Threads

Top