In the figure the class hierarchy of the numeric classes; some methods of the classes are listed in the figure.
The classes for numbers are: Float, Complex, Integer, Rational; there are two subclass of Integer: Bignum and Fixnum; Bignum are numbers with an arbitrary number of digits; Fixnum are 8 bytes long integers, (but different platform can have different lengths); conversion between Bignum and Fixnum is automatically managed by Ruby: when a number is less than about 4E9 it's a Fixnum, otherwise it is a Bignum. Integer numbers can be built with the Integer method, converting its argument to an integer. Integers can also be expressed in hexadecimal, octal or binary form:
0x is the prefix for hexadecimal representations
0b is the prefix prefix for binary representation
0 is the prefix prefix for octal representation
Floats are double precision , always a digit is needed before and after the point: ".1" or "1." are not valid float numbers. "e" or "E" is before the (optional) exponent. Float numbers can be built with the Float method, converting its argument to a float number.
There are two special values for floats: "infinite" and "nan", to deal with float division by zero, but integer division by zero raises the exception: ZeroDivisionError
0.0/0.0 => NaN 1.0/0.0 => Infinity 0/0 => ZeroDivisionError: ....
Rational numbers are the ratio of two integers, used to express periodic numbers without a loss of precision. Complex numbers are printed as sum of a real and an imaginary part. Es.: (2+5i) .
Rational and complex have some specific methods and can be built with the "Rational and Complex methods:
Complex(1) => (1+0i)
Complex(2, 3) => (2+3i)
Complex(0.3) => (0.3+0i)
Complex('0.3-0.5i') => (0.3-0.5i)
Complex(2, 3).real => 2 # real part
Complex(2, 3).imag => 3 # imaginary part)
Complex(2, 3).conj => (2-3i)
Complex(0,1).phase => 1.5707963267948966 # radians
Complex(0,1).polar => [1, 1.5707963267948966] # modulus, phase
Complex(0,1).rect => [0, 1] # Array with real and imaginary parts
a=Rational("1/2")
a=1.quo(5) # division between integers that gives a rational number
Rational(1) => (1/1)
Rational(2, 3) => (2/3)
Rational(4, -6) => (-2/3)
Rational('0.3') => (3/10)
Rational('2/3') => (2/3)
Rational('0.5') => (1/2)
(Rational(3,2)).numerator => 3
(Rational(3,2)).denominator => 2
(Rational(3,2)).truncate => 1
(Rational(3,2)).round => 2
Underscores can be used inside numbers to separate digits:
a=1_000_000 => 1000000 b=2_000.0_1 => 2000.01
All numerical operators are implemented as methods of the Numeric class: for this reason a function-like notation is legal for operators: "1.+(2)" can be used, and returns the number 3, as: "1+2".
The comparison operators: < ; > ; <= ; >=, == ; between? are implemented in the Comparable module; each numeric class implements in a different way only the operator: <=> (sometimes named: spaceship operator); the Comparable operators use the <=> operator of the specific class to give results. This mechanism is similar to the use virtual functions of the C++ language.
In the following table the most used methods of Numerics are included, also those which apply only to some subclasses of Numerics.
| Operator | Function | Examples |
|---|---|---|
| ** ; pow(x,y) | power | a**3 |
| * / | Multiplication,division | a*b ; 3*2 => 6 ; 3/2=1 |
| % | Remainder | 5/2. => 1.0 |
| + - | Addition, subtraction | a+b ; 2+5 => 7 |
| << >> | bitwise shift | 4<<1 => 8 |
| & | ^ | bitwise and, or, xor | |
| <=> | comparisons, returns: -1, 0 , 1 ; if less, equal greater | |
| < > <= >= | comparisons | 4<1=> false |
| between? | inclusion in a range | 2.between?(1,4) => true |
| == != | equal, not equal | |
| zero? | true if zero | 3.2.zero? => false |
| eql? | same value AND type | 1.0.eql? 1 => false |
| equal? | reference equality: if a is the same object as b: a.equal?(b) => true | |
| abs ; magnitude | Absolute value | -1.abs => 1 |
| abs2 | square modulus | -2.abs2 => 4 |
| ceil | minimum greater integer | 1.2.ceil => 2 ; -1.2.ceil => -1 |
| floor | maximum lower integer | 1.7.floor =>1 ; -1.2.floor =>-2 |
| round | rounds a number | 1.4.round => 1 ; 1.5.round => 2 |
| div | integer division | 5.2.div(2.0) => 2 |
| divmod | quotient and remainder | 5.divmod(2) => Array :[2, 1] |
| fdiv | float division | 3.fdiv(2) => 1.5 |
| quo | division with maximum precision (Rational numbers if integer operands) | |
| even? | true if even | 2.even? => true |
| odd? | true if odd | 3.odd? => true |
| next ; succ | next integer | 1.next => 2 |
| pred | previous integer | 2.pred =>1 |
| gcd | greatest common denominator | 10.gcd(15) => 5 |
| lcm | lowest common multiple | 10.lcm 15 => 30 |
| finite? | true if finite | (1.0/0.0).finite? => false |
| infinite? | test if infinite | (-1.0/0.0).infinite? => -1 |
| nan? | test if not a number | (0.0/0.0).nan? => true |
**to_s** # converts to string, for fixmum the argument is the base, es.:
16.to_s => "16" ;
16.to_s(2) => "10000" ;
16.to_s(16) => "10"
**to_i** # converts to integer;
**to_f** # converts to float;
**to_r** # converts to rational
The subscript operator "[]" can be used for Fixnum, and returns single bits of a number:
2[0] => 0 2[1] => 1 3[0] => 1 3[1] => 1 3[2] => 0
In the following some operators are listed, ordered by precedence (high to low precedence):
[ ] [ ]= ** ! ~ + - (unary operators) * / % + - >> << & ^ | <= < > >= <=> == === != =~ !~ && || .. ... ?: = %= /= -= += |= &= >>= <<= *= &&= ||= **= ^= not or and if unless while until begin/end