Project

General

Profile

Actions

Bug #12337

closed

inconsistency between Fixnum#coerce and Bignum#coerce

Bug #12337: inconsistency between Fixnum#coerce and Bignum#coerce

Added by akr (Akira Tanaka) over 9 years ago. Updated over 9 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.4.0dev (2016-05-01 trunk 54866) [x86_64-linux]
[ruby-core:75290]

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, (2
40).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

int-coerce.patch (2.37 KB) int-coerce.patch akr (Akira Tanaka), 05/03/2016 09:06 AM
Actions

Also available in: PDF Atom