存储大整数

时间:2012-05-16 04:37:24

标签: c++ integer store sqrt

整数:3322000011111010203100311011211322020110122010113111301101000200

以位为单位的字符串将需要整数的log2,即211.xxxx舍入为212位

一些关于剧本的程序说,取这个值的平方根会导致很小,但他需要大量的资金。 sqrt 是 57636793900346419278364744407607.475108338

现在log2(sqrt Integer)= 105.5位

但我担心如果我们不能完美地存储sqrt,我们就无法恢复原来的价值,

问题:我们可以将这个平方根存储在105.5位(如13字节+ 2位等),然后读取和平方值以获得原始值吗?

请指导我。

3 个答案:

答案 0 :(得分:2)

  

但我担心如果我们不能完美地存储sqrt,我们就无法恢复原来的价值,

     

问题:我们可以将这个平方根存储在105.5位(如13字节+ 2位等),然后读取和平方值以获得原始值吗?

没有

基本上,您要问的是,您是否可以获取212位信息,通过取平方根将其压缩为106位,然后能够无损地恢复原始数据。这是不可能做到的。

如果可能,您可以将相同的技术应用于106位,将其压缩到52位,然后压缩到26,依此类推,最终将任意数量的数据压缩到不到一位,同时仍然能够恢复原始数据

答案 1 :(得分:1)

  

问题:我们可以将这个平方根存储在105.5位(就像它一样   13字节+2位等)以及后来读取和平方值得到原始   价值回来?

没有。您需要获取整数(不是浮点)的log_2以查看它需要多少位。例如:Log_2(256)= 8位。该号码可以存储为0x10000000。但是,Log_2(256.123456789)〜= 8位。但是,第二个数字显然有更多的信息。

要解决此问题,您可以将您的值乘以2或10的幂,并将其存储为整数(这基本上是固定点:http://en.wikipedia.org/wiki/Fixed-point_arithmetic)。因此,在您的示例中,将57636793900346419278364744407607.475108338乘以10 ^ 9得到整数:57636793900346419278364744407607475108338,这就是您要存储的内容。其中Log_2是135.4,因此您需要至少136位信息来准确存储该数字。

答案 2 :(得分:0)

你不能这样做,因为一个数字的平方根不是一个整数。你不能准确地存储浮点数。所以,问题是: 1.如果存储平方根,则必须存储浮点数。它本身占用更多空间,也是不准确的。 2.正如AIX所指出的,如果它可能,那么你可以迭代相同的过程,然后只能恢复任意长数,可能只有2个字节。一个用于存储值的字节,另一个用于存储平方的次数。