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