是否可以获取给定地点的小数?

时间:2016-12-22 21:11:47

标签: 64-bit cpu-architecture

几年前,我的一个朋友制作了一个pi程序,它获得了pi的小数,所以如果你像bufferPi(5)那样调用函数调用,它将获得pi的第5个小数位。现在,显然由于计算的限制,并且由于我不太了解的原因,它不可能在某个点之后得到小数位。

所以,让我们说我的灰度图像为2x2(表示面积为4像素),有256种可能的灰度,从纯黑到纯白。每个像素有256种可能的阴影,这意味着有256 ^ 4种灰度,可以在图像中以不同的组合使用。

然而,随着图像越来越大,阴影量越来越大,最终超过了64位计算的限制(仅低于2 ^ 1024)有没有办法,特别是在编程/数学中,以后获取数字或这根本不可能代表吗?

一个例子:在传统编程中取一个大于2 ^ 1024-的数字,这将是一个无限的,不可代表的数字,编译器通常只是将其作为" inf"或者"无穷大"。当然,我可以缩短此范围以下的数字并获得这些数字,但有没有办法在范围之后获得数字。请参阅下文了解更多详情。

我知道这在一定程度上是可能的。请参阅Great Internet Mersenne Prime搜索示例。它会为你的计算机提供一个mersenne prime(一个2的幂,减去1的数字)来试试看是否有任何因素。

这适用于64位计算机,但这些素数通常是2到数千万的幂,指数大于2 ^ 1024。他们是如何做到这一点的,因为这些数字远远超过极限 ,所以计算机如何能够代表数字而不会耗尽内存而不得不求助于传统的#34; INF"

对于模糊的问题感到抱歉,但希望有人知道答案,而不是第一个答案,但对最后一个的回答将是深受赞赏。谢谢! C:

1 个答案:

答案 0 :(得分:0)

这是一个很好的问题,基本上当我们谈论64位计算机时,每个基本数据单元的大小是64位(例如地址长度,整数大小等......)。这样可以轻松添加此大小以下的数字,但要超过此限制,我们需要将数字拆分为多个部分。

例如,让我们考虑使用4位计算机来简化操作: 我们想要添加数字u = 01001010和v = 00101011,但问题是它们太大而无法存储,因此我们将这些数字分散为2的部分:

  

a = 0100 b = 1010(将你从中间分开)

     

x = 0010 y = 1011(通过中间分裂v)

之后:

  

a + x = 0110

     

b + y = 1 0101< - 这太大了!

现在从技术上讲,+ x应该在末尾有额外的4个零,所以当我们添加+ x和b + y时我们实际上需要添加:

  

01100000 + 10101

但是我们无法告诉计算机这样做,因为它只能添加长度为4位的数字。

因此我们需要添加0110和1来获得0111,这是我们的第一个值。然后我们的第二个值变为0101。

因此,最终结果的存储方式是0111和0101(等于01110101,但计算机无法将其存储在1个存储位置)。

这就是计算机如何存储和使用比位数允许的更大数字的算术,通过使用巧妙的技巧来添加和乘以部分数字,然后将每个部分存储在内存中的不同地址,这就是计算机存储大量数字的方式喜欢pi的小数点。