このたびは、本ライブラリをダウンロード頂き、ありがとうございます 本ライブラリは、C++での開発に於いて、分数計算を可能にする為のライブラリです。 未だ開発段階のライブラリのため、若干不備がある/誤差が大きい等の問題がありますが、 使用に際しては、注意事項の範囲内であれば、問題なく動作します。
Alpha 0.01
本ライブラリの、注意事項に反した使用により発生した問題に関して、私Surは一切の責任を負いません。 もし注意事項に反せぬ範囲で問題が生じた様でしたら、改善の参考とさせて頂きますので、是非メールにて報告をお願いします
本ライブラリを使用したいプロジェクトと同じフォルダに、同梱のfraction.libとfraction.hをコピーします。 VCの設定にてプロジェクトから本ライブラリをリンクして、(必要であればヘッダファイルをプロジェクトに追加し、)fraction.hをincludeします。
Alpha 0.01では、累乗演算に標準ライブラリ関数のpow関数を用いているため、
乗数に小数/分数を指定した時の動作は保証できません。(メモリエラー or ハング or 無限ループ)
当ライブラリでは各演算ごとに約分を行っていますが、
分子/分母に1E-5未満の値を含む分数演算は約分の際に誤差が生じ得ます。
1E-5未満の精密な計算を行う場合、注意して下さい。
real r;
実数型です。このタイプはfraction.h内でtypedefされ、その実態はdoubleです。
frac fr;
分数クラスです。分母と分子を持ち、その両者はreal型で定義されます。
また、以下の様な演算が可能です。各演算/関数内でエラー(累乗の問題, 分母が0になった、など)が発生した場合、0/1という値が代入されます。
frac fr1, fr2, ans;
real r;
....
fr1 = fr2; // 代入
ans = fr1 + fr2; // 加算
ans = fr1 - fr2; // 減算
ans = fr1 * fr2; // 乗算
ans = fr1 / fr2; // 除算
ans = fr1 ^ fr2; // 累乗
ans = fr1 % fr2; // 余剰
ans = fr1 + r; // 加算
// 以下同上
/* r + fr2 の様な、逆方向の演算も可能 */
fr1 = fr2; // 代入
fr1 += fr2; // 和代入
fr1 -= fr2; // 差代入
fr1 *= fr2; // 積代入
fr1 /= fr2; // 商代入
fr1 ^= fr2; // 累乗代入
fr1 %= fr2; // 余剰代入
fr1 = r; // 代入
// 以下同上
/* ただし、代入にはr += fr2 の様な、逆方向の演算は不可能。
r += frac_real(fr2);の様に、実数にキャストしてから。 */
frac fr fr2;
fr = frac(2, 3);
fr2 = frac(fr, 3);
...
分数に値をセットする関数です。或いは一時的に分数を与えたい時に、わざわざ変数を用意せずとも、型キャストの様な手軽さで分数演算を実現できます。
また、分母/分子には分数も指定できます。
frac fr;
real d, n;
fr = frac(2, 5);
n = frac_numer(); // nには2.000が代入されます
d = frac_denom(); // dには5.000が代入されます
分子/分母を各々取り出す関数です。
返り値はreal型です。
frac fr;
real r;
fr = frac_set(2, 3);
r = frac_real(fr); // rには0.66666...が代入される
分数を実数に変える関数です。
frac fr;
fr = frac(2, 3);
frac_print(fr);
frac_printf("%d,%d"fr);
出力:
(2/3) 2,3分数を表示する関数です。出力の際には必ず改行されます。printでは自動フォーマットですが、 printfではユーザフォーマットがつけられます。 フォーマット内には%d, %02dなどのint型出力部分が2カ所必要です。 2個より多くあっても少なくあってもエラーとなりますので注意して下さい。
frac fr;
char *str;
fr = frac(2, 5);
str = frac_sprint(fr);
puts(str);
delete [] str; // 文字列は極力解放
str = frac_sprintf("%d:%d"fr);
puts(str);
delete [] str; // 文字列は極力解放
出力:
(2/5) 2:5printfの対文字列出力関数です。文字列には\nが付加されません。フォーマットはfrac_printfに同じです。 ただし、こちらの関数では文字列が自動解放されませんので、極力delete [] strのようにメモリーを解放して下さい。
frac fr1, fr2;
real r1, r2;
char* str;
// メソッド //: 先に挙げた代替関数
fr1.set(2, 3); //: fr1 = frac(2, 3);
fr2.set(1, fr1); //: fr2 = frac(1, fr1);
str = fr1.str(); //: str = frac_sprint(fr1);
str = fr2.str("%d,%d"); //: str = frac_sprintf("%d,%d", fr2);
str = fr1.view(); //: frac_print(fr1);
str = fr2.view("%d,%d"); //: frac_printf("%d,%d", fr2);
r1 = fr1.numer(); //: r1 = frac_numer(fr1);
r1 = fr1.denom(); //: r1 = frac_denom(fr1);
r2 = fr2.realyz(); //: r2 = frac_real(fr2);