Numeric, Integer, Fixnum, Bignum, Float, Rational, Complex 数値
Fixnum と Bignum
2.3までは
(10 ** 18).class #=> Fixnum # 固定長整数
(10 ** 24).class #=> Bignum # 可変長整数
と、なっていた。大きい数字は自動的にBignumになっていた
しかし2.4からIntegerに統一された
(10 ** 18).class #=> Integer
(10 ** 24).class #=> Integer
とりあえず適当にクラスツリー
2.1
Object
Numeric
Integer
Fixnum
Rational (この2つがFixnumの下にあるのは資料のミスかもしれない)
Complex
Bignum
Float
2.4
Object
Numeric
Integer
Float
Rational
Complex
Numericクラス
- 数値を表す抽象クラス
- 他の数値クラスはみんなこのクラスを継承している
- 整数はInteger(Fixnum, Bignum)
- 1.9からComplex(複素数), Rational(有理数)を扱うクラスが組み込みクラスとなった
- 浮動小数点はFloat、計算過程で誤差が発生するので注意
- シフト演算やビット演算のように少数では処理できない演算はFloatクラスへは実装されていない(当然)
数値の切り捨て、切り上げ
これは・・・暗記しろって言うんですか?
ceil | 自分以上の整数の内、最小のもの | プラスの方向の次の整数 |
floor | 自分以下の整数の内、最大のもの | マイナスの方向の次の整数 |
round | 自分に近い整数 | 小数点以下を四捨五入 |
truncate | 0に近い整数 | ばっさり切り捨て |
数値の絶対値
-5.abs
#=> 5
数値を使った繰り返し、イテレータ
- step
- upto
- downto
- times
- 他にも
こんな感じになる
1.5.step(10, 3.3) { |c| p c } => 1.5, 4.8, 8.1
3.times { |c| p c } => 0, 1, 2
4.upto(8) { |c| p c } => 4, 5, 6, 7, 8
Integerクラス
べき乗
2 ** 10
#=> 1024
除算
整数同士の除算は戻り値も除算になる。事を忘れないように
10 / 3
#=> 3
10 / 3.0
#=> 3.3333333333333335
10.0 / 3
#=> 3.3333333333333335
文字コードに対応する文字を取得
- 引数にてエンコーディングを指定する
- 引数が省略された場合には US-ASCII、ASCII-8BIT、デフォルト内部エンコーディングの順に解釈する
67.chr(Encoding::US_ASCII)
#=> "C"
67.chr('US-ASCII')
#=> "C"
22234.chr(Encoding::UTF_8)
=> "囚"
22234.chr('UTF-8')
=> "囚"
67.chr
#=> "C"
299.chr
RangeError: 299 out of char range
次の整数、前の整数
普通に考えれば使わないメソッドではあるが、関数型プログラミングとかで使うんじゃないかな
- 次の整数 next(succ) ※ successor == 後継者
- 前の整数 pred ※ predecessor == 前任者
10.next
=> 11
10.succ
=> 11
10.pred
=> 9
剰余
10 % 3
#=> 1
10.modulo(3) # モジュロ、余剰演算
#=> 1
2.5 % 0.8
#=> 0.09999999999999987 # おお、誤差は出たけどFloatでもイケるんだね
ビット演算
| | 論理和 |
& | 論理積 |
^ | 排他的論理和 |
~ | 否定 |
« | 左シフト |
» | 右シフト |
10 | 3
#=> 11
これだけじゃ、なんのこっちゃですね、2進数に直してビット毎に和とか積とかを取って、10進数にまた変えるような感じでイメージすればいいと思います
0b1010
#=> 10
0b0011
#=>3
0b1010 |
0b0011
#=> 11
(0b1010 |
0b0011).to_s(2)
#=>1011
(0b1010 &
0b0011).to_s(2)
#=> 10
(0b1010 ^
0b0011).to_s(2)
#=>1001
10 << 1
#=> 20
10 >> 1
#=> 5
整数の小数化
10.to_f
#=> 10.0
Complexクラス
- 複素数とは
- ぐぐれ
- 実部aと虚部bからなり、a+biで表すことが出来る数の事です iは虚数です ハイ
インスタンスを作る
お、おう
Complex(1, 2)
#=> (1+2i)
複素数リテラル
まかせろ
5i
#=> (0+5i)
複素数の実部と虚部の取得
real | 実部 | |
imaginary | 虚部 | imaginary == 虚 |
Complex(1, 2).real
#=> 1
Complex(1, 2).imaginary
#=> 2
ちなみにIntegerとかでも、ちゃんとこのメソッドは動く
5.real
#=> 5
5.imaginary
#=> 0
1.5.real
#=> 1.5
1.5.imaginary
#=> 0
複素数から極座標への変換
- 複素数は x + yi の形で表現できる
- x軸を実軸、y軸を虚軸とした二次元の座標で表現することができる
- これを複素平面またはガウス平面と呼ぶ
- そのため複素数は見方を変えると絶対値Γと偏角Θで表現できる・・らしい
-
この(Γ, Θ)を極座標と呼びます・・らしいです ハイ
- この絶対値(「この」が何を指しているのかは判らない)を返すのがabsメソッド
- 偏角を返すのがargメソッド
- 両方いっぺんに返すのがpolarメソッド
Complex(1, 3).abs
#=> 3.1622776601683795
Complex(1, 3).arg
#=> 1.2490457723982544
Complex(1, 3).polar
#=> [3.1622776601683795, 1.2490457723982544]
Complexクラスと他のNumericクラスの四則演算
問題なくできます。問題なく計算できているか確認できないです ハイ。 戻り値もComplexクラスのインスタンスとなります
Complex(1, 1) + 0.5
=> (1.5+1i)
Rationalクラス
- 有理数とは
- ぐぐれ
- 2つの整数を用いて、分数にて表現できる数の事です
インスタンスを作る
お、おう
Rational(1, 4)
=> (1/4)
有理数リテラル
まかせろ
1/4r
=> (1/4)
1r/4
=> (1/4)
有理数の分母と分子の取得
denominator | 分母 |
numerator | 分子 |
Rational(1, 4).denominator
=> 4
Rational(1, 4).numerator
=> 1
ちなみにIntegerとかでも、ちゃんとこのメソッドは動く
5.denominator
#=> 1
5.numerator
#=> 5
1.5.denominator
#=> 2
1.5.numerator
#=> 3
divmodとかabsとかfloorとかceilとかroundとかtruncateとか
ちゃんと動きます
Complexクラスと他のNumericクラスの四則演算
- 問題なくできます
- 演算対象がFloatの場合は戻り値がFloatになります
Rational(1, 2) + Rational(1, 3)
#=> (5/6)
Rational(1, 2) + 1
#=> (3/2)
Rational(1, 2) + 0.25
#=> 0.75
Rational(1, 2) * 4
#=> (2/1)