我想知道标准中是否有某些内容,例如#define
或numeric_limits
中的内容,它会告诉我浮点的整数部分中的最大基数为10的数字类型。
例如,如果我有一些浮点类型,其最大值是:1234.567。我想在标准中定义一些能告诉我4类型的东西。
我这样做有选择吗?
template <typename T>
constexpr auto integral_digits10 = static_cast<int>(log10(numeric_limits<T>::max())) + 1;
答案 0 :(得分:2)
正如Nathan Oliver在评论中指出的那样,C ++提供了std::numeric_limits<T>::digits10
。
可以由类型
T
表示的基数为10的数字,无需更改,也就是说,具有此多个十进制数字的任何数字都可以转换为类型T
的值并返回到十进制形式,由于四舍五入或溢出而没有变化。对于base -radix
类型,它是digits
(digits
- 1表示浮点类型)的值乘以 log 10 (radix
)并向下舍入。
对此的解释是explained by Rick Regan here。总之,如果您的二进制浮点格式可以在有效数字中存储 b 位,那么您可以保证能够往返到 d 十进制数字,其中< em> d 是最大的整数
10 d &lt; 2 B'/ EM> -1
对于IEEE754 binary64(现在大多数系统中C ++中的标准double
),则 b = 53,并且2 b -1 = 4,503,599,627,370,496,因此格式只能保证能够代表 d = 15位。
然而,这个结果适用于所有数字,而你只询问整数部分。但是,我们可以通过选择 x = 2 b +1来轻松找到反例,这是格式无法表示的最小整数:for binary64这是9,007,199,254,740,993,也恰好有16位数,所以will need to be rounded。
答案 1 :(得分:1)
您要查找的值是max_exponent10
,其中:
最大正数n是否为10 n 是浮点类型的可表示有限值
由于这种关系:
log 10 x = n
10 n = x
您的计算正在进行,是按照第一个等式的工作方式找到 n :
log10(numeric_limits<T>::max())
max_exponent10
的定义解释说它使用10 n + 1 大于numeric_limits<T>::max()
但是10 n 小于或等于numeric_limits<T>::max()
。 所以numeric_limits<T>::max_exponent10
是您正在寻找的。 strong>
请注意,您仍然需要在示例中使用+ 1
来计算1的位置。 (因为log 10 1 = 0)因此,表示numeric_limits<T>::max()
所需的10位数字将为:
numeric_limits<T>::max_exponent10 + 1
如果您想亲自验证,可以在此处查看: