我看了一篇说明如何将int转换为字符串的文章。在说明中,有一行代码可以获取字符串中的字符数。我想知道为什么要使用log base 10。谢谢。
(int)((ceil(log10(num))+1)*sizeof(char))
这是因为它为数字分配了足够的空间以适合字符串。
例如,如果您有数字1034,则为log10(1034) = 3.0145...
。 ceil(3.0145)
为4,它是数字中的位数。 + 1
用于终止符。
不过,这并不完美:以1000为例。尽管有log(1000) = 3
和ceil(3) = 3
这四个数字,所以这将为太少的数字分配空间。另外,正如下面的@phuclv所提到的,log()
函数为此非常耗时,特别是因为数字的长度有一个(相对较低的)上限。
之所以以10为底的对数,是因为该函数大概以十进制形式表示数字。例如,如果它是十六进制,则将使用对数为16的对数。
ceil(log10(num))+1是表示num所需的十进制数字的上限。这提供了输出字符串所需的字符数。
例如,如果num = 100,则表达式的值为3,正确的长度为'100'。
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。
数字N
具有n个数字,如果10^(n-1) <= N < 10^n
与n-1 <= log(N) < n
或n = floor(log(N)) + 1
等效。
由于double
表示仅具有有限的精度,对于某些值,floor(log(N))
可能会偏离1,因此更安全的做法是允许增加一个数字,即分配floor(log(N)) + 2
个字符,然后为nul终止符使用另一个字符总共floor(log(N)) + 3
。
原始问题ceil(log(N)) + 1
中的表达式似乎没有算出nul终止符,也没有考虑到四舍五入的可能性,因此,通常它短一,而对于幂十则短两。