为什么在此代码中使用log base 10将int转换为字符串?

问题描述 投票:0回答:4

我看了一篇说明如何将int转换为字符串的文章。在说明中,有一行代码可以获取字符串中的字符数。我想知道为什么要使用log base 10。谢谢。

(int)((ceil(log10(num))+1)*sizeof(char))
c string int
4个回答
0
投票

这是因为它为数字分配了足够的空间以适合字符串。

例如,如果您有数字1034,则为log10(1034) = 3.0145...ceil(3.0145)为4,它是数字中的位数。 + 1用于终止符。

不过,这并不完美:以1000为例。尽管有log(1000) = 3ceil(3) = 3这四个数字,所以这将为太少的数字分配空间。另外,正如下面的@phuclv所提到的,log()函数为此非常耗时,特别是因为数字的长度有一个(相对较低的)上限。

之所以以10为底的对数,是因为该函数大概以十进制形式表示数字。例如,如果它是十六进制,则将使用对数为16的对数。


0
投票

ceil(log10(num))+1是表示num所需的十进制数字的上限。这提供了输出字符串所需的字符数。

例如,如果num = 100,则表达式的值为3,正确的长度为'100'。


0
投票

4位数字,例如4567,将在1,000(含)和10,000(不含)之间,因此它将在10 3(含)和10 4(不含)之间,因此为log10 (4567)将介于3(含)和4(不含)之间。

同样,floor(log10(num))+1将返回用十进制表示正值num所需的位数。

同样地,floor(log10(num))+2将存储数字的十进制表示形式为字符串所需的内存量。 (多余的字符是NUL的字符。)

ceil(log10(num))+1不正确。它等于floor(log10(num))+2,但数字的精确乘方为10,在这种情况下,它比期望的数字小1。


0
投票

数字N具有n个数字,如果10^(n-1) <= N < 10^nn-1 <= log(N) < nn = floor(log(N)) + 1等效。

由于double表示仅具有有限的精度,对于某些值,floor(log(N))可能会偏离1,因此更安全的做法是允许增加一个数字,即分配floor(log(N)) + 2个字符,然后为nul终止符使用另一个字符总共floor(log(N)) + 3

原始问题ceil(log(N)) + 1中的表达式似乎没有算出nul终止符,也没有考虑到四舍五入的可能性,因此,通常它短一,而对于幂十则短两。

© www.soinside.com 2019 - 2024. All rights reserved.