# Bignum limits?

Hi,

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

a=2**262144; a % 10**20

=> 62605349934298300416

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:

c=a**31; c % 10**20

=> 54593967939561455616

The problem continues here:

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:

e=c*a; e % 10**20

=> 85551374411818336256

Is there a bug in the ** method ?

Jean-Claude Arbaut wrote:

Hi,

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

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

> 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)

···

But then,

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

and even:

> c=a**31; c % 10**20
=> 54593967939561455616

The problem continues here:

> 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:

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

Is there a bug in the ** method ?

Jean-Claude Arbaut wrote:

Hi,

is there a limit on a Bignum size ?

AFAIK no, apart from increasingly long computation times.

I get this:

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

> a=2**262145; 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.

···

--
Paul Lutus
http://www.arachnoid.com

Paul Lutus 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 Arbaut wrote:

Paul Lutus 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)

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

···

--
Paul Lutus
http://www.arachnoid.com

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

···

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

Jean-Claude Arbaut wrote:

Paul Lutus 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)

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

--
Once you will know my dear You don't have to fear A new beginning
always starts at the end Once you will know my dear You don't have
to fear Until the end of time She goes her way
(Within Temptation, Mother Earth)

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

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.

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.

···

On 9/2/06, Jean-Claude Arbaut <jcarbaut@laposte.net> 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.

--
Rick DeNatale

My blog on Ruby