我有一个任意长度的字符串,表示十进制整数值,并将此字符串转换为纯二进制格式的大整数(不是BCD,超过64位)。
我正在寻找一个很好的简单估计,在没有使用浮点算术的情况下,确保多少个字节可以保存N个十进制数字。
答案 0 :(得分:17)
不使用浮点运算:对于N
十进制数字,需要
(98981 * N) / 238370 + 1
字节。 98981/238370是一个很好的有理逼近(从上面)到log(10)/log(256)
(9 th 收敛),整数除法截断,因此加1。公式对于N < 238370
来说是紧的,表示10^N - 1
所需的字节数完全由此给出,它高估了N
238370的倍数和非常大 N
。如果你不太害怕过多地分配奇数字节,你也可以使用(267 * N) / 643 + 1
,(49 * N) / 118 + 1
,(5 * N) / 12 + 1
或浪费大约10%的空间(N + 1) / 2
正如@HenrickHellström指出的那样,在Delphi中,必须使用div
运算符进行整数除法(错过了delphi标记)。
答案 1 :(得分:6)
你需要这么多位:ceil(N/log10(2))
。向上舍入到8的下一个倍数,即ceil((N/log10(2))/8)+1
字节。
答案 2 :(得分:1)
((size_t)ceil(N/log10(2)) + CHAR_BIT - 1) / CHAR_BIT
现在,1/log10(2)
〜= 3.32
可以近似为10.0/3
= 3.3(3)
。
因此,没有浮点数,它最多只能是(((size_t)N*10+2)/3 + CHAR_BIT - 1) / CHAR_BIT
个C字节。
当N
很大时,请注意溢出。
答案 3 :(得分:0)
您可能正在寻找fixed point arithmetic
定点类型的最大值只是最大值 可以在底层整数类型中表示,乘以 比例因子;并且类似地为最小值。 例如,考虑表示为二进制的定点类型 带有二进制补码格式的b位的整数,带有缩放因子 1 / 2f(即最后的f位是小数位):最小值 可表示的值是-2b-1 / 2f,最大值是(2b-1-1)/ 2f。