Ruby 1.8.7 リファレンスマニュアル > ライブラリ一覧 > mathnライブラリ
rational と complex をシームレスに利用できるようにするライブラリです。数値ライブラリの挙動をグローバルに変更します。
Integer や Float に比べ Rational は誤差無しで表現できる範囲が大きいため、 数値の演算において Rational をシームレスに利用したいことがあります。 そこで mathn ライブラリは、各数値クラスの間の関係を ちょうど Bignum と Fixnum とのような自動的に変換される関係にします。
具体的には、Rational のインスタンスが整数ならば、それは自動的に Integer (Fixnum または Bignum)となり、また、整数/整数の結果、 割り切れない時は Rational が返るようになります。後者は、整数のメソッド「/」が整商(.div)でなく、商(.quo)を返すようになる、ということを意味します。
例:
1/2 #=> 0 2 * Rational(1,2) #=> Rational(1,1) require 'mathn' 1/2 #=> Rational(1,2) 2 * Rational(1,2) #=> 1 (Fixnum)
同様にして Complex のインスタンスの虚部が 0 ならば、実部として含まれていた Rational, Float, または Integer オブジェクトに変換されます。
一方、数学演算の定義域・終域を複素数に拡大するので、 mathn を利用しない場合には範囲エラー例外を発生していたような演算が Complex オブジェクトを返す場合もあります。
例:
Complex(0,-1)**2 #=> Complex(-1,0) Math.sqrt(-1) #=> NaN require 'mathn' Complex(0,-1)**2 #=> -1 Math.sqrt(-1) #=> Complex(0,1)
なお、この挙動は、グローバルに影響を与えます。 つまり、(Ruby で書かれた)汎用ライブラリを require していた場合、 ライブラリ中の動作も、上のように変更されることになります。 他人の書いたライブラリを使う時は、ご注意下さい
逆に、汎用ライブラリの作者の方々は、この mathn が require される可能性を留意して書いて下されば親切だと思います。 整数同士で整除を意図するならば / メソッド ではなく div メソッド を用いると良いでしょう。
Prime |
complex | 複素数を扱うためのライブラリです。 |
matrix | 行列と数ベクトルを扱うためのライブラリです。 |
rational | 有理数を扱うためのライブラリです。 |
Bignum#/
Complex::Unify
Fixnum#/
Integer#gcd2
Integer#prime_division
Integer.from_prime_division
Math.#rsqrt
Math.#sqrt
Rational#**
Rational#inspect
Rational#power2
Rational::Unify