6

我正在编写一个类似整数的类,它表示一个位于某个范围内的值。例如, 的值bounded::integer<0, 10>在 [0, 10] 范围内。对于这个类,我定义radix2.

的价值应该是digits什么bounded::integer<-100, 5>

怎么样bounded::integer<16, 19>

4

2 回答 2

6

在阅读了更多标准并考虑了这一点之后,我相信我有最好的答案,但我不确定。

首先, 的定义digits,取自最新的 C++14 草案标准,N3797,第 18.3.2.4 节:

static constexpr int digits;

8radix无需更改即可表示的位数。

9 对于整数类型,表示中的非符号位数。

10 对于浮点类型,radix尾数中的位数

的情况bounded::integer<-100, 5>与 for 相同bounded::integer<0, 5>,会给出 的值2

对于 的情况bounded::integer<16, 19>digits应定义为0。这样的类甚至不能表示 1 位数字(因为0并且1不在范围内),并且根据 18.3.2.7.1:

应为所有专业提供所有成员。但是,许多值只需要在某些条件下才有意义(例如,仅在isepsilon()时才有意义)。任何不“有意义”的值都应设置为 0 或 false。is_integerfalse

我相信任何没有可能值的类整数类0都无法有意义地计算digitsand digits10

另一个可能的答案是使用数字的信息论定义。但是,这与内置整数的值不一致。该描述明确省略了符号位,但这些仍将被视为单个信息位,因此我认为排除了这种解释。似乎这种符号位的排除也意味着我必须为第一个数字取范围的负端和正端中较小的一个,这就是为什么我认为第一个问题相当于bounded::integer<0, 5>。这是因为您只能保证 2 位可以存储而不会丢失数据。只要您的数字为负数,您最多可以存储 6 位,但通常,您只能获得 2 位。

bounded::integer<16, 19>更棘手,但我相信“没有意义”的解释比转移价值并给出与 . 相同的答案更有意义bounded::integer<0, 3>,这将是2.

我相信这种解释遵循标准,与其他整数类型一致,并且最不可能混淆此类用户。

为了回答 的用例问题digits,一位评论者提到了基数排序。以 2 为底的基数排序可能期望使用 in 的值digits对数字进行排序。digits如果您设置为,这会很好0,因为这表明尝试使用这种基数排序时会出现错误情况,但是我们可以在仍然与内置类型保持一致的同时做得更好吗?

对于无符号整数,取决于值的基数排序digits就可以了。uint8_tdigits == 8。但是,对于有符号整数,这不起作用:std::numeric_limits<int8_t>::digits == 7. 您还需要对该符号位进行排序,但digits没有为您提供足够的信息来执行此操作。

于 2013-10-26T16:42:59.083 回答
0

你想多了。digits对于您自己的专业化,有两个简单的选择ranged_integer

  • log2(Last-First)当您代表范围时[First, Last)
  • 其值N * numeric_limits<U>::digits对应std::array<U, N>于您可以存储范围的最小底层存储。

请注意,您的班级ranged_integer可以在内部进行转换以将例如范围映射[-100, 5][0, 105],这样您就不必担心符号位等。

于 2013-10-26T19:16:16.490 回答