gpt4 book ai didi

c++ - std::numeric_limits::digits 应该代表什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:31 25 4
gpt4 key购买 nike

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

digits的值应该是多少?为 bounded::integer<-100, 5>

bounded::integer<16, 19>呢? ?

最佳答案

在进一步阅读标准并思考这个问题后,我相信我有最好的答案,但我不确定。

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

static constexpr int digits;

8 Number of radix digits that can be represented without change.

9 For integer types, the number of non-sign bits in the representation.

10 For floating point types, the number of radix digits in the mantissa

bounded::integer<-100, 5> 的情况与 bounded::integer<0, 5> 的情况相同,后者的值为 2

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

All members shall be provided for all specializations. However, many values are only required to be meaningful under certain conditions (for example, epsilon() is only meaningful if is_integer is false). Any value that is not "meaningful" shall be set to 0 or 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 没有提供足够的信息来执行此操作。

关于c++ - std::numeric_limits<T>::digits 应该代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19609186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com