gmpのC++バインディングだが、mpf_class(というかgmpのmpf_tの)デフォルトの有効桁は64桁。デフォルトを変更するにはmpf_set_default_prec(unsigned long)
で有効桁を変更する必要がある。しかしC++でmpf_classのコンストラクタが呼ばれた後だとデフォルトを変更しても駄目なので、
int foo(){
mpf_set_default_prec(1000);
mpf_class A(10);
}
みたいな順番で書く必要がある。まあ、当然っちゃ当然。でも、C++はちゃんとコンストラクタを後に呼ぶんだな。変数が1つだけとかなら、
mpf_class A(10);
A.set_prec(1000);
でも問題はない。 gmpには実数(分数)型ってないのかな。無限桁の分数型があれば誤差ゼロの演算が可能になるのだが。…なくても、mpzを2つ使ってすぐに書けそうだけど。 (追記) 2004-06-15 10:23 あれ、分数だと実数じゃなくて有理数って言うんだっけ? 無理数は計算機で表現できるのだろうか。 (追記) 2004-06-15 21:41 非常に手抜きですが分数型を書いてみました。
# g++ -D__MAIN__ -g -o fractint fractint.C -lgmpxx
# ./fractint 1020/234 222/555
fr1 = 170/39
fr2 = 2/5
+: 928/195
-: 772/195
/: 425/39
*: 68/39
C++もたまにはけっこう楽できるな、と思える。