保存N个十进制数字需要多少字节

时间:2012-02-25 10:35:28

标签: c algorithm delphi

我有一个任意长度的字符串,表示十进制整数值,并将此字符串转换为纯二进制格式的大整数(不是BCD,超过64位)。

我正在寻找一个很好的简单估计,在没有使用浮点算术的情况下,确保多少个字节可以保存N个十进制数字。

4 个答案:

答案 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。