我正在编写一个类似整数的类,它表示一个位于某个范围内的值。例如,bounded::integer<0, 10>
的值在[0,10]范围内。对于本课程,我已将radix
定义为2
。
digits
的价值bounded::integer<-100, 5>
应该是什么?
bounded::integer<16, 19>
怎么样?
答案 0 :(得分: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位数(因为0
和1
不在范围内),并且根据18.3.2.7.1:
应为所有专业提供所有成员。但是,在某些条件下,许多值只需要有意义(例如,
epsilon()
仅在is_integer
为false
时才有意义)。任何非“有意义”的值都应设置为0或false。
我相信任何没有0
作为可能值的整数类都无法有意义地计算digits
和digits10
。
另一个可能的答案是使用数字的信息理论定义。但是,这与内置整数的值不一致。描述明确地省略了符号位,但那些仍然被认为是单个信息位,所以我觉得排除了这种解释。这似乎排除了符号位也意味着我必须采用负数的较小值和第一个数字的范围的正端,这就是为什么我认为第一个问题等同于{{ 1}}。这是因为只保证可以存储2位而不会丢失数据。只要您的数字为负数,您最多可以存储6位,但一般情况下,您只能获得2。
bounded::integer<0, 5>
更加棘手,但我认为“无意义”的解释比将价值转移并给出相同的答案更有意义,就好像它是bounded::integer<16, 19>
一样bounded::integer<0, 3>
,2
1}}。
我认为这种解释遵循标准,与其他整数类型一致,并且最不可能混淆这种类的用户。
为了回答digits
的用例问题,一位评论者提到了基数排序。 base-2基数排序可能会使用digits
中的值对数字进行排序。如果您将digits
设置为0
,这样会很好,因为这表示尝试使用此类基数排序的错误条件,但是我们可以在保持与内置类型一致的情况下做得更好吗?
对于无符号整数,依赖于digits
的值的基数排序可以正常工作。 uint8_t
有digits == 8
。但是,对于有符号整数,这不起作用:std::numeric_limits<int8_t>::digits == 7
。您还需要对该符号位进行排序,但digits
没有为您提供足够的信息。
答案 1 :(得分:0)
你过分思考它。对于您自己的digits
ranged_integer
专精有两个简单的选项
log2(Last-First)
时,[First, Last)
。 N * numeric_limits<U>::digits
的值,对应于您可以存储范围的最小底层存储空间std::array<U, N>
。请注意,您的班级ranged_integer
可以在内部进行转换以映射范围,例如[-100, 5]
[0, 105]
到{{1}},这样您就不必担心签名位等。