我正在寫一個類似整數的類,它表示一個位於某個範圍內某個值的值。例如,bounded::integer<0, 10>
的值在[0,10]的範圍內。對於這個班級,我已將radix
定義爲2
。什麼是std :: numeric_limits <T> ::數字應該表示?
digits
的值應爲bounded::integer<-100, 5>
?
bounded::integer<16, 19>
怎麼樣?
我正在寫一個類似整數的類,它表示一個位於某個範圍內某個值的值。例如,bounded::integer<0, 10>
的值在[0,10]的範圍內。對於這個班級,我已將radix
定義爲2
。什麼是std :: numeric_limits <T> ::數字應該表示?
digits
的值應爲bounded::integer<-100, 5>
?
bounded::integer<16, 19>
怎麼樣?
在閱讀了標準多一點思考後,我相信我有最好的答案,但我不確定。
首先,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比特數(因爲0
和1
不在範圍內),並且根據18.3.2.7.1:
所有成員應爲所有特化來提供。但是,許多值僅在特定條件下才有意義(例如,
epsilon()
僅在is_integer
爲false
時纔有意義)。任何非「有意義」的值都應設置爲0或false。
我認爲它沒有0
作爲一個可能的值的任何類似於整數類不能有意義計算digits
和digits10
。
另一個可能的答案是使用數字的信息理論定義。但是,這與內置整數的值不一致。該描述明確地留下了符號位,但這些仍然被認爲是一個單一的信息位,所以我覺得排除這種解釋。這似乎排除了符號位,這也意味着我必須將第一個數字的負數和負數範圍中的較小數量,這就是爲什麼我相信第一個問題等同於bounded::integer<0, 5>
。這是因爲您只能保證2位可以存儲而不會丟失數據。只要您的號碼是負數,您可以存儲多達6位,但通常情況下,您只能得到2位。
bounded::integer<16, 19>
是非常棘手的,但我相信的解釋「沒有意義的」更有意義超過了偏移值,並給予同樣的答案,就好像它是bounded::integer<0, 3>
,這將是2
。
我相信這個解釋來自標準,與其他整數類型一致,並且最不可能混淆這樣的類的用戶。
要回答digits
的用例問題,一位評論者提到了基數排序。 base-2基數排序可能希望使用digits
中的值對數字進行排序。如果將digits
設置爲0
,這樣可以很好,因爲這表示嘗試使用這種基數排序的錯誤情況,但是我們可以在保持與內置類型一致的情況下做得更好嗎?
對於無符號整數,取決於值digits
的基數排序工作得很好。 uint8_t
有digits == 8
。但是,對於有符號整數,這不起作用:std::numeric_limits<int8_t>::digits == 7
。您還需要對該符號位進行排序,但digits
不會爲您提供足夠的信息。
你在想這件事。有對digits
特兩個簡單的選項供自己ranged_integer
log2(Last-First)
時,您所代表的範圍[First, Last)
。N * numeric_limits<U>::digits
的值,它對應於您可以存儲範圍的最小基礎存儲std::array<U, N>
。請注意,您的班級ranged_integer
可以在內部進行轉換以映射一系列[-100, 5]
轉換爲[0, 105]
,以便您不必擔心符號位等。
「第二個數字,'ranged_integer <16, 19>'更麻煩些,」我要問的問題是*數字是什麼? *?例如,你可以用基數排序來使用它。我希望'數字'提供了所有必要的信息;但它不適合你的'ranged_integer's。我不能在'ranged_integer <16,19>'中存儲一個3位數的數字,前3位數的基數排序會產生錯誤的結果。 – dyp
@DyP我指的是問題中的順序。我會編輯我的答案,使其更清楚,所以你不必來回跳。回答你的基數排序示例需要的空間比我在評論中的空間要多一點,所以我也會編輯這個響應。 –
啊!感謝您的澄清。 – dyp