RubyではFixnumクラスとBignumクラスで整数値を、Floatクラスで浮動小数点を扱うことができます。

またMathモジュールでは三角関数や対数などを計算する関数が提供されます。

Fixnumは31ビットまたは63ビットの固定長整数を扱うクラスですが、演算結果をこの範囲を超える場合、自動的にBignumに拡張されます。

Bignumは無限多倍長整数でメモリの許す限りの大きな値を扱うことができます。

数値関連のクラス階層を以下に示します。

 Numeric --+-- Float
                  +-- Integer --+-- Bignum
                  +-- Fixnum

2進数・8進数・16進数で数値を扱うには

2進数、8進数、16進数は以下のように記述します。

 p 0b10000 #=> 16
 p 020 #=> 16
 p 0x10 #=> 16

数値を2進数・8進数・16進数表現の文字列に変換するには

to_sメソッド、String#%メソッド、または組み込み関数のsprintf、formatを使うと数値を2進数、8進数、16進数表現の文字列に変換することができます。

 s = 255.to_s(2) #=> "11111111"
 s = "%b"  % 255 #=> "11111111"
 s = sprintf("%o", 255) #=> "377"
 s = format("%x", 255) #=> "ff"

任意のビット位置の値を参照する

任意のビット位置の値を参照するにはInteger#[]メソッドを使用し、パラメタには参照するビット位置を指定します。ビット位置はLSBからの数えた値です。

 i = 0x10
 
 p i[0] #=> 0
 p i[4] #=> 1

除算の商と余りを求める

余りを求める場合Integer#%メソッド、商と余りを同時に求める場合はInteger#divmodメソッドを使用します。Integer#divmodメソッドは商と余りを配列で返します。

 i = 10
 
 p i % 3 #=> 1
 p i.divmod(3) #=> [3, 1]

絶対値を求める

絶対値を求めるにはNumeric#absメソッドを使用します。

 i = -5
 p i.abs #=> 5
 
 i=100
 p i.abs #=> 100

小数点を切り上げ・切り捨て・四捨五入するには

切り上げはNumeric#ceilメソッド、切り捨てはNumeric#truncateメソッド、四捨五入はNumeric#roundメソッドを使用します。

 f = 3.4
 p f.ceil #=> 4
 p f.truncate #=> 3
 p f.round #=> 3
 
 f = 3.5
 p f.round #=> 4

三角関数を計算する

三角関数を計算するための関数はMathモジュールで提供されており、以下のように使用します。円周率の値はMath::PIとして定義されています。

 p Math.sin(Math::PI/2) #=> 1.0
 p Math.cos(0) #=> 1.0
 p Math.tan(0) #=> 0.0

Mathモジュールをincludeして使う方法もあります。

 p sin(PI/2) #=> 1.0

対数を計算する

対数を計算するための関数はMathモジュールで提供されており、以下のように使用します。

 p Math::log(Math::E) #=> 1.0
 p Math::log10(10) #=> 1.0

Math::logは自然対数、Math::log10は常用対数を計算するためのメソッドです。また、自然対数の底はMath::Eという定数で定義されています。

平方根を求める

Math::sqrtメソッドにより平方根を求めることができます。

 p Math::sqrt(100) #=> 10.0
 p Math::sqrt(10) #=> 3.16227766

擬似乱数を生成する

擬似乱数を生成するには,組み込み関数のrand,または Random クラスを使用します。

組み込み関数

2以上の引数を与えた場合、0からその値未満までの整数を返し、引数を省略,または 0以上1 未満の値を与えた場合は0以上1未満の実数で乱数を返します。

 p rand      #=> 0.8955039968 (for example)
 p rand(0.1) #=> 0.8955039968 (for example) このケースでも上と同じです。
 p rand(100) #=> 17 (for example)

Random クラス

Ruby 1.9.3 以降ではメルセンヌツイスター(MT)による擬似乱数生成アルゴリズムが Random クラスとして導入されました。

高速でメモリ効率が高く,しかも長周期, 高次元均等分布という数学的に優れたアルゴリズムなので,こちらの利用を推奨します。

単に rand の前に Random を付けるだけで,上と同じように使えます。

 Random.rand  #=> 0.2955039968 (for example)

0.0 以上 1.0 未満の実数を返します。

 Random.rand(max)  Integer | Float

0 以上 max 未満の数を返します。 max が正の整数なら整数を、正の実数なら実数を返します。

 rand(range) -> Integer | Float | nil

range で指定された範囲の値を返します。 range の始端と終端が共に整数の場合は整数を、少なくとも片方が実数の場合は実数を返します。

整数と浮動小数点を相互変換する(精度の変換)

整数を浮動小数点へ変換するにはPrecisionモジュールのprec_fメソッドを使います。

逆に浮動小数点を整数に変換するにはPrecision#prec_iメソッドを使います。

Precisionモジュールは精度を持つ具象数値クラスのためのMix-inで、IntegerクラスとFloatクラスでインクルードされているためFixNum?、BigNum?、Floatクラスでそれぞれ使用することができます。

 i = 1
 f = i.prec_f #=> 1.0
 
 f = 3.0
 i= f.prec_i #=> 3