浮点数积分部分中的最大基数为10的数字是多少

时间:2016-09-29 17:27:44

标签: c++ floating-point max decimal numeric-limits

我想知道标准中是否有某些内容,例如#definenumeric_limits中的内容,它会告诉我浮点的整数部分中的最大基数为10的数字类型。

例如,如果我有一些浮点类型,其最大值是:1234.567。我想在标准中定义一些能告诉我4类型的东西。

我这样做有选择吗?

template <typename T>
constexpr auto integral_digits10 = static_cast<int>(log10(numeric_limits<T>::max())) + 1;

2 个答案:

答案 0 :(得分:2)

正如Nathan Oliver在评论中指出的那样,C ++提供了std::numeric_limits<T>::digits10

  

可以由类型T表示的基数为10的数字,无需更改,也就是说,具有此多个十进制数字的任何数字都可以转换为类型T的值并返回到十进制形式,由于四舍五入或溢出而没有变化。对于base - radix类型,它是digitsdigits - 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是您正在寻找的。

请注意,您仍然需要在示例中使用+ 1来计算1的位置。 (因为log 10 1 = 0)因此,表示numeric_limits<T>::max()所需的10位数字将为:

numeric_limits<T>::max_exponent10 + 1

如果您想亲自验证,可以在此处查看:

http://coliru.stacked-crooked.com/a/443e4d434cbcb2f6