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应该为此寻找什么?
如果考虑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个小数位