:pぴー.sendせんど(:pぴー, :pぴー)

mokoaki
mokoriso@gmail.com

2017/07/22

Numeric, Integer, Fixnum, Bignum, Float, Rational, Complex 数値

Ruby技術者認定試験の書籍写経メモ

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クラス

数値の切り捨て、切り上げ

これは・・・暗記しろって言うんですか?

ceil 自分以上の整数の内、最小のもの プラスの方向の次の整数
floor 自分以下の整数の内、最大のもの マイナスの方向の次の整数
round 自分に近い整数 小数点以下を四捨五入
truncate 0に近い整数 ばっさり切り捨て

数値の絶対値

-5.abs
#=> 5

数値を使った繰り返し、イテレータ

こんな感じになる

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

文字コードに対応する文字を取得

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

次の整数、前の整数

普通に考えれば使わないメソッドではあるが、関数型プログラミングとかで使うんじゃないかな

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クラス

インスタンスを作る

お、おう

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

複素数から極座標への変換

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クラス

インスタンスを作る

お、おう

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クラスの四則演算

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)