分数を扱うモジュール.
Copyright (c) 2013-2014 DWANGO Co., Ltd. All Rights Reserved.
分母は符号を持たないように、分子に符号を保持するようにする.
abstract datatype: fraction()
add/2 | 足し算 数(分数|浮動小数点数|整数)同士. |
comp/2 | 分数の比較. |
denom/1 | 分母を返す. |
divide/2 | 割り算 数(分数|浮動小数点数|整数)同士. |
from_binary/1 | バイナリの整数、負数、分数、小数を分数に変換する. |
from_float/1 | 浮動小数点数を分数に変換する. |
from_float_binary/1 | バイナリ形式の小数を分数に変換する. |
from_integer/1 | 整数を分数に変換する. |
from_number/1 | 数値(整数|浮動小数点数)を分数に変換する. |
is_fraction/1 | 分数かどうかの判定. |
max/2 | 大きい方の値を返す. |
min/2 | 小さい方の値を返す. |
mul/2 | 掛け算 数(分数|浮動小数点数|整数)同士. |
new/2 | 分数を生成する. |
num/1 | 分子を返す. |
sub/2 | 引き算 数(分数|浮動小数点数|整数)同士. |
to_binary/1 | 分数をバイナリに変換する. |
to_float/1 | 分数を浮動小数点数に変換する. |
to_integer/1 | 整数部分を返す. |
to_tuple/1 | 分数をタプル({分子, 分母})に変換する. |
add(A::fraction() | number(), B::fraction() | number()) -> R::fraction()
足し算 数(分数|浮動小数点数|整数)同士.
9パターンに対応.
comp(A::fraction(), B::fraction()) -> R::integer()
分数の比較.
Aの方が大きい場合は正整数(1),
Bの方が大きい場合は負整数(-1),
同じ場合は0を返す.
1, -1ではなく, 正整数, 負整数でチェックすること.
denom(Frac::fraction()) -> Denom::integer()
分母を返す.
divide(A::fraction() | number(), B::fraction() | number()) -> R::fraction()
割り算 数(分数|浮動小数点数|整数)同士.
9パターンに対応.
from_binary(Binary::binary()) -> fraction()
バイナリの整数、負数、分数、小数を分数に変換する.
ex:
1> moyo_frac:from_binary(<<"5">>).
{fraction, 5, 1}
2> moyo_frac:from_binary(<<"-5">>).
{fraction, -5, 1}
3> moyo_frac:from_binary(<<"1/5">>).
{fraction, 1, 5}.
4> moyo_frac:from_binary(<<"0.25">>).
{fraction, 1, 4}
from_float(Float::float()) -> fraction()
浮動小数点数を分数に変換する.
floatの精度の問題で同じと思っている値を比べても同じと判断されない場合がある.
ex:
1> moyo_frac:comp(moyo_frac:from_float(3.14), moyo_frac:new(314, 100)).
1
非正規化数を分数にすることはできるが, to_floatすると割り算でerrorが発生する. 無限大, NaNに関してはErlangのfloatでは使えないので考慮していない.
from_float_binary(DecimalBin::binary()) -> fraction()
バイナリ形式の小数を分数に変換する.
小数(有理数)を分数にする関数.
文字列で見えている範囲で分数にする.
ex: 3.1415 -> 31415/10000 -> 6283/2000
注: 約分は行われる.
ex:
1> moyo_frac:from_float_binary(<<"3.1415">>).
{fraction, 6283, 2000}
from_integer(Int::integer()) -> Frac::fraction()
整数を分数に変換する.
from_number(Number::number()) -> fraction()
数値(整数|浮動小数点数)を分数に変換する.
is_fraction(Fraction::term()) -> boolean()
分数かどうかの判定.
max(A::fraction(), B::fraction()) -> M::fraction()
大きい方の値を返す.
min(A::fraction(), B::fraction()) -> M::fraction()
小さい方の値を返す.
mul(A::fraction() | number(), B::fraction() | number()) -> R::fraction()
掛け算 数(分数|浮動小数点数|整数)同士.
9パターンに対応.
new(Num::integer(), Denom::integer()) -> fraction()
分数を生成する.
分母に0を与えられた場合, denominator_0_error
をthrowする.
num(Frac::fraction()) -> Num::integer()
分子を返す.
sub(A::fraction() | number(), B::fraction() | number()) -> R::fraction()
引き算 数(分数|浮動小数点数|整数)同士.
9パターンに対応.
to_binary(Fraction::fraction()) -> binary()
分数をバイナリに変換する.
to_float(Frac::fraction()) -> Float::float()
分数を浮動小数点数に変換する.
to_integer(Frac::fraction()) -> Int::integer()
整数部分を返す.
to_tuple(Frac::fraction()) -> {Num::integer(), Denom::integer()}
分数をタプル({分子, 分母})に変換する.