我的5岁孩子问我:计算机中最大的数字是多少?
我们不是在谈论特定数据类型的最大值,而是计算机可以表示的最大数字。
无限大是不被允许的。
更新:我的孩子总是想要打印出来,那么假设计算机需要打印这个数字并且孩子知道它是一个很大的数字。当然,实际上我们不会打印,因为树木不够用。
我的5岁孩子问我:计算机中最大的数字是多少?
我们不是在谈论特定数据类型的最大值,而是计算机可以表示的最大数字。
无限大是不被允许的。
更新:我的孩子总是想要打印出来,那么假设计算机需要打印这个数字并且孩子知道它是一个很大的数字。当然,实际上我们不会打印,因为树木不够用。
这个问题实际上非常有趣,数学家们已经花了相当多的时间研究它。您可以在这篇文章中阅读到相关内容,这是一篇迷人且容易理解的文章。
简单来说,一个叫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) 及以上的数字大小没有任何人知道。但至少这些数字在数学上是完全明确定义的,不像“任何人类能想出的最大数字再加一。” ;)比特不是数字。作为程序员,你可以赋予它们任何你想要的含义,可能是数字。
现在,我决定将1
表示为“人类有史以来想象到的最大数字加一”。
1
是最大的数字。 - MattA(你的数字,你的数字)
(http://en.wikipedia.org/wiki/Ackerman_function) 并得到了一个相当大的结果。它会在哪里结束? - cobbal这是一个五岁的孩子?
那么,可以用类似以下的说法:“我很想告诉你,但这个数字太大了,说起来需要很长时间,甚至在我说完之前我都会死去。”
// wait to see
for(;;)
{
printf("9");
}
大致上,可用内存位数的2次方。
编辑: 上述内容是为了实际存储一个数字并将所有介质(RAM、硬盘、云等)视为内存。减去操作系统占用(以KB为单位)不会使“大约”更不准确......
如果你想以有意义的方式“表示”一个数字,那么你可能要选择CPU提供的:对于大多数计算机,无符号32位整数(大约4GB)或无符号64位整数。
给5岁孩子们的注释:通常,他们只想要一个事实。给他一个非常大而且非常准确的数字(很多位数),比如4'294'967'295
。然后,一旦他们恢复了清醒,尝试解释计算机如何表示数字。
第二次编辑:我曾经读过这篇文章:谁能说出更大的数字,它应该为您的孩子提供许多有趣的信息。显然,他不是普通的五岁儿童。因此,这可能会启发您关于数字和计算的有趣方向。
(2^(AVAILABLE_MEMORY_IN_BITS+1)) - 1
。 - Aaron Digulla生命的答案(以及这个孩子的问题):42
1^N
,其中N为无符号整数,并由任意大小的比特数组表示。下一个人可以想出10^N
,这将比我的最大数字大十倍。今天我也有同样的问题,于是想着为什么不写一些C++代码来看看计算机会在哪里停止... 但是我的笔记本电脑不在身边,所以我用了另一台电脑,虽然数字太大了,但是程序从未结束,我将再次运行它一个晚上,然后分享最终结果。 你可以试试这个愚蠢的代码。
#include <stdlib.h>
#include <stdio.h>
int main() {
int i = 0;
for (i = 0; i <= i; i++) {
printf("%i\n", i);
i++;
}
}
让它一直运行直到停止^^
2,147,483,647
,而对于64位系统,它将停止在9,223,372,036,854,775,807
。整数具有特定的限制,取决于CPU可以处理的位数。 - Christos LytrasA) 对表达式进行评估,将其转换为某种数字(或矩阵或其他)。 但是这个数字很可能是一个近似值(比如20位的圆周率)。
B) 保留其符号形式以供参考。显然,我们不喜欢盯着符号看,因为我们最终需要调整设备的旋钮。 注意:有时候通过取极限或趋向于无穷来获得一个有限的(非无理数)数字可以在内存中完美地表示(例如数字1)。 不是字面上拥有一个无穷大的数字,而是在符号上表示它。 只需在Wolfram alpha中输入Lim[Exp[-x], x-->> Inf];它会给你一个精确的数字0。
简而言之:
正是人们需要在内存中直接表示数字,导致数字退化。在符号上,它被完美地表示了。 您可以设计一些算法,仅计算pi或欧拉数的下一个数字,从而给您任意精度的数字(当然,这显然不实用)。
我希望这对你至少有点有用或有趣,即使你不同意=)