Actions
Bug #12337
closedinconsistency between Fixnum#coerce and Bignum#coerce
Description
I found 1.coerce(2.0) is [2.0, 1.0] but
(2**100).coerce(2.0) raises TypeError
% ./ruby -ve 'p 1.coerce(2.0)'
ruby 2.4.0dev (2016-05-01 trunk 54866) [x86_64-linux]
[2.0, 1.0]
% ./ruby -ve 'p (2**100).coerce(2.0)'
ruby 2.4.0dev (2016-05-01 trunk 54866) [x86_64-linux]
-e:1:in `coerce': can't coerce Float to Bignum (TypeError)
from -e:1:in `<main>'
This is a documented behavior.
% ri Bignum.coerce|cat
= Bignum.coerce
(from ruby core)
------------------------------------------------------------------------------
big.coerce(numeric) -> array
------------------------------------------------------------------------------
Returns an array with both a numeric and a big represented as Bignum objects.
This is achieved by converting numeric to a Bignum.
A TypeError is raised if the numeric is not a Fixnum or Bignum type.
(0x3FFFFFFFFFFFFFFF+1).coerce(42) #=> [42, 4611686018427387904]
But I think this is bad bahavior.
Fixnum and Bignum should work seamlessly.
For example, this exposes the platform is 32-bit or 64-bit.
240 is Fixnum on 32-bit environment and Bignum on 64-bit environment.
So, (240).coerce(2.0) behaves differently: returns an array on 64-bit and
raises TypeError on 32-bit platform.
32bit-platform% ./ruby -ve 'p (2**40).coerce(2.0)'
ruby 2.4.0dev (2016-05-01 trunk 54866) [x86_64-linux]
[2.0, 1099511627776.0]
64bit-platform% ./ruby -ve 'p (2**40).coerce(2.0)'
ruby 2.4.0dev (2016-05-01 trunk 54864) [i686-linux]
-e:1:in `coerce': can't coerce Float to Bignum (TypeError)
from -e:1:in `<main>'
I think the behavior of Bignum#coerce should be changed
to match Fixnum#coerce (actually defined at Numeric).
Files
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0