basics/whole_number_limits.rb
tests/_examples/basics/whole_number_limits.rb in the metorex repository.
# A shift reads its count through `to_int`, and a count too wide for a machine
# word shifts everything out or fills with the sign.
class Four
def to_int
4
end
end
p 3 << Four.new
p 3 << -(2**64)
p 3 >> (2**64)
p 0 << (2**64)
# Raising to a power answers exactly, and one whose answer would be too wide
# to build is refused.
p((2 ** 70).bit_length)
begin
100000000 ** 1000000000
rescue ArgumentError => trouble
p trouble.message
end
p 1 ** (2**64)
p((-1) ** (2**64))
begin
0 ** -1
rescue ZeroDivisionError => trouble
p trouble.message
end
p 0 ** -1.0
p 2 ** Rational(2, 1)
p 2 ** Rational(1, 2)
# `div` hands the pair a `coerce` answers to `div` rather than to `/`.
class Halved
def coerce(other)
[other * 2, 2]
end
end
p 10.div(Halved.new)
# `pow` takes a modulus, and a second argument that is not an Integer is
# refused even when it is nil.
p 2.pow(10, 1000)
begin
2.pow(5, nil)
rescue TypeError => trouble
p trouble.message
end
Output:
48
0
0
0
71
"exponent is too large"
1
1
"divided by 0"
Infinity
(4/1)
1.4142135623730951
10
24
"Integer#pow() 2nd argument not allowed unless all arguments are integers"