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

Jon*_*Mee 5 c++ floating-point decimal max numeric-limits

如果可以输出一个浮点数,以便没有截断值(比如说setpercision),并且数字以固定的表示法输出(比方说fixed),保证整个小数部分所需的缓冲区大小是多少.浮点数可以存储在缓冲区中吗?

我希望标准中有#define一些东西numeric_limits可以告诉我浮点类型的小数部分的最大基数为10的位置.

我在这里询问浮点类型的小数部分中的最大基数为10的数字:浮点数的积分部分中的最大基数为10的数字是多少

但我意识到这可能会更复杂.例如,1.0 / 3.0是一系列无限重复的数字.当我使用fixed格式输出时,我会在重复0之前得到这么多地方:

0.333333333333333314829616256247390992939472198486328125

但我不一定能说这是最大精度,因为我不知道有多少尾随0实际上是在浮点的分数中表示的,并且它没有被负指数向下移动.

我知道我们min_exponent10应该为此寻找什么?

438*_*427 6

如果考虑32位和64位IEEE 754号码,可以按如下所述进行计算.

这完全是关于2的负幂.所以让我们看看每个指数如何贡献:

2^-1 = 0.5         i.e. 1 digit
2^-2 = 0.25        i.e. 2 digits
2^-3 = 0.125       i.e. 3 digits
2^-4 = 0.0625      i.e. 4 digits
....
2^-N = 0.0000..    i.e. N digits
Run Code Online (Sandbox Code Playgroud)

因为基数为10的数字总是以5结尾,你可以看到当指数减少1时,基数为10的数字增加1. 因此2 ^( - N)将需要N位数

另请注意,添加这些贡献时,结果数字的数量由最小数字确定.所以你需要找到的是可以贡献的最小指数.

对于32位IEEE 754,您有:

最小指数-126

分数位23

所以最小的指数是-126 + -23 = -149,所以最小的贡献将来自2 ^ -149,即

对于以10为基数打印的32位IEEE 754,可以有149个小数位

对于64位IEEE 754,您有:

最小指数-1022

分数位52

所以最小的指数是-1022 + -52 = -1074,所以最小的贡献将来自2 ^ -1074,即

对于以10为基数打印的64位IEEE 754,可以有1074个小数位