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 ab, 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 ! 
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 ab, 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.
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 
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/