计算机中最大的数字是多少?

40

我的5岁孩子问我:计算机中最大的数字是多少?

我们不是在谈论特定数据类型的最大值,而是计算机可以表示的最大数字。

无限大是不被允许的。

更新:我的孩子总是想要打印出来,那么假设计算机需要打印这个数字并且孩子知道它是一个很大的数字。当然,实际上我们不会打印,因为树木不够用。


17
我的总是比你的多一个!(这回答了问题吗?) - Konrad Rudolph
5
我很喜欢几乎所有的回答都没有考虑到这个问题是由一个5岁小孩提出的。 - BoltClock
7
很遗憾,这个问题已经关闭了。实际上它相当有趣。假设您的硬盘容量为1TB(8'000'000'000'000位),并且您想将可容纳在其中的数字以十六进制数字形式打印在纸上(虽然没有人会这样做,但让我们假设一下),那么这需要2,000,000,000,000个十六进制数字。每页可以容纳4000个十六进制数字(40 x 100个数字)。现在将这些页面叠放在一起(假设每页厚度为0.004英寸/0.1毫米),则这个堆叠高度将达到5公里。 - Thomas Mueller
13
关闭投票怎么了?唉。 - NullUserException
3
你认为关于计算机可以存储的最大数字的问题是“具体的编程问题”吗? - Michael Mrozek
显示剩余4条评论
16个回答

47

这个问题实际上非常有趣,数学家们已经花了相当多的时间研究它。您可以在这篇文章中阅读到相关内容,这是一篇迷人且容易理解的文章。

简单来说,一个叫Tibor Rado的人试图通过定义一个序列(称为忙碌的海狸数)来找到一些真正大但仍然明确定义的数字。他将BB(n)定义为任何图灵机在输入n个符号后停机之前能够进行的最大步骤数。请注意,由于其本质特征,这个序列是不可计算的,因此数字本身虽然被明确定义,但非常难以确定下来。以下是前几个数字:

BB(1) = 1
BB(2) = 6
BB(3) = 21
BB(4) = 107

...等待...

BB(5) >= 8,690,333,381,690,951
没有人确定 BB(5) 到底有多大,但它是有限的。而 BB(6) 及以上的数字大小没有任何人知道。但至少这些数字在数学上是完全明确定义的,不像“任何人类能想出的最大数字再加一。” ;)
那么计算机可以表示的最大数字是什么呢?就是一个足够小以适应其可用内存的程序在停止前可以执行的最多指令数。
平方吗?等等,是立方。不对,是自己的乘方!
该死!

4
那是一个很棒的文章链接。谢谢! - Yehonatan
这并不是一个由 n 个符号组成的输入集合 -- 这将是图灵机带上已有的符号。这里真正指的是 10 条“规则”,图灵机的磁头在执行对带子上的计算时遵循这些规则。 - Billy ONeal
本回答是一篇很棒的文章。 - peterh

35

比特不是数字。作为程序员,你可以赋予它们任何你想要的含义,可能是数字。

现在,我决定将1表示为“人类有史以来想象到的最大数字加一”。


4
可能不符合问题的本意... :) - annakata
3
那么,毫无疑问,1 是最大的数字。 - Matt
+1。非常好的观点。其他人似乎只考虑整数。但是位并不是数字——例如,一个64位浮点数的范围远大于0..2^64-1。 - Niki
3
“人类所能想象到的最大数字再加一”并不明确定义......而且计算机可能已经想出比人类想象的更大的数字了 ;) - Tom Crockett
然后我调用 A(你的数字,你的数字) (http://en.wikipedia.org/wiki/Ackerman_function) 并得到了一个相当大的结果。它会在哪里结束? - cobbal
显示剩余2条评论

24

这是一个五岁的孩子?

那么,可以用类似以下的说法:“我很想告诉你,但这个数字太大了,说起来需要很长时间,甚至在我说完之前我都会死去。”


3
如果可以的话,我希望能给你加2分。这是第一个真正回答问题的答案。 - Icode4food
5
我在想关于“dieing bit”的问题,也许“睡前”或其他什么时间会更好。 - Jaydee
1
不不不不不,如果这个孩子足够聪明地提出了一个很棒的问题,那么他或她就不应该被告知一个荒谬而傲慢的答案。孩子们并不愚蠢,不要对他们傲慢。爸爸 - 你通过来到这里已经做了一件伟大的事情,我希望你在解释接受的答案方面有所帮助。 - Simon Nicholls

20
//  wait to see
for(;;)
{
    printf("9"); 
}

6
它会停止,只是不自动停止。 - Gabe
它停止了,那就是答案吗? - Yehonatan
3
这是一个相对较小的数字。当计算机失去能源时,打印9将停止。这会在地球坍塌进入太阳、宇宙坍塌或解体之前发生。由此产生的999...9是一个远远小于BB(100)的数字。 - Adrian
2
@Adrian Fritsch,你是对的,无论如何,加上printf(" BB(");作为第一行仍然有效..当然,最后一个出来的,请关闭括号。 - Hernán Eche
@Adrian Fritsch谢谢你对这个答案感兴趣,但我真的更喜欢(并投票支持)Alexandre C.的答案。无论如何,如果你注意到的话,你会明白一个想法:如果你能提出任何有重复版本的固定表达式,那么算法版本会更大-时间是我的朋友-也许任何数字表示都可以有一个重复的版本,那么如果我们在“有限领域”竞争,你的符号有意义,但如果领域是无限的,那么最聪明的概念的简单重复将更大。 - Hernán Eche

13

大致上,可用内存位数的2次方。

编辑: 上述内容是为了实际存储一个数字并将所有介质(RAM、硬盘、云等)视为内存。减去操作系统占用(以KB为单位)不会使“大约”更不准确......

如果你想以有意义的方式“表示”一个数字,那么你可能要选择CPU提供的:对于大多数计算机,无符号32位整数(大约4GB)或无符号64位整数。

给5岁孩子们的注释:通常,他们只想要一个事实。给他一个非常大而且非常准确的数字(很多位数),比如4'294'967'295。然后,一旦他们恢复了清醒,尝试解释计算机如何表示数字。

第二次编辑:我曾经读过这篇文章:谁能说出更大的数字,它应该为您的孩子提供许多有趣的信息。显然,他不是普通的五岁儿童。因此,这可能会启发您关于数字和计算的有趣方向。


7
减去操作系统需要的640K。 - user151323
2
实际上它是 (2^(AVAILABLE_MEMORY_IN_BITS+1)) - 1 - Aaron Digulla
@开发者艺术:短语“可用内存”已经考虑了操作系统和任何其他当前运行的程序使用的内存。 - slebetman
孩子有很多保存了的文件,里面有非常大且非常准确的数字。要超过他们是很困难的。 - Yehonatan
5
“显然,他不是一个普通的5岁孩子。” - 我不知道。 5岁的孩子很擅长问类似这样深奥的问题。 问题在于大多数5岁以下的孩子1)没有意识到这个问题有多深奥,2)没有知识去理解答案,3)注意力甚至无法聆听答案。 - Stephen C
显示剩余6条评论

5

生命的答案(以及这个孩子的问题):42


这里唯一明智的答案 - Milan Velebit

3
这取决于你用来表示它的数据类型。计算机只存储比特(0/1)。作为开发人员,我们赋予比特含义。(65可以是数字或字母A)。
例如,我可以将我的数据类型定义为1^N,其中N为无符号整数,并由任意大小的比特数组表示。下一个人可以想出10^N,这将比我的最大数字大十倍。
当然,会有间隔,但如果你不需要它们,那就没关系。
因此,这个问题是没有意义的,因为它没有上下文。

2

今天我也有同样的问题,于是想着为什么不写一些C++代码来看看计算机会在哪里停止... 但是我的笔记本电脑不在身边,所以我用了另一台电脑,虽然数字太大了,但是程序从未结束,我将再次运行它一个晚上,然后分享最终结果。 你可以试试这个愚蠢的代码。

#include <stdlib.h>
#include <stdio.h>

int main() {
    int i = 0;

    for (i = 0; i <= i; i++) {
        printf("%i\n", i);
        i++;
    }
}

让它一直运行直到停止^^


我们清楚地知道它会在哪里停止;对于32位系统,它将停止在2,147,483,647,而对于64位系统,它将停止在9,223,372,036,854,775,807。整数具有特定的限制,取决于CPU可以处理的位数。 - Christos Lytras

1
我认为您应该为您的5岁孩子已经开始提出这样的问题而感到非常自豪。您应该继续推广这一点!这真是太棒了!话虽如此,我认为说无限不计算是对计算机内存中数字含义思考不正确。我觉得这种思考方式是一种障碍。
数学家永远无法写出π或欧拉数的所有数字,但我们完全理解它。例如,π可以由无限级数完美表示:(π / 4)= 1-1/3 + 1/5 - 1/7 + 1/9 - ...
仅因为你不能真正地去到无穷大或在控制台中打印每个单独的数字并不意味着什么。您可以打印代表π的符号,从而捕获inf.系列。计算机代数系统(CAS)一直在以符号方式表示数字。例如,π可能是内存中的符号对象(内存中的二进制码并没有直接表示数字。它代表着一个“用于生成任意精度答案的数学算法”)。然后,您进行一些数学计算,从一个表达式转换为另一个表达式。在任何时候,我们都没有完全地表示该数字。
最后,您可以对此做两件事情:

A) 对表达式进行评估,将其转换为某种数字(或矩阵或其他)。 但是这个数字很可能是一个近似值(比如20位的圆周率)。

B) 保留其符号形式以供参考。显然,我们不喜欢盯着符号看,因为我们最终需要调整设备的旋钮。 注意:有时候通过取极限或趋向于无穷来获得一个有限的(非无理数)数字可以在内存中完美地表示(例如数字1)。 不是字面上拥有一个无穷大的数字,而是在符号上表示它。 只需在Wolfram alpha中输入Lim[Exp[-x], x-->> Inf];它会给你一个精确的数字0。

简而言之:

正是人们需要在内存中直接表示数字,导致数字退化。在符号上,它被完美地表示了。 您可以设计一些算法,仅计算pi或欧拉数的下一个数字,从而给您任意精度的数字(当然,这显然不实用)。

我希望这对你至少有点有用或有趣,即使你不同意=)


1
不太了解理论,但从你的问题中我理解的是:计算机可以表示的最大数字是多少(并且我补充一点:在合理的时间内,而不是打印“9”直到地球被太阳吞噬)。我让我的电脑进行了一个简单的计算(用PHP或任何语言):echo pow(2,1023) - 结果为:8.9884656743116E+307。因此,我猜这是我的电脑可以计算的最大数字。另一方面,我认为最大负数的表示可能是:-0,(0)1。
注:该计算值是通过PHP获得的,但我试图弄清楚我的Windows计算器可以计算的最大数字,它是pow(2,33219)=8.2304951207588748764521361245002E+9999。现在我想这是我的电脑可以处理的最大数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接