2011-11-08 3 views
6

個人的なプロジェクトとして、私は自分のペットプロジェクトに任意の精度の数値型を実装しようとしています。符号なし計算がオーバーフローする可能性がある場合は、事前にどのように決定するのですか?

私は既にこれについて一般的で、テストされた、堅牢なライブラリについて知っています。私は、自己改善教育プロジェクトとしての解決策に取り組んでいきたいと考えています。

私は地域を研究し、にはいくつかの方法がある場合、私は実際に計算を行う前に、操作がオーバーフローを引き起こすかどうおおよそ予測把握しようとしています。私は偽陽性についてもそれほど心配していません。

私は、計算に適した最小のスペースを使いたいと考えています。計算がその本来の範囲内にとどまるなら、私はそこに保持します。

例:Multiplying two 64 bit Integers if each are large enough will cause an overflow.結果をとすると、が64ビットの解像度を超えた場合にのみ、これを検出して番号を自分の番号タイプにアップコンバートします。この実験では、と署名して作業します。

オーバーフロー/アンダーフローを検出するための最も一般的で効率的な方法は何ですか?これらの数字のオーバーフローを引き起こす、あなたがオーバーフローのために良いチャンスを持っている:

+0

似たようなプロジェクトを試みたことはありませんでしたが、あらかじめオーバーフローについて知っている点は何ですか?より小さなnmbersのための最適化はすばやく、またはそれほど明白ではありませんか?正確な解決策が必要な場合や、誤ったオーバーフローアラームを発生させる可能性のあるものを受け入れる場合 – vmatyi

+1

あなたの質問とあなたのコメントは、答えの1つに、あなたが署名付きオペランドを使用していると言いますが、タイトルにはunsignedと書かれています。どちらですか?符号なし算術演算はおそらく扱いが簡単で、おそらく任意の精度の数値を扱うのに適しています。 –

+0

ベースを表す符号なし64ビット長の配列のように、符号なしのプリミティブ型を基本コンポーネントとして使用して、符号付きの任意の計算を実行します。 –

答えて

2

は(乗算など)の結果ならば、1で左シフト、両方の数字で唯一の最上位ビットを取ります。

これは正確ではありませんが、驚くほど速く、結果として大きなデータ型が必要であることを示す優れた指標です。

これだけこの質問を参照してください..オペレータは高価であるため、大規模なデータ・タイプに対して意味をなす(でも、64ビットの数値のための)の単純なもののために、私はあなたがCPUの組み込み算術に頼ることができると思うかもしれません:Undefined behavior when exceed 64 bits

+1

なぜ1ずつシフトしますか? –

+1

オーバーフローの原因になります。それが実際に起こった場合、それはあなたの番号の1つが既に大きいことを意味します。 –

2

John Regehrさんのpaperがあります。

0

単純な計算を実行することはほとんどいつも簡単です(しばしば高速です)。また、オーバーフローが発生したかどうかを検出します。計算を実行する前にの可能性を検出する特別な理由はありますか?

一般に、計算が終了するとオーバーフローが発生したかどうかを検出するのは非常に簡単です。素朴な操作は安価であるため、オーバーフローが発生した場合でも、たとえ何らかの作業をやり直す必要が生じても、計算コストがかかりません。 (しかし、通常、それをする必要はありません)。

ここには非常に簡単な例があります。符号なし64ビットの2つの数値を追加すると、オーバーフローが発生したかどうかを比較できます。したがって、計算後にオーバーフローを検出するには、単一の比較(実際には非常に安価)だけが必要です。

+0

あなたの例は、符号なしオペランドの場合にのみ当てはまりますが、一般的な場合には保持されません。 –

+0

そして、符号付きオーバーフローの動作は未定義です。 –

+0

@Keith:もちろん、プリミティブ型の場合。 OPは、任意精度の型を実装することを話しています。彼は表現を成長させるためにオーバーフローを処理することができなければなりません(オーバーフローを防ぐように!)。 –

関連する問題