在阅读了标准之后再考虑一下,我相信我有最好的答案,但我不确定.
首先,定义digits,取自最新的C++ 14标准草案,N3797,§18.3.2.4:
static constexpr int digits;8
radix无需更改即可表示的位数.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:
应为所有专业提供所有成员.然而,许多值仅需要是在某些条件下有意义(例如,
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不会为您提供足够的信息.
| 归档时间: |
|
| 查看次数: |
1178 次 |
| 最近记录: |