2013-10-26 48 views
5

我正在寫一個類似整數的類,它表示一個位於某個範圍內某個值的值。例如,bounded::integer<0, 10>的值在[0,10]的範圍內。對於這個班級,我已將radix定義爲2什麼是std :: numeric_limits <T> ::數字應該表示?

digits的值應爲bounded::integer<-100, 5>

bounded::integer<16, 19>怎麼樣?

回答

5

在閱讀了標準多一點思考後,我相信我有最好的答案,但我不確定。

首先,digits的定義,從最新的C++ 14標準草案,N3797截取,§18.3.2.4:

static constexpr int digits;

8的radix位數,可以在不被表示更改。

9對於整數類型,表示中的非符號位數。

10對於浮點類型,的radix位數的尾數

bounded::integer<-100, 5>的情況下的數量是相同的,作爲bounded::integer<0, 5>,這將使的2的值。

對於bounded::integer<16, 19>的情況,應將digits定義爲0。這樣的類甚至不能代表一個1比特數(因爲01不在範圍內),並且根據18.3.2.7.1:

所有成員應爲所有特化來提供。但是,許多值僅在特定條件下才有意義(例如,epsilon()僅在is_integerfalse時纔有意義)。任何非「有意義」的值都應設置爲0或false。

我認爲它沒有0作爲一個可能的值的任何類似於整數類不能有意義計算digitsdigits10

另一個可能的答案是使用數字的信息理論定義。但是,這與內置整數的值不一致。該描述明確地留下了符號位,但這些仍然被認爲是一個單一的信息位,所以我覺得排除這種解釋。這似乎排除了符號位,這也意味着我必須將第一個數字的負數和負數範圍中的較小數量,這就是爲什麼我相信第一個問題等同於bounded::integer<0, 5>。這是因爲您只能保證2位可以存儲而不會丟失數據。只要您的號碼是負數,您可以存儲多達6位,但通常情況下,您只能得到2位。

bounded::integer<16, 19>是非常棘手的,但我相信的解釋「沒有意義的」更有意義超過了偏移值,並給予同樣的答案,就好像它是bounded::integer<0, 3>,這將是2

我相信這個解釋來自標準,與其他整數類型一致,並且最不可能混淆這樣的類的用戶。

要回答digits的用例問題,一位評論者提到了基數排序。 base-2基數排序可能希望使用digits中的值對數字進行排序。如果將digits設置爲0,這樣可以很好,因爲這表示嘗試使用這種基數排序的錯誤情況,但是我們可以在保持與內置類型一致的情況下做得更好嗎?

對於無符號整數,取決於值digits的基數排序工作得很好。 uint8_tdigits == 8。但是,對於有符號整數,這不起作用:std::numeric_limits<int8_t>::digits == 7。您還需要對該符號位進行排序,但digits不會爲您提供足夠的信息。

+0

「第二個數字,'ranged_integer <16, 19>'更麻煩些,」我要問的問題是*數字是什麼? *?例如,你可以用基數排序來使用它。我希望'數字'提供了所有必要的信息;但它不適合你的'ranged_integer's。我不能在'ranged_integer <16,19>'中存儲一個3位數的數字,前3位數的基數排序會產生錯誤的結果。 – dyp

+0

@DyP我指的是問題中的順序。我會編輯我的答案,使其更清楚,所以你不必來回跳。回答你的基數排序示例需要的空間比我在評論中的空間要多一點,所以我也會編輯這個響應。 –

+0

啊!感謝您的澄清。 – dyp

0

你在想這件事。有對digits特兩個簡單的選項供自己ranged_integer

  • log2(Last-First)時,您所代表的範圍[First, Last)
  • N * numeric_limits<U>::digits的值,它對應於您可以存儲範圍的最小基礎存儲std::array<U, N>

請注意,您的班級ranged_integer可以在內部進行轉換以映射一系列[-100, 5]轉換爲[0, 105],以便您不必擔心符號位等。

相關問題