0

整数:3322000011111010203100311011211322020110122010113111301101000200

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

scriptlance 上的一些程序说取这个值的平方根会导致小,但他需要大量没有的钱。sqrt是 57636793900346419278364744407607.475108338

现在 log2 (sqrt Integer) = 105.5 位

但是我担心如果我们不完美地存储 sqrt 我们无法恢复原始值,

问题:我们能否将这个平方根存储为 105.5 位(将其舍入,如 13 字节 + 2 位等),然后读取并平方值以获取原始值?

请指导我。

4

3 回答 3

2

但是我担心如果我们不完美地存储 sqrt 我们无法恢复原始值,

问题:我们可以将这个平方根存储在 105.5 位中(将它像 13 字节 + 2 位等四舍五入),然后读取并平方值以获取原始值吗?

不。

基本上,您是在问是否可以获取 212 位信息,通过取平方根将它们压缩为 106 位,然后能够恢复原始数据而不会丢失。这是无法做到的。

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

于 2012-05-16T06:23:09.867 回答
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 位信息才能准确存储该数字。

于 2012-05-30T13:36:30.973 回答
0

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

于 2012-05-16T07:19:48.260 回答