2013-10-26 18 views

答えて

5

標準をもう少し読んでこれについて考えると、私は最良の答えがあると信じていますが、私は確信していません。

まず、最新のC++ 14ドラフト標準、N3797から取らdigitsの定義は、§18.3.2.4:

static constexpr int digits;

8なしに表現することができるradix桁数変化する。

9整数型の場合、表現の符号なしビットの数。浮動小数点タイプの

10は、仮数

bounded::integer<-100, 5>の場合radix桁数は2の値を与えるbounded::integer<0, 5>、の場合と同じです。

bounded::integer<16, 19>の場合、digitsは、0と定義する必要があります。 (01が範囲内にないため)、このようなクラスは、さらに1ビットの数を表すことができない、および18.3.2.7.1によれば:

すべてのメンバーは、すべての専門分野のために提供されなければなりません。ただし、多くの値は、特定の条件下で意味をなす必要があります(たとえば、epsilon()は、is_integerfalseの場合にのみ意味があります)。 「有意義」でない値は、0またはfalseに設定しなければならない。

私は、可能な値として0を持たない任意の整数のようなクラスが有意義digitsdigits10を計算することができないと信じています。

もう1つの可能な答えは、数字の情報理論的定義を使用することです。しかし、これは組み込み整数の値とは一致しません。説明は明示的に符号ビットを除外していますが、それらはまだ情報の単一のビットと考えられるので、私はこの解釈を排除すると感じます。この符号ビットの除外は、最初の数の負の端と正の端の大きさが小さくなる必要があることを意味します。そのため、最初の質問はbounded::integer<0, 5>に相当します。これは、データの損失なしに2ビットを保存できることだけが保証されているためです。あなたの番号が否定的である限り、潜在的に最大6ビットを格納することができますが、一般的に、あなたは2つだけを取得します。

bounded::integer<16, 19>はかなりトリッキーですが、私は「意味がない」の解釈が終わっ値をシフトし、それが2だろうbounded::integer<0, 3>、あたかも同じ答えを与えるよりも理にかなっていると信じています。

私は、この解釈は標準からのものであり、他の整数型と一致し、そのようなクラスのユーザーを混乱させる可能性が最も低いと考えています。

digitsの使用例の質問に答えるために、コメント者は基数ソートを述べました。基数2の基数ソートでは、数値をソートするためにdigitsの値を使用すると予想されることがあります。これは、digits0に設定するとうまくいきます。これは、このような基数ソートを使用しようとしたときのエラー状態を示していますが、それでも組み込み型と並んでいる方が良いでしょうか?

符号なし整数の場合、digitsの値に依存する基数ソートはうまくいきます。 uint8_tdigits == 8です。しかし、符号付き整数の場合、これは機能しません:std::numeric_limits<int8_t>::digits == 7。また、その符号ビットをソートする必要がありますが、digitsはそれを行うのに十分な情報を提供していません。

+0

"2番目の数字は「ranged_integer <16, 19>」です。「質問したいのは、 *?たとえば、基数ソートで使用できます。私は '数字'がすべての必要な情報を提供することを期待しています。それはあなたの 'ranged_integer'のためではありません。 'ranged_integer <16,19>'に3桁の数字を格納することはできません。最初の3桁の基数ソートは間違った結果になります。 – dyp

+0

@DyP私は質問の順序を指していました。私はそれをより明確にするために私の答えを編集するので、あなたは前後にジャンプする必要はありません。あなたの基数ソートの例に答えるのは、私がコメントの中にあると思うより少し余分なスペースを取るので、その応答も編集します。 –

+0

ああ!説明をありがとう。 – dyp

0

あなたはそれを熟考しています。 digits専門のための2つの簡単なオプションは、あなた自身のためにあります

  • log2(Last-First)ranged_integerあなたが範囲[First, Last)を表しています。
  • N * numeric_limits<U>::digitsの値は、範囲を保存できる最小の基礎ストレージstd::array<U, N>に相当します。

クラスranged_integerは内部的に変換を行って範囲をマップすることができます。 [-100, 5][0, 105]に設定してください。

関連する問題