Kodama's home / tips.

ruby を電卓のように使うには?

Ruby 言語を簡易電卓代わりに使おうとするとちょっと戸惑うことがあるかもしれない.

割算

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(最大公約数) などの扱いで必要な概念なのだ. "どちらが自然か" などと言いだすと決着がつかない. まあ, 同じ記号 "/" で使い回す習慣が悪いのだが...

関数

電卓のように...という話とはちょっと違うが, 平方根などは Math モジュールの関数として利用できる.
$ 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.