Class: Integer
Overview
******************************************************************
An \Integer object represents an integer value.
You can create an \Integer object explicitly with:
- An {integer literal}[rdoc-ref:syntax/literals.rdoc@Integer+Literals].
You can convert certain objects to Integers with:
- \Method #Integer.
An attempt to add a singleton method to an instance of this class
causes an exception to be raised.
== What's Here
First, what's elsewhere. \Class \Integer:
- Inherits from {class Numeric}[rdoc-ref:Numeric@What-27s+Here].
Here, class \Integer provides methods for:
- {Querying}[rdoc-ref:Integer@Querying]
- {Comparing}[rdoc-ref:Integer@Comparing]
- {Converting}[rdoc-ref:Integer@Converting]
- {Other}[rdoc-ref:Integer@Other]
=== Querying
- #allbits?: Returns whether all bits in +self+ are set.
- #anybits?: Returns whether any bits in +self+ are set.
- #nobits?: Returns whether no bits in +self+ are set.
=== Comparing
- #<: Returns whether +self+ is less than the given value.
- #<=: Returns whether +self+ is less than or equal to the given value.
- #<=>: Returns a number indicating whether +self+ is less than, equal
to, or greater than the given value.
- #== (aliased as #===): Returns whether +self+ is equal to the given
value.
- #>: Returns whether +self+ is greater than the given value.
- #>=: Returns whether +self+ is greater than or equal to the given value.
=== Converting
- ::sqrt: Returns the integer square root of the given value.
- ::try_convert: Returns the given value converted to an \Integer.
- #% (aliased as #modulo): Returns +self+ modulo the given value.
- #&: Returns the bitwise AND of +self+ and the given value.
- #*: Returns the product of +self+ and the given value.
- #**: Returns the value of +self+ raised to the power of the given value.
- #+: Returns the sum of +self+ and the given value.
- #-: Returns the difference of +self+ and the given value.
- #/: Returns the quotient of +self+ and the given value.
- #<<: Returns the value of +self+ after a leftward bit-shift.
- #>>: Returns the value of +self+ after a rightward bit-shift.
- #[]: Returns a slice of bits from +self+.
- #^: Returns the bitwise EXCLUSIVE OR of +self+ and the given value.
- #ceil: Returns the smallest number greater than or equal to +self+.
- #chr: Returns a 1-character string containing the character
represented by the value of +self+.
- #digits: Returns an array of integers representing the base-radix digits
of +self+.
- #div: Returns the integer result of dividing +self+ by the given value.
- #divmod: Returns a 2-element array containing the quotient and remainder
results of dividing +self+ by the given value.
- #fdiv: Returns the Float result of dividing +self+ by the given value.
- #floor: Returns the greatest number smaller than or equal to +self+.
- #pow: Returns the modular exponentiation of +self+.
- #pred: Returns the integer predecessor of +self+.
- #remainder: Returns the remainder after dividing +self+ by the given value.
- #round: Returns +self+ rounded to the nearest value with the given precision.
- #succ (aliased as #next): Returns the integer successor of +self+.
- #to_f: Returns +self+ converted to a Float.
- #to_s (aliased as #inspect): Returns a string containing the place-value
representation of +self+ in the given radix.
- #truncate: Returns +self+ truncated to the given precision.
- #|: Returns the bitwise OR of +self+ and the given value.
=== Other
- #downto: Calls the given block with each integer value from +self+
down to the given value.
- #times: Calls the given block +self+ times with each integer
in <tt>(0..self-1)</tt>.
- #upto: Calls the given block with each integer value from +self+
up to the given value.
Constant Summary collapse
- GMP_VERSION =
The version of loaded GMP.
rb_sprintf("GMP %s", gmp_version)
Class Method Summary collapse
- .sqrt ⇒ Object
-
.try_convert(object) ⇒ Object, ...
If
object
is an Integer object, returnsobject
.
Instance Method Summary collapse
-
#%(other) ⇒ Object
Returns
self
moduloother
as a real number. -
#&(other) ⇒ Integer
Bitwise AND; each bit in the result is 1 if both corresponding bits in
self
andother
are 1, 0 otherwise:. -
#*(numeric) ⇒ Object
Performs multiplication:.
-
#**(numeric) ⇒ Object
Raises
self
to the power ofnumeric
:. -
#+(numeric) ⇒ Object
Performs addition:.
-
#-(numeric) ⇒ Object
Performs subtraction:.
-
#/(numeric) ⇒ Object
Performs division; for integer
numeric
, truncates the result to an integer:. -
#<(other) ⇒ Boolean
Returns
true
if the value ofself
is less than that ofother
:. -
#<<(count) ⇒ Integer
Returns
self
with bits shiftedcount
positions to the left, or to the right ifcount
is negative:. -
#<=(real) ⇒ Boolean
Returns
true
if the value ofself
is less than or equal to that ofother
:. -
#<=>(other) ⇒ -1, ...
Returns:.
-
#==(other) ⇒ Boolean
Returns
true
ifself
is numerically equal toother
;false
otherwise. -
#==(other) ⇒ Boolean
Returns
true
ifself
is numerically equal toother
;false
otherwise. -
#>(other) ⇒ Boolean
Returns
true
if the value ofself
is greater than that ofother
:. -
#>=(real) ⇒ Boolean
Returns
true
if the value ofself
is greater than or equal to that ofother
:. -
#>>(count) ⇒ Integer
Returns
self
with bits shiftedcount
positions to the right, or to the left ifcount
is negative:. -
#[](*, const) ⇒ Object
Returns a slice of bits from
self
. -
#^(other) ⇒ Integer
Bitwise EXCLUSIVE OR; each bit in the result is 1 if the corresponding bits in
self
andother
are different, 0 otherwise:. -
#allbits?(mask) ⇒ Boolean
Returns
true
if all bits that are set (=1) inmask
are also set inself
; returnsfalse
otherwise. -
#anybits?(mask) ⇒ Boolean
Returns
true
if any bit that is set (=1) inmask
is also set inself
; returnsfalse
otherwise. -
#ceil(ndigits = 0) ⇒ Integer
Returns the smallest number greater than or equal to
self
with a precision ofndigits
decimal digits. -
#chr(*args) ⇒ Object
Returns a 1-character string containing the character represented by the value of
self
, according to the givenencoding
. -
#coerce(numeric) ⇒ Array
Returns an array with both a
numeric
and aint
represented as Integer objects or Float objects. -
#digits(base = 10) ⇒ Object
Returns an array of integers representing the
base
-radix digits ofself
; the first element of the array represents the least significant digit:. -
#div(numeric) ⇒ Integer
Performs integer division; returns the integer result of dividing
self
bynumeric
:. -
#divmod(other) ⇒ Array
Returns a 2-element array
[q, r]
, where. -
#downto(to) ⇒ Object
Calls the given block with each integer value from
self
down tolimit
; returnsself
:. -
#fdiv(numeric) ⇒ Float
Returns the Float result of dividing
self
bynumeric
:. -
#floor(ndigits = 0) ⇒ Integer
Returns the largest number less than or equal to
self
with a precision ofndigits
decimal digits. -
#gcd(other_int) ⇒ Integer
Returns the greatest common divisor of the two integers.
-
#gcdlcm(other_int) ⇒ Array
Returns an array with the greatest common divisor and the least common multiple of the two integers, [gcd, lcm].
-
#lcm(other_int) ⇒ Integer
Returns the least common multiple of the two integers.
-
#%(other) ⇒ Object
Returns
self
moduloother
as a real number. - #next ⇒ Object
-
#nobits?(mask) ⇒ Boolean
Returns
true
if no bit that is set (=1) inmask
is also set inself
; returnsfalse
otherwise. -
#pow(*, const) ⇒ Object
Returns (modular) exponentiation as:.
- #pred ⇒ Object
-
#rationalize([eps]) ⇒ Object
Returns the value as a rational.
-
#remainder(other) ⇒ Object
Returns the remainder after dividing
self
byother
. -
#round(ndigits = 0, half: :up) ⇒ Integer
Returns
self
rounded to the nearest value with a precision ofndigits
decimal digits. - #succ ⇒ Object
-
#to_f ⇒ Float
Converts
self
to a Float:. -
#to_r ⇒ Object
Returns the value as a rational.
-
#to_s(base = 10) ⇒ String
(also: #inspect)
Returns a string containing the place-value representation of
self
in radixbase
(in 2..36). -
#truncate(ndigits = 0) ⇒ Integer
Returns
self
truncated (toward zero) to a precision ofndigits
decimal digits. -
#upto(to) ⇒ Object
Calls the given block with each integer value from
self
up tolimit
; returnsself
:. -
#|(other) ⇒ Integer
Bitwise OR; each bit in the result is 1 if either corresponding bit in
self
orother
is 1, 0 otherwise:.
Methods inherited from Numeric
#+@, #-@, #abs, #abs2, #angle, #arg, #clone, #denominator, #dup, #eql?, #i, #magnitude, #negative?, #nonzero?, #numerator, #phase, #polar, #positive?, #quo, #rect, #rectangular, #singleton_method_added, #step, #to_c, #to_int, #zero?
Methods included from Comparable
Class Method Details
.sqrt ⇒ Object
.try_convert(object) ⇒ Object, ...
If object
is an Integer object, returns object
.
Integer.try_convert(1) # => 1
Otherwise if object
responds to :to_int
, calls object.to_int
and returns the result.
Integer.try_convert(1.25) # => 1
Returns nil
if object
does not respond to :to_int
Integer.try_convert([]) # => nil
Raises an exception unless object.to_int
returns an Integer object.
5960 5961 5962 5963 5964 |
# File 'numeric.c', line 5960
static VALUE
int_s_try_convert(VALUE self, VALUE num)
{
return rb_check_integer_type(num);
}
|
Instance Method Details
#%(other) ⇒ Object
Returns self
modulo other
as a real number.
For integer n
and real number r
, these expressions are equivalent:
n % r
n-r*(n/r).floor
n.divmod(r)[1]
See Numeric#divmod.
Examples:
10 % 2 # => 0
10 % 3 # => 1
10 % 4 # => 2
10 % -2 # => 0
10 % -3 # => -2
10 % -4 # => -2
10 % 3.0 # => 1.0
10 % Rational(3, 1) # => (1/1)
4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 |
# File 'numeric.c', line 4314
VALUE
rb_int_modulo(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_mod(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_modulo(x, y);
}
return num_modulo(x, y);
}
|
#&(other) ⇒ Integer
Bitwise AND; each bit in the result is 1 if both corresponding bits in self
and other
are 1, 0 otherwise:
"%04b" % (0b0101 & 0b0110) # => "0100"
Raises an exception if other
is not an Integer.
Related: Integer#| (bitwise OR), Integer#^ (bitwise EXCLUSIVE OR).
4970 4971 4972 4973 4974 4975 4976 4977 4978 4979 4980 |
# File 'numeric.c', line 4970
VALUE
rb_int_and(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_and(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_and(x, y);
}
return Qnil;
}
|
#*(numeric) ⇒ Object
4082 4083 4084 4085 4086 4087 4088 4089 4090 4091 4092 |
# File 'numeric.c', line 4082
VALUE
rb_int_mul(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_mul(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_mul(x, y);
}
return rb_num_coerce_bin(x, y, '*');
}
|
#**(numeric) ⇒ Object
4575 4576 4577 4578 4579 4580 4581 4582 4583 4584 4585 |
# File 'numeric.c', line 4575
VALUE
rb_int_pow(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_pow(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_pow(x, y);
}
return Qnil;
}
|
#+(numeric) ⇒ Object
3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 |
# File 'numeric.c', line 3982
VALUE
rb_int_plus(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_plus(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_plus(x, y);
}
return rb_num_coerce_bin(x, y, '+');
}
|
#-(numeric) ⇒ Object
4027 4028 4029 4030 4031 4032 4033 4034 4035 4036 4037 |
# File 'numeric.c', line 4027
VALUE
rb_int_minus(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_minus(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_minus(x, y);
}
return rb_num_coerce_bin(x, y, '-');
}
|
#/(numeric) ⇒ Object
Performs division; for integer numeric
, truncates the result to an integer:
4 / 3 # => 1
4 / -3 # => -2
-4 / 3 # => -2
-4 / -3 # => 1
For other +numeric+, returns non-integer result:
4 / 3.0 # => 1.3333333333333333
4 / Rational(3, 1) # => (4/3)
4 / Complex(3, 0) # => ((4/3)+0i)
4219 4220 4221 4222 4223 4224 4225 4226 4227 4228 4229 |
# File 'numeric.c', line 4219
VALUE
rb_int_div(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_div(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_div(x, y);
}
return Qnil;
}
|
#<(other) ⇒ Boolean
Returns true
if the value of self
is less than that of other
:
1 < 0 # => false
1 < 1 # => false
1 < 2 # => true
1 < 0.5 # => false
1 < Rational(1, 2) # => false
Raises an exception if the comparison cannot be made.
4834 4835 4836 4837 4838 4839 4840 4841 4842 4843 4844 |
# File 'numeric.c', line 4834
static VALUE
int_lt(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_lt(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_lt(x, y);
}
return Qnil;
}
|
#<<(count) ⇒ Integer
Returns self
with bits shifted count
positions to the left, or to the right if count
is negative:
n = 0b11110000
"%08b" % (n << 1) # => "111100000"
"%08b" % (n << 3) # => "11110000000"
"%08b" % (n << -1) # => "01111000"
"%08b" % (n << -3) # => "00011110"
Related: Integer#>>.
5109 5110 5111 5112 5113 5114 5115 5116 5117 5118 5119 |
# File 'numeric.c', line 5109
VALUE
rb_int_lshift(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return rb_fix_lshift(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_lshift(x, y);
}
return Qnil;
}
|
#<=(real) ⇒ Boolean
Returns true
if the value of self
is less than or equal to
that of +other+:
1 <= 0 # => false
1 <= 1 # => true
1 <= 2 # => true
1 <= 0.5 # => false
1 <= Rational(1, 2) # => false
Raises an exception if the comparison cannot be made.
4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 |
# File 'numeric.c', line 4881
static VALUE
int_le(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_le(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_le(x, y);
}
return Qnil;
}
|
#<=>(other) ⇒ -1, ...
Returns:
-
-1, if
self
is less thanother
. -
0, if
self
is equal toother
. -
1, if
self
is greater thenother
. -
nil
, ifself
andother
are incomparable.
Examples:
1 <=> 2 # => -1
1 <=> 1 # => 0
1 <=> 0 # => 1
1 <=> 'foo' # => nil
1 <=> 1.0 # => 0
1 <=> Rational(1, 1) # => 0
1 <=> Complex(1, 0) # => 0
This method is the basis for comparisons in module Comparable.
4695 4696 4697 4698 4699 4700 4701 4702 4703 4704 4705 4706 4707 |
# File 'numeric.c', line 4695
VALUE
rb_int_cmp(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_cmp(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_cmp(x, y);
}
else {
rb_raise(rb_eNotImpError, "need to define `<=>' in %s", rb_obj_classname(x));
}
}
|
#==(other) ⇒ Boolean
Returns true
if self
is numerically equal to other
; false
otherwise.
1 == 2 #=> false
1 == 1.0 #=> true
Related: Integer#eql? (requires other
to be an Integer).
4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 |
# File 'numeric.c', line 4633
VALUE
rb_int_equal(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_equal(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_eq(x, y);
}
return Qnil;
}
|
#==(other) ⇒ Boolean
Returns true
if self
is numerically equal to other
; false
otherwise.
1 == 2 #=> false
1 == 1.0 #=> true
Related: Integer#eql? (requires other
to be an Integer).
4633 4634 4635 4636 4637 4638 4639 4640 4641 4642 4643 |
# File 'numeric.c', line 4633
VALUE
rb_int_equal(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_equal(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_eq(x, y);
}
return Qnil;
}
|
#>(other) ⇒ Boolean
Returns true
if the value of self
is greater than that of other
:
1 > 0 # => true
1 > 1 # => false
1 > 2 # => false
1 > 0.5 # => true
1 > Rational(1, 2) # => true
Raises an exception if the comparison cannot be made.
4742 4743 4744 4745 4746 4747 4748 4749 4750 4751 4752 |
# File 'numeric.c', line 4742
VALUE
rb_int_gt(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_gt(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_gt(x, y);
}
return Qnil;
}
|
#>=(real) ⇒ Boolean
Returns true
if the value of self
is greater than or equal to that of other
:
1 >= 0 # => true
1 >= 1 # => true
1 >= 2 # => false
1 >= 0.5 # => true
1 >= Rational(1, 2) # => true
Raises an exception if the comparison cannot be made.
4789 4790 4791 4792 4793 4794 4795 4796 4797 4798 4799 |
# File 'numeric.c', line 4789
VALUE
rb_int_ge(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_ge(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_ge(x, y);
}
return Qnil;
}
|
#>>(count) ⇒ Integer
Returns self
with bits shifted count
positions to the right, or to the left if count
is negative:
n = 0b11110000
"%08b" % (n >> 1) # => "01111000"
"%08b" % (n >> 3) # => "00011110"
"%08b" % (n >> -1) # => "111100000"
"%08b" % (n >> -3) # => "11110000000"
Related: Integer#<<.
5165 5166 5167 5168 5169 5170 5171 5172 5173 5174 5175 |
# File 'numeric.c', line 5165
static VALUE
rb_int_rshift(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return rb_fix_rshift(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_rshift(x, y);
}
return Qnil;
}
|
#[](offset) ⇒ 0, 1 #[](offset, size) ⇒ Integer #[](range) ⇒ Integer
Returns a slice of bits from self
.
With argument offset
, returns the bit at the given offset, where offset 0 refers to the least significant bit:
n = 0b10 # => 2
n[0] # => 0
n[1] # => 1
n[2] # => 0
n[3] # => 0
In principle, n[i]
is equivalent to (n >> i) & 1
. Thus, negative index always returns zero:
255[-1] # => 0
With arguments offset
and size
, returns size
bits from self
, beginning at offset
and including bits of greater significance:
n = 0b111000 # => 56
"%010b" % n[0, 10] # => "0000111000"
"%010b" % n[4, 10] # => "0000000011"
With argument range
, returns range.size
bits from self
, beginning at range.begin
and including bits of greater significance:
n = 0b111000 # => 56
"%010b" % n[0..9] # => "0000111000"
"%010b" % n[4..9] # => "0000000011"
Raises an exception if the slice cannot be constructed.
5326 5327 5328 5329 5330 5331 5332 5333 5334 5335 5336 |
# File 'numeric.c', line 5326
static VALUE
int_aref(int const argc, VALUE * const argv, VALUE const num)
{
rb_check_arity(argc, 1, 2);
if (argc == 2) {
return int_aref2(num, argv[0], argv[1]);
}
return int_aref1(num, argv[0]);
return Qnil;
}
|
#^(other) ⇒ Integer
Bitwise EXCLUSIVE OR; each bit in the result is 1 if the corresponding bits in self
and other
are different, 0 otherwise:
"%04b" % (0b0101 ^ 0b0110) # => "0011"
Raises an exception if other
is not an Integer.
Related: Integer#& (bitwise AND), Integer#| (bitwise OR).
5054 5055 5056 5057 5058 5059 5060 5061 5062 5063 5064 |
# File 'numeric.c', line 5054
static VALUE
int_xor(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_xor(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_xor(x, y);
}
return Qnil;
}
|
#allbits?(mask) ⇒ Boolean
Returns true
if all bits that are set (=1) in mask
are also set in self
; returns false
otherwise.
Example values:
0b1010101 self
0b1010100 mask
0b1010100 self & mask
true self.allbits?(mask)
0b1010100 self
0b1010101 mask
0b1010100 self & mask
false self.allbits?(mask)
Related: Integer#anybits?, Integer#nobits?.
3616 3617 3618 3619 3620 3621 |
# File 'numeric.c', line 3616
static VALUE
int_allbits_p(VALUE num, VALUE mask)
{
mask = rb_to_int(mask);
return rb_int_equal(rb_int_and(num, mask), mask);
}
|
#anybits?(mask) ⇒ Boolean
Returns true
if any bit that is set (=1) in mask
is also set in self
; returns false
otherwise.
Example values:
0b10000010 self
0b11111111 mask
0b10000010 self & mask
true self.anybits?(mask)
0b00000000 self
0b11111111 mask
0b00000000 self & mask
false self.anybits?(mask)
Related: Integer#allbits?, Integer#nobits?.
3646 3647 3648 3649 3650 3651 |
# File 'numeric.c', line 3646
static VALUE
int_anybits_p(VALUE num, VALUE mask)
{
mask = rb_to_int(mask);
return RBOOL(!int_zero_p(rb_int_and(num, mask)));
}
|
#ceil(ndigits = 0) ⇒ Integer
Returns the smallest number greater than or equal to self
with a precision of ndigits
decimal digits.
When the precision is negative, the returned value is an integer with at least ndigits.abs
trailing zeros:
555.ceil(-1) # => 560
555.ceil(-2) # => 600
-555.ceil(-2) # => -500
555.ceil(-3) # => 1000
Returns self
when ndigits
is zero or positive.
555.ceil # => 555
555.ceil(50) # => 555
Related: Integer#floor.
5786 5787 5788 5789 5790 5791 5792 5793 5794 5795 5796 5797 |
# File 'numeric.c', line 5786
static VALUE
int_ceil(int argc, VALUE* argv, VALUE num)
{
int ndigits;
if (!rb_check_arity(argc, 0, 1)) return num;
ndigits = NUM2INT(argv[0]);
if (ndigits >= 0) {
return num;
}
return rb_int_ceil(num, ndigits);
}
|
#chr ⇒ String #chr(encoding) ⇒ String
Returns a 1-character string containing the character represented by the value of self
, according to the given encoding
.
65.chr # => "A"
0.chr # => "\x00"
255.chr # => "\xFF"
string = 255.chr(Encoding::UTF_8)
string.encoding # => Encoding::UTF_8
Raises an exception if self
is negative.
Related: Integer#ord.
3779 3780 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 |
# File 'numeric.c', line 3779
static VALUE
int_chr(int argc, VALUE *argv, VALUE num)
{
char c;
unsigned int i;
rb_encoding *enc;
if (rb_num_to_uint(num, &i) == 0) {
}
else if (FIXNUM_P(num)) {
rb_raise(rb_eRangeError, "%ld out of char range", FIX2LONG(num));
}
else {
rb_raise(rb_eRangeError, "bignum out of char range");
}
switch (argc) {
case 0:
if (0xff < i) {
enc = rb_default_internal_encoding();
if (!enc) {
rb_raise(rb_eRangeError, "%u out of char range", i);
}
goto decode;
}
c = (char)i;
if (i < 0x80) {
return rb_usascii_str_new(&c, 1);
}
else {
return rb_str_new(&c, 1);
}
case 1:
break;
default:
rb_error_arity(argc, 0, 1);
}
enc = rb_to_encoding(argv[0]);
if (!enc) enc = rb_ascii8bit_encoding();
decode:
return rb_enc_uint_chr(i, enc);
}
|
#coerce(numeric) ⇒ Array
Returns an array with both a numeric
and a int
represented as Integer objects or Float objects.
This is achieved by converting numeric
to an Integer or a Float.
A TypeError is raised if the numeric
is not an Integer or a Float type.
(0x3FFFFFFFFFFFFFFF+1).coerce(42) #=> [42, 4611686018427387904]
6771 6772 6773 6774 6775 6776 6777 6778 6779 6780 6781 6782 |
# File 'bignum.c', line 6771
static VALUE
rb_int_coerce(VALUE x, VALUE y)
{
if (RB_INTEGER_TYPE_P(y)) {
return rb_assoc_new(y, x);
}
else {
x = rb_Float(x);
y = rb_Float(y);
return rb_assoc_new(y, x);
}
}
|
#digits(base = 10) ⇒ Object
Returns an array of integers representing the base
-radix digits of self
; the first element of the array represents the least significant digit:
12345.digits # => [5, 4, 3, 2, 1]
12345.digits(7) # => [4, 6, 6, 0, 5]
12345.digits(100) # => [45, 23, 1]
Raises an exception if self
is negative or base
is less than 2.
5526 5527 5528 5529 5530 5531 5532 5533 5534 5535 5536 5537 5538 5539 5540 5541 5542 5543 5544 5545 5546 5547 5548 5549 5550 5551 5552 5553 5554 5555 5556 5557 5558 |
# File 'numeric.c', line 5526
static VALUE
rb_int_digits(int argc, VALUE *argv, VALUE num)
{
VALUE base_value;
long base;
if (rb_num_negative_p(num))
rb_raise(rb_eMathDomainError, "out of domain");
if (rb_check_arity(argc, 0, 1)) {
base_value = rb_to_int(argv[0]);
if (!RB_INTEGER_TYPE_P(base_value))
rb_raise(rb_eTypeError, "wrong argument type %s (expected Integer)",
rb_obj_classname(argv[0]));
if (RB_BIGNUM_TYPE_P(base_value))
return rb_int_digits_bigbase(num, base_value);
base = FIX2LONG(base_value);
if (base < 0)
rb_raise(rb_eArgError, "negative radix");
else if (base < 2)
rb_raise(rb_eArgError, "invalid radix %ld", base);
}
else
base = 10;
if (FIXNUM_P(num))
return rb_fix_digits(num, base);
else if (RB_BIGNUM_TYPE_P(num))
return rb_int_digits_bigbase(num, LONG2FIX(base));
return Qnil;
}
|
#div(numeric) ⇒ Integer
Performs integer division; returns the integer result of dividing self
by numeric
:
4.div(3) # => 1
4.div(-3) # => -2
-4.div(3) # => -2
-4.div(-3) # => 1
4.div(3.0) # => 1
4.div(Rational(3, 1)) # => 1
Raises an exception if numeric
does not have method div
.
4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 |
# File 'numeric.c', line 4255
VALUE
rb_int_idiv(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_idiv(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_idiv(x, y);
}
return num_div(x, y);
}
|
#divmod(other) ⇒ Array
Returns a 2-element array [q, r]
, where
q = (self/other).floor # Quotient
r = self % other # Remainder
Examples:
11.divmod(4) # => [2, 3]
11.divmod(-4) # => [-3, -1]
-11.divmod(4) # => [-3, 1]
-11.divmod(-4) # => [2, -3]
12.divmod(4) # => [3, 0]
12.divmod(-4) # => [-3, 0]
-12.divmod(4) # => [-3, 0]
-12.divmod(-4) # => [3, 0]
13.divmod(4.0) # => [3, 1.0]
13.divmod(Rational(4, 1)) # => [3, (1/1)]
4425 4426 4427 4428 4429 4430 4431 4432 4433 4434 4435 |
# File 'numeric.c', line 4425
VALUE
rb_int_divmod(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_divmod(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_divmod(x, y);
}
return Qnil;
}
|
#downto(limit) {|i| ... } ⇒ self #downto(limit) ⇒ Object
Calls the given block with each integer value from self
down to limit
; returns self
:
a = []
10.downto(5) {|i| a << i } # => 10
a # => [10, 9, 8, 7, 6, 5]
a = []
0.downto(-5) {|i| a << i } # => 0
a # => [0, -1, -2, -3, -4, -5]
4.downto(5) {|i| fail 'Cannot happen' } # => 4
With no block given, returns an Enumerator.
5636 5637 5638 5639 5640 5641 5642 5643 5644 5645 5646 5647 5648 5649 5650 5651 5652 5653 5654 5655 5656 5657 5658 |
# File 'numeric.c', line 5636
static VALUE
int_downto(VALUE from, VALUE to)
{
RETURN_SIZED_ENUMERATOR(from, 1, &to, int_downto_size);
if (FIXNUM_P(from) && FIXNUM_P(to)) {
long i, end;
end = FIX2LONG(to);
for (i=FIX2LONG(from); i >= end; i--) {
rb_yield(LONG2FIX(i));
}
}
else {
VALUE i = from, c;
while (!(c = rb_funcall(i, '<', 1, to))) {
rb_yield(i);
i = rb_funcall(i, '-', 1, INT2FIX(1));
}
if (NIL_P(c)) rb_cmperr(i, to);
}
return from;
}
|
#fdiv(numeric) ⇒ Float
Returns the Float result of dividing self
by numeric
:
4.fdiv(2) # => 2.0
4.fdiv(-2) # => -2.0
-4.fdiv(2) # => -2.0
4.fdiv(2.0) # => 2.0
4.fdiv(Rational(3, 4)) # => 5.333333333333333
Raises an exception if numeric
cannot be converted to a Float.
4154 4155 4156 4157 4158 4159 4160 4161 |
# File 'numeric.c', line 4154
VALUE
rb_int_fdiv(VALUE x, VALUE y)
{
if (RB_INTEGER_TYPE_P(x)) {
return DBL2NUM(rb_int_fdiv_double(x, y));
}
return Qnil;
}
|
#floor(ndigits = 0) ⇒ Integer
Returns the largest number less than or equal to self
with a precision of ndigits
decimal digits.
When ndigits
is negative, the returned value has at least ndigits.abs
trailing zeros:
555.floor(-1) # => 550
555.floor(-2) # => 500
-555.floor(-2) # => -600
555.floor(-3) # => 0
Returns self
when ndigits
is zero or positive.
555.floor # => 555
555.floor(50) # => 555
Related: Integer#ceil.
5749 5750 5751 5752 5753 5754 5755 5756 5757 5758 5759 5760 |
# File 'numeric.c', line 5749
static VALUE
int_floor(int argc, VALUE* argv, VALUE num)
{
int ndigits;
if (!rb_check_arity(argc, 0, 1)) return num;
ndigits = NUM2INT(argv[0]);
if (ndigits >= 0) {
return num;
}
return rb_int_floor(num, ndigits);
}
|
#gcd(other_int) ⇒ Integer
Returns the greatest common divisor of the two integers. The result is always positive. 0.gcd(x) and x.gcd(0) return x.abs.
36.gcd(60) #=> 12
2.gcd(2) #=> 2
3.gcd(-7) #=> 1
((1<<31)-1).gcd((1<<61)-1) #=> 1
1909 1910 1911 1912 1913 1914 |
# File 'rational.c', line 1909
VALUE
rb_gcd(VALUE self, VALUE other)
{
other = nurat_int_value(other);
return f_gcd(self, other);
}
|
#gcdlcm(other_int) ⇒ Array
Returns an array with the greatest common divisor and the least common multiple of the two integers, [gcd, lcm].
36.gcdlcm(60) #=> [12, 180]
2.gcdlcm(2) #=> [2, 2]
3.gcdlcm(-7) #=> [1, 21]
((1<<31)-1).gcdlcm((1<<61)-1) #=> [1, 4951760154835678088235319297]
1947 1948 1949 1950 1951 1952 |
# File 'rational.c', line 1947
VALUE
rb_gcdlcm(VALUE self, VALUE other)
{
other = nurat_int_value(other);
return rb_assoc_new(f_gcd(self, other), f_lcm(self, other));
}
|
#lcm(other_int) ⇒ Integer
Returns the least common multiple of the two integers. The result is always positive. 0.lcm(x) and x.lcm(0) return zero.
36.lcm(60) #=> 180
2.lcm(2) #=> 2
3.lcm(-7) #=> 21
((1<<31)-1).lcm((1<<61)-1) #=> 4951760154835678088235319297
1928 1929 1930 1931 1932 1933 |
# File 'rational.c', line 1928
VALUE
rb_lcm(VALUE self, VALUE other)
{
other = nurat_int_value(other);
return f_lcm(self, other);
}
|
#%(other) ⇒ Object
Returns self
modulo other
as a real number.
For integer n
and real number r
, these expressions are equivalent:
n % r
n-r*(n/r).floor
n.divmod(r)[1]
See Numeric#divmod.
Examples:
10 % 2 # => 0
10 % 3 # => 1
10 % 4 # => 2
10 % -2 # => 0
10 % -3 # => -2
10 % -4 # => -2
10 % 3.0 # => 1.0
10 % Rational(3, 1) # => (1/1)
4314 4315 4316 4317 4318 4319 4320 4321 4322 4323 4324 |
# File 'numeric.c', line 4314
VALUE
rb_int_modulo(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_mod(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_modulo(x, y);
}
return num_modulo(x, y);
}
|
#next ⇒ Object
#nobits?(mask) ⇒ Boolean
Returns true
if no bit that is set (=1) in mask
is also set in self
; returns false
otherwise.
Example values:
0b11110000 self
0b00001111 mask
0b00000000 self & mask
true self.nobits?(mask)
0b00000001 self
0b11111111 mask
0b00000001 self & mask
false self.nobits?(mask)
Related: Integer#allbits?, Integer#anybits?.
3676 3677 3678 3679 3680 3681 |
# File 'numeric.c', line 3676
static VALUE
int_nobits_p(VALUE num, VALUE mask)
{
mask = rb_to_int(mask);
return RBOOL(int_zero_p(rb_int_and(num, mask)));
}
|
#pow(numeric) ⇒ Numeric #pow(integer, integer) ⇒ Integer
Returns (modular) exponentiation as:
a.pow(b) #=> same as a**b
a.pow(b, m) #=> same as (a**b) % m, but avoids huge temporary values
7128 7129 7130 7131 7132 7133 7134 7135 7136 7137 7138 7139 7140 7141 7142 7143 7144 7145 7146 7147 7148 7149 7150 7151 7152 7153 7154 7155 7156 7157 7158 7159 7160 7161 7162 7163 7164 7165 7166 7167 7168 7169 7170 7171 7172 7173 7174 7175 |
# File 'bignum.c', line 7128
VALUE
rb_int_powm(int const argc, VALUE * const argv, VALUE const num)
{
rb_check_arity(argc, 1, 2);
if (argc == 1) {
return rb_int_pow(num, argv[0]);
}
else {
VALUE const a = num;
VALUE const b = argv[0];
VALUE m = argv[1];
int nega_flg = 0;
if ( ! RB_INTEGER_TYPE_P(b)) {
rb_raise(rb_eTypeError, "Integer#pow() 2nd argument not allowed unless a 1st argument is integer");
}
if (rb_int_negative_p(b)) {
rb_raise(rb_eRangeError, "Integer#pow() 1st argument cannot be negative when 2nd argument specified");
}
if (!RB_INTEGER_TYPE_P(m)) {
rb_raise(rb_eTypeError, "Integer#pow() 2nd argument not allowed unless all arguments are integers");
}
if (rb_int_negative_p(m)) {
m = rb_int_uminus(m);
nega_flg = 1;
}
if (FIXNUM_P(m)) {
long const half_val = (long)HALF_LONG_MSB;
long const mm = FIX2LONG(m);
if (!mm) rb_num_zerodiv();
if (mm == 1) return INT2FIX(0);
if (mm <= half_val) {
return int_pow_tmp1(rb_int_modulo(a, m), b, mm, nega_flg);
}
else {
return int_pow_tmp2(rb_int_modulo(a, m), b, mm, nega_flg);
}
}
else {
if (rb_bigzero_p(m)) rb_num_zerodiv();
if (bignorm(m) == INT2FIX(1)) return INT2FIX(0);
return int_pow_tmp3(rb_int_modulo(a, m), b, m, nega_flg);
}
}
UNREACHABLE_RETURN(Qnil);
}
|
#pred ⇒ Object
#rationalize([eps]) ⇒ Object
Returns the value as a rational. The optional argument eps
is always ignored.
2160 2161 2162 2163 2164 2165 |
# File 'rational.c', line 2160
static VALUE
integer_rationalize(int argc, VALUE *argv, VALUE self)
{
rb_check_arity(argc, 0, 1);
return integer_to_r(self);
}
|
#remainder(other) ⇒ Object
Returns the remainder after dividing self
by other
.
Examples:
11.remainder(4) # => 3
11.remainder(-4) # => 3
-11.remainder(4) # => -3
-11.remainder(-4) # => -3
12.remainder(4) # => 0
12.remainder(-4) # => 0
-12.remainder(4) # => 0
-12.remainder(-4) # => 0
13.remainder(4.0) # => 1.0
13.remainder(Rational(4, 1)) # => (1/1)
4349 4350 4351 4352 4353 4354 4355 4356 4357 4358 4359 4360 4361 4362 4363 4364 4365 4366 4367 4368 4369 |
# File 'numeric.c', line 4349
static VALUE
int_remainder(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
if (FIXNUM_P(y)) {
VALUE z = fix_mod(x, y);
assert(FIXNUM_P(z));
if (z != INT2FIX(0) && (SIGNED_VALUE)(x ^ y) < 0)
z = fix_minus(z, y);
return z;
}
else if (!RB_BIGNUM_TYPE_P(y)) {
return num_remainder(x, y);
}
x = rb_int2big(FIX2LONG(x));
}
else if (!RB_BIGNUM_TYPE_P(x)) {
return Qnil;
}
return rb_big_remainder(x, y);
}
|
#round(ndigits = 0, half: :up) ⇒ Integer
Returns self
rounded to the nearest value with a precision of ndigits
decimal digits.
When ndigits
is negative, the returned value has at least ndigits.abs
trailing zeros:
555.round(-1) # => 560
555.round(-2) # => 600
555.round(-3) # => 1000
-555.round(-2) # => -600
555.round(-4) # => 0
Returns self
when ndigits
is zero or positive.
555.round # => 555
555.round(1) # => 555
555.round(50) # => 555
If keyword argument half
is given, and self
is equidistant from the two candidate values, the rounding is according to the given half
value:
-
:up
ornil
: round away from zero:25.round(-1, half: :up) # => 30 (-25).round(-1, half: :up) # => -30
-
:down
: round toward zero:25.round(-1, half: :down) # => 20 (-25).round(-1, half: :down) # => -20
-
:even
: round toward the candidate whose last nonzero digit is even:25.round(-1, half: :even) # => 20 15.round(-1, half: :even) # => 20 (-25).round(-1, half: :even) # => -20
Raises and exception if the value for half
is invalid.
Related: Integer#truncate.
5709 5710 5711 5712 5713 5714 5715 5716 5717 5718 5719 5720 5721 5722 5723 |
# File 'numeric.c', line 5709
static VALUE
int_round(int argc, VALUE* argv, VALUE num)
{
int ndigits;
int mode;
VALUE nd, opt;
if (!rb_scan_args(argc, argv, "01:", &nd, &opt)) return num;
ndigits = NUM2INT(nd);
mode = rb_num_get_rounding_option(opt);
if (ndigits >= 0) {
return num;
}
return rb_int_round(num, ndigits, mode);
}
|
#succ ⇒ Object
#to_f ⇒ Float
Converts self
to a Float:
1.to_f # => 1.0
-1.to_f # => -1.0
If the value of self
does not fit in a Float, the result is infinity:
(10**400).to_f # => Infinity
(-10**400).to_f # => -Infinity
5355 5356 5357 5358 5359 5360 5361 5362 5363 5364 5365 5366 5367 5368 5369 5370 5371 |
# File 'numeric.c', line 5355
static VALUE
int_to_f(VALUE num)
{
double val;
if (FIXNUM_P(num)) {
val = (double)FIX2LONG(num);
}
else if (RB_BIGNUM_TYPE_P(num)) {
val = rb_big2dbl(num);
}
else {
rb_raise(rb_eNotImpError, "Unknown subclass for to_f: %s", rb_obj_classname(num));
}
return DBL2NUM(val);
}
|
#to_r ⇒ Object
Returns the value as a rational.
1.to_r #=> (1/1)
(1<<64).to_r #=> (18446744073709551616/1)
2147 2148 2149 2150 2151 |
# File 'rational.c', line 2147
static VALUE
integer_to_r(VALUE self)
{
return rb_rational_new1(self);
}
|
#to_s(base = 10) ⇒ String Also known as: inspect
Returns a string containing the place-value representation of self
in radix base
(in 2..36).
12345.to_s # => "12345"
12345.to_s(2) # => "11000000111001"
12345.to_s(8) # => "30071"
12345.to_s(10) # => "12345"
12345.to_s(16) # => "3039"
12345.to_s(36) # => "9ix"
78546939656932.to_s(36) # => "rubyrules"
Raises an exception if base
is out of range.
3916 3917 3918 3919 3920 3921 3922 3923 3924 3925 3926 |
# File 'numeric.c', line 3916
VALUE
rb_int_to_s(int argc, VALUE *argv, VALUE x)
{
int base;
if (rb_check_arity(argc, 0, 1))
base = NUM2INT(argv[0]);
else
base = 10;
return rb_int2str(x, base);
}
|
#truncate(ndigits = 0) ⇒ Integer
Returns self
truncated (toward zero) to a precision of ndigits
decimal digits.
When ndigits
is negative, the returned value has at least ndigits.abs
trailing zeros:
555.truncate(-1) # => 550
555.truncate(-2) # => 500
-555.truncate(-2) # => -500
Returns self
when ndigits
is zero or positive.
555.truncate # => 555
555.truncate(50) # => 555
Related: Integer#round.
5822 5823 5824 5825 5826 5827 5828 5829 5830 5831 5832 5833 |
# File 'numeric.c', line 5822
static VALUE
int_truncate(int argc, VALUE* argv, VALUE num)
{
int ndigits;
if (!rb_check_arity(argc, 0, 1)) return num;
ndigits = NUM2INT(argv[0]);
if (ndigits >= 0) {
return num;
}
return rb_int_truncate(num, ndigits);
}
|
#upto(limit) {|i| ... } ⇒ self #upto(limit) ⇒ Object
Calls the given block with each integer value from self
up to limit
; returns self
:
a = []
5.upto(10) {|i| a << i } # => 5
a # => [5, 6, 7, 8, 9, 10]
a = []
-5.upto(0) {|i| a << i } # => -5
a # => [-5, -4, -3, -2, -1, 0]
5.upto(4) {|i| fail 'Cannot happen' } # => 5
With no block given, returns an Enumerator.
5586 5587 5588 5589 5590 5591 5592 5593 5594 5595 5596 5597 5598 5599 5600 5601 5602 5603 5604 5605 5606 5607 5608 |
# File 'numeric.c', line 5586
static VALUE
int_upto(VALUE from, VALUE to)
{
RETURN_SIZED_ENUMERATOR(from, 1, &to, int_upto_size);
if (FIXNUM_P(from) && FIXNUM_P(to)) {
long i, end;
end = FIX2LONG(to);
for (i = FIX2LONG(from); i <= end; i++) {
rb_yield(LONG2FIX(i));
}
}
else {
VALUE i = from, c;
while (!(c = rb_funcall(i, '>', 1, to))) {
rb_yield(i);
i = rb_funcall(i, '+', 1, INT2FIX(1));
}
ensure_cmp(c, i, to);
}
return from;
}
|
#|(other) ⇒ Integer
Bitwise OR; each bit in the result is 1 if either corresponding bit in self
or other
is 1, 0 otherwise:
"%04b" % (0b0101 | 0b0110) # => "0111"
Raises an exception if other
is not an Integer.
Related: Integer#& (bitwise AND), Integer#^ (bitwise EXCLUSIVE OR).
5012 5013 5014 5015 5016 5017 5018 5019 5020 5021 5022 |
# File 'numeric.c', line 5012
static VALUE
int_or(VALUE x, VALUE y)
{
if (FIXNUM_P(x)) {
return fix_or(x, y);
}
else if (RB_BIGNUM_TYPE_P(x)) {
return rb_big_or(x, y);
}
return Qnil;
}
|