- ベストアンサー
型について
自分は今、1000や10000とかの大きな数の階乗を求めるプログラムを作成しています。それでその答えを入れる変数の型をfloat型にして、printf()内では%fとかにしてみたのですが、”Floating exception: Overflow”とでてうまくできませんでした。 このような大きな数を扱える型を教えて下さい!
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
異常に大きな数を"正確に"扱うためには"多倍長整数"というものを使います。 このためのライブラリでは, GMP, NTLというものがあります。 gimmickさんのいうように概算でよいならば, 皆さんの言う通り, log doubleで良いと思います。 GMP, NTLを使うにはまたちょっと勉強が必要ですが, がんばってください。日本語のページもちらほら見つけることもできます。 参考URLにNTLを公開しているページを揚げます。英語ですが...
- 参考URL:
- http://www.shoup.net/
その他の回答 (3)
- sha-girl
- ベストアンサー率52% (430/816)
1000の階上は doubleだと普通オーバーフローしますね。 gccだとlong double(10バイト)がありますがそれでもオーバーフローします。 double 型(8バイト)の値の範囲がおおよそ 1.7E-308 ~ 1.7E+308 有効数字は15~16桁です。 基本的にはそういう計算をする場合、C++だと独自のクラスを作ります。 ビット演算の方法さえしっていれば大した量にはなりません。 クラスでなくても構造体と関数でやる事も可能です。 ちなみにjavaだとBigDecimal というライブラリーが標準でついています。
- gimmick
- ベストアンサー率49% (134/270)
C言語では数千桁、数万桁の整数を扱えるような型はありませんし、doubleを使ったとしても、ここまで大きな数は表現できません。また、浮動小数点型の場合、仮にオーバーフローにならないとしても有効桁数の問題があります。おそらく、自分で型や関数を定義するか、ライブラリを手に入れるしかないと思います。(処理系依存ですが、1000の階乗の方はlong doubleで計算できるかもしれません。) # 正確な値を求める必要があるのか、概算でも良いのかを明確にすると、適切な回答が得やすいと思います。
- nana_ko
- ベストアンサー率19% (89/467)
doubleがいちばん大きなデータ型だったと思います。 doubleは試してみましたか???