[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Bignum limits ?

Jean-Claude Arbaut

9/2/2006 9:08:00 AM

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 ?
7 Answers

Jean-Claude Arbaut

9/2/2006 9:19:00 AM

0

Jean-Claude Arbaut wrote:
> 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)

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

Paul Lutus

9/2/2006 9:33:00 AM

0

Jean-Claude Arbaut wrote:

> Hi,
>
> is there a limit on a Bignum size ?

AFAIK no, apart from increasingly long computation times.

> 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

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

Jean-Claude Arbaut

9/2/2006 9:44:00 AM

0

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)

Paul Lutus

9/2/2006 9:47:00 AM

0

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
comments?

--
Paul Lutus
http://www.ara...

F. Senault

9/2/2006 12:16:00 PM

0

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

Jean-Claude Arbaut

9/2/2006 1:15:00 PM

0

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

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.

Rick DeNatale

9/2/2006 2:28:00 PM

0

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.

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