私は、範囲のどこかにある値を表す整数のようなクラスを書いています。たとえば、bounded::integer<0, 10>
の値は[0、10]の範囲のどこかにあります。このクラスでは、私はradix
を2
と定義しました。std :: numeric_limitsとは何ですか?<T> :: digitが表すはずですか?
digits
の値はbounded::integer<-100, 5>
の値になるべきですか?
約bounded::integer<16, 19>
?
私は、範囲のどこかにある値を表す整数のようなクラスを書いています。たとえば、bounded::integer<0, 10>
の値は[0、10]の範囲のどこかにあります。このクラスでは、私はradix
を2
と定義しました。std :: numeric_limitsとは何ですか?<T> :: digitが表すはずですか?
digits
の値はbounded::integer<-100, 5>
の値になるべきですか?
約bounded::integer<16, 19>
?
標準をもう少し読んでこれについて考えると、私は最良の答えがあると信じていますが、私は確信していません。
まず、最新の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
と定義する必要があります。 (0
と1
が範囲内にないため)、このようなクラスは、さらに1ビットの数を表すことができない、および18.3.2.7.1によれば:
すべてのメンバーは、すべての専門分野のために提供されなければなりません。ただし、多くの値は、特定の条件下で意味をなす必要があります(たとえば、
epsilon()
は、is_integer
がfalse
の場合にのみ意味があります)。 「有意義」でない値は、0またはfalseに設定しなければならない。
私は、可能な値として0
を持たない任意の整数のようなクラスが有意義digits
とdigits10
を計算することができないと信じています。
もう1つの可能な答えは、数字の情報理論的定義を使用することです。しかし、これは組み込み整数の値とは一致しません。説明は明示的に符号ビットを除外していますが、それらはまだ情報の単一のビットと考えられるので、私はこの解釈を排除すると感じます。この符号ビットの除外は、最初の数の負の端と正の端の大きさが小さくなる必要があることを意味します。そのため、最初の質問はbounded::integer<0, 5>
に相当します。これは、データの損失なしに2ビットを保存できることだけが保証されているためです。あなたの番号が否定的である限り、潜在的に最大6ビットを格納することができますが、一般的に、あなたは2つだけを取得します。
bounded::integer<16, 19>
はかなりトリッキーですが、私は「意味がない」の解釈が終わっ値をシフトし、それが2
だろうbounded::integer<0, 3>
、あたかも同じ答えを与えるよりも理にかなっていると信じています。
私は、この解釈は標準からのものであり、他の整数型と一致し、そのようなクラスのユーザーを混乱させる可能性が最も低いと考えています。
digits
の使用例の質問に答えるために、コメント者は基数ソートを述べました。基数2の基数ソートでは、数値をソートするためにdigits
の値を使用すると予想されることがあります。これは、digits
を0
に設定するとうまくいきます。これは、このような基数ソートを使用しようとしたときのエラー状態を示していますが、それでも組み込み型と並んでいる方が良いでしょうか?
符号なし整数の場合、digits
の値に依存する基数ソートはうまくいきます。 uint8_t
はdigits == 8
です。しかし、符号付き整数の場合、これは機能しません:std::numeric_limits<int8_t>::digits == 7
。また、その符号ビットをソートする必要がありますが、digits
はそれを行うのに十分な情報を提供していません。
あなたはそれを熟考しています。 digits
専門のための2つの簡単なオプションは、あなた自身のためにあります
log2(Last-First)
ranged_integer
あなたが範囲[First, Last)
を表しています。N * numeric_limits<U>::digits
の値は、範囲を保存できる最小の基礎ストレージstd::array<U, N>
に相当します。クラスranged_integer
は内部的に変換を行って範囲をマップすることができます。 [-100, 5]
を[0, 105]
に設定してください。
"2番目の数字は「ranged_integer <16, 19>」です。「質問したいのは、 *?たとえば、基数ソートで使用できます。私は '数字'がすべての必要な情報を提供することを期待しています。それはあなたの 'ranged_integer'のためではありません。 'ranged_integer <16,19>'に3桁の数字を格納することはできません。最初の3桁の基数ソートは間違った結果になります。 – dyp
@DyP私は質問の順序を指していました。私はそれをより明確にするために私の答えを編集するので、あなたは前後にジャンプする必要はありません。あなたの基数ソートの例に答えるのは、私がコメントの中にあると思うより少し余分なスペースを取るので、その応答も編集します。 –
ああ!説明をありがとう。 – dyp