2012-03-17 34 views
0

私はいくつかの簡単な操作(引き算、掛け算)を持っている大きな数字(整数)で。彼らはとても大きいので、私はそれらを変数long doubleに保存しなければなりません。それは問題ありませんが、場合によっては乗算が精度を失います。倍精度:大きな数の乗算

例:

A = 84478098072866400.00 
B = 419247971803584000000.00 

A * B = 35417271278873496315650351919301394432.00 

これは間違っていることは明らかです。乗算の結果は0のシーケンスで終了する必要があります。

これは、最も一般的なケースであるので、私は特にこの1(数字はゼロで終了した場合)、精度を維持する必要があります。

私の質問は、それを行う方法を、お願いしているのですか? long doubleをより良く動作させる方法はありますか?または、格納された数値の精度を取得する方法はありますか?

ありがとうございます!

編集:私は任意の外部ライブラリを使用することはできません

。私はACMコンペのアーカイブの問題を解決しようとしています。これはその一部です。

私は失われた精度で罰金だろうが、私はそれを検出する必要があります。数字がlong doubleより大きい場合(おそらく確実かもしれない)、それは長いシーケンスのゼロで終了する。

+2

整数に対して操作を行う場合は、浮動小数点ではなく整数を使用します。 –

+1

@Carlよく50桁以上の数値には変数がありません。またはそれは? – Gaim

+0

いいえ、組み込み型をまったく使用しようとするべきではありません。 Googleの任意の精度。 [GMP](http://gmplib.org/)は良い選択です。 –

答えて

1

あなたが本当に巨大な整数で作業している場合は、あなただけのメモリがお使いの数字の大きさ(なし精度が失われた)制限場所arbitrary precision arithmeticをしたいでしょう。 The GNU Multiple Precision Arithmetic Libraryはこれのための一般的なライブラリです(そして有理数と浮動小数点数の任意の精度の算術も同様です)。

+1

GMPは、任意精度の有理数と浮動小数点数もサポートしています。 –

+0

良い点。私は言葉を変更します。 – gspr

+0

答えてくれてありがとう、私はおそらく私は外部ライブラリを使用することはできません言及する必要があります。 (私はACMの競争のアーカイブの1つの問題を解決しようとしています) – Gaim

0

どのくらい知っていますが、ビットで、あなたが処理するために必要な最大値はありますか?

私はgccは、一部のプラットフォームで、128ビットの整数をサポートしていることに気づいたので、私は聞いて


http://gcc.gnu.org/onlinedocs/gcc/_005f_005fint128.html

あなたは長い長い128ビットをサポートするプラットフォームで得ることができる場合ので、あなたは、非常に幸運かもしれない、と最新のgccです。