Kodama's home / tips.
ruby の場合, 整数(Integer), 浮動小数点数(Float), 有理数(Rational), 複素数(Complex) などの相互の計算をあまり意識しないで使えるようになっている. 通常はこれで問題はおこらない.
$ ruby -e 'p 3+2' # Integer どうしの和 5 $ ruby -e 'p 3.0+2' # Integer と Float の和 5.0
このような自動的な変換が自然にできているので,つい嵌まってしまいがちだが, 整数どうしの "/" (割算)は 17÷5=3...2 のように整数値の範囲で商と余りを求める整除を意味する. (多くの言語でも同様だが.) 浮動小数点数の割算を思い浮かべているのに, 整数で計算をするとつじつまが合わなくなる.
$ ruby -e 'p 3.0/2' 1.5 $ ruby -e 'p 3/2' 1
これを避けるには, mathn を使うと良い. "整数/整数" で有理数(Rational) を得る. 電卓風味ということなら Float を得てもよいと思うが, その場合は明示的に to_f する.
$ ruby -e 'require "mathn"; p 3/2' 3/2 $ ruby -e 'require "mathn"; p (3/2).to_f' 1.5
電卓のような計算だけを考えると, 有理数(または実数)としての商が数学として自然で, 整除がコンピュータのための不自然な計算であるかのような印象をうけるが. 整数自体では 素数, GCD(最大公約数) などの扱いで必要な概念なのだ. "どちらが自然か" などと言いだすと決着がつかない. まあ, 同じ記号 "/" で使い回す習慣が悪いのだが...
$ ruby -e 'p Math::sqrt(2.0)' 1.4142135623731
Float のメソッドでも良いと思うが,そうなってはいない.
$ ruby -e 'p (2.0).sqrt' -e:1: undefined method `sqrt' for 2.0:Float (NoMethodError)
Kodama's home / tips.