上京エンジニアの葛藤

都会に染まる日々

「初めてのRuby」を読んだ(3章)

引き続き、初めての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 の数字を演算で例外が発生するのは意外に感じたぐらい