引き続き、初めてのRuby 3章「数値」を読んだのでまとめていきます
また前回の2章「配列とハッシュ」をまとめた記事です
okkun-sh.hatenablog.com
今回は「数値」ということでページ数もそんなに多くなく約10ページほどなので、さらっとまとめます
Ruby における数値
組み込みで多倍長整数をサポートしており、整数(Integer)オブジェクトと浮動小数点数(Float)オブジェクトに分けられている
123 # 123 1_2_3 # 123
リテラルと基数について
先頭記号 | 基数 |
---|---|
0x or 0X | 16進数 |
0d or 0D or 無し | 10進数 |
0o or 0O or 0 | 8進数 |
0b or 0B | 2進数 |
0xFFFFFF # 16777215 0d123 # 123 0o17 # 15 0b1010 # 10
Fixnum と Bignum について
Ruby の整数は Integer ではなく FIxnum または Bignum クラスのインスタンスで自動的に使い分けられるため特段気にする必要はない
Fixnum は内部的に固定長で、小さな整数を効率的に処理できる
Bignum は多倍長整数で、任意に大きな整数を表すことができる
浮動小数点リテラル
Float クラスのインスタンスで、実装は C言語の double である
0.1 1.0
様々な精度を表す定数
Float::DIG # 15 Float::MAX # 1.7976931348623157e+308 Float::MIN # 2.2250738585072014e-308 Float::RADIX # 2
特殊な浮動小数点値
- 正の無限大
どのような値よりも大きい
Float::INFINITY
- 負の無限大
どのような値よりも小さい
-Float::INFINITY
- 非数
どのような値とも等しくなく、自分自身とも同値ではない
Float::NAN
数値演算
組み込みの演算子が対応してるのは、加減乗除、及び余剰、べき乗、符号操作
また 1+1
は、1.+(1)
というシンタックスシュガーで、実装は Integer#+ にされている
除算
除算演算子 /
の両辺が Integer オブジェクトの場合、整除を行うが一方が Float オブジェクトの場合、実数除算が行われる
7/2 # 3 整除 7.0/2 # 3.5 実数除算 7/0 # ZeroDivisionError ゼロ除算例外 7.0/0 # Infinity
例の通り整除で除数が0の場合 ZeroDivisionError の例外が発生する
実数除算で除数が0の場合、被除数が負、ゼロ、正の時はそれぞれ負の無限大、非数、正の無限大が返ってくる
型と自動変換
文字列が自動的に数値型になることはない
1+"1" # TypeError (String can't be coerced into Integer) 1+"2".to_i # 2
比較
数値クラスは大小関係が定義されており、様々な演算子で比較することができる
宇宙船演算子
<=>
宇宙船に似てることからそう呼ばれていおり、sort メソッドなどで使用する
左辺が右辺よりも小さければ負の数、等しければ 0 、大きければ 1 を返す
1<=>2 # -1 1<=>1 # 0 2<=>1 # 1
数学関数
Math モジュールに定義されていて様々な数学関数を扱える
module Math (Ruby 2.6.0)
モジュールを include
することで Math.
というスコープを解決することができるが log
メソッドなど名前が衝突する恐れがある
ビット演算
整数に対するビット演算をサポートしている
整数オブジェクトは immutable なため代入することはできない
感想
Integer と String の数字を演算で例外が発生するのは意外に感じたぐらい