计算表示任意基数中的整数所需的长度

时间:2013-01-23 03:12:11

标签: math base logarithm radix

我有一个任意基数中整数表示的长度。假设长度为15,基数为36.然后,我想知道所述整数的表示在另一个任意基数中的持续时间。即,转换为基数2可能会导致长度为68.

我知道这是沿着下面的方向发展的,但是我无法理解我需要的地板和天花板,而且我得到了一些结果:

length * log(fromBase) / log(toBase)

3 个答案:

答案 0 :(得分:6)

遵循类似Mathematica的语法,让

Log[b,n]

表示n的基数b的对数。设Log[n]代表n的自然对数。

那么比例

Log[b1,n]/Log[b2,n]

是常数,等于

Log[b2]/Log[b1]

此比率是根据基本b1中的位数计算基数b2中的位数的乘数(反之亦然,如果你看到那样的话)。对于问题中的示例,需要一个15位数的基数为36的数字

15*Log[36]/Log[2] == 77.5489

基数为2位数。当然,这正是您在问题中所拥有的。您只需要将最终答案四舍五入到下一个整数。

当然,我不确定为什么你似乎得到了一些结果。

答案 1 :(得分:3)

遗憾的是,如果不进行高精度计算,就没有确切的解决方案。例如,(我将使用MATLAB进行工作,包括我自己编写的高精度工作工具)2 ^ 200是什么?在基数10中,我们得到:

vpij(2)^200
ans =
    1606938044258990275541962092341162602522202993782792835301376

该数字以二进制表示,使用201个基数2位数。但是,2 ^ 200-1只需要200个基数2位来表示。

vpij(2)^200 - 1
ans =
    1606938044258990275541962092341162602522202993782792835301375

现在,我们可以通过仅取最高位数来计算这些数字的对数,作为双数。我们需要在数字的基数2对数上加1,以便知道表示它的基数为2的数字。

format long g
1 + log2(vpij(2)^200)
ans =
   201

1 + log2(vpij(2)^200 - 1)
ans =
   201

这里log2就是这样做的,用前十进制数来计算那个日志。看到它无法判断第二个数字真的需要少一个数字以二进制形式存储。

vpij2bin(vpij(2)^200)
ans =
100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

vpij2bin(vpij(2)^200 - 1)
ans =
11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

我们可以通过获取这些数字的高精度日志来了解会发生什么。因此,精确到小数点后100位,

log2(hpf(2,100)^200)
ans =
200

log2(hpf(2,100)^200 - 1)
ans =
199.9999999999999999999999999999999999999999999999999999999999991022086719253476184905817230522465495

这两个数字之间的差异非常小。

log10(hpf(2,100)^200) - log10(hpf(2,100)^200 - 1)
ans =
2.702621195974725251000559400026211938865e-61

所以使用日志的任何计算都必须在这里失败,除非本身采用高精度日志。充其量,你可以在正确的数字内,但不超过这个数字。因此,如果您的目标仅仅是为数字分配足够的空间,那么总是分配比显然需要的数字多一个数字。这应该足够,直到你开始使用真正的巨大力量。

(VPIJ是MATLAB中的一个新的可变精度整数形式,它将直接替换我的旧VPI工具。文件交换中已经可以使用HPF。)

答案 2 :(得分:3)

您可以在不使用对数的情况下获得准确的答案。走向任意基座的基数,直到数字适合内部。

Python示例:

def count_digits(number, base):
    radix = 1
    while number >= base ** radix:
        radix += 1
    return radix