假设任何物理量都可以用64位整数表示而没有上溢或下溢是否合理?


31

如果(low + high) > INT_MAXhttp://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html),则JDK中的原始二进制搜索算法使用32位整数,并且存在溢出错误。。

如果我们使用(带符号的)64位整数重写相同的二进制搜索算法,是否可以假设它low + high永远不会超过INT64_MAX,因为实际上不可能有10 ^ 18字节的内存?

当使用(有符号的)64位整数表示物理量时,是否假定不会发生下溢和溢出是否合理?


4
查看具有关联的无理数的任何物理现象。以圆圈和pi为例。浮点数本质上是有理数的,因此您不能完美无误地表示它。
Thomas Eding

92
太阳中的原子数约为1.2e57,适合190位无符号整数。矛盾的是,64位不能足够大以表示任何物理量。

6
您的问题标题具有误导性。您应该问:“是否有可能有人期望使用大小大于2 ^ 64的排序数组的应用程序?”
布朗

7
或自您开始阅读此注释以来的秒数。
Jodrell 2015年

4
曾经有一段时间,每个人都认为永远不会有2 ^ 32台计算机相互连接。您不希望您的原子必须使用NAT,是吗?
Sebb 2015年

Answers:


58

最简洁的答案是不。但是,对于某些应用,您的假设可能是正确的。

假设一个带符号的int为2 ^ 63,为清楚起见添加了逗号,它们等于9,223,372,036,854,775,808。因此大约是9 * 10 ^ 18。10 ^ 18是“ Exa”。

Wikipedia说: “截至2013年,万维网估计已达到4 ZB。[12]”,即4000 Exabytes。因此,WWW大约是2 ^ 63字节的400倍

因此,至少有一个物理量远大于有符号(或无符号)的64位整数。 假设您的单位是字节。如果您的单位更大,例如千兆字节,那您就可以了,但测量精度会很低。

再举一个例子,考虑远处的星系。仙女座星系实际上是最接近的星系之一,距离我们2.5 * 10 ^ 6光年。 如果您的单位是miles,那将是14.5 * 10 ^ 18,大于一个64位有符号整数。现在,显然这取决于您用于测量的单位,但是有些星系比仙女座更远。(最远的已知距离是13 * 10 ^ 9 LY。)根据您要测量的精度,它可能会溢出64位整数。

添加)是的,英里是天文距离的糟糕单位。一个更普通的单位可能是一个天文单位,大约9300万英里。使用该度量单位,最远的已知星系大约为10 ^ 15 AU(如果我的数学正确的话),它将适合于64位int。但是,如果您还想测量到月球和附近的轨道卫星的距离,则该单位太大。

电子学的另一个例子:法拉(F),一种电容单位。大电容范围高达5kF。随着混合动力汽车,“智能电网”等的改进,这个数字可能会随着时间的推移而增加。一次可以测量的电容小至10 ^ -18F。因此,我们今天可以测量的“实际”电容的总范围为5 * 10 ^ 21,大于64位整数。


3
所有这些都是正确的,但是从实际的角度来看,我们可以质疑测量距离仙女座银河系到银河系的距离(精确地是参考点?)或整个WWW的字节(以这种精度,它会每毫秒变化一次)
Jivan 2015年

45
@Jivan从实用的角度来看,我看不出为什么您需要处理超过640kB的内存。当然,它比您以往任何时候都需要的更多。
ArTs 2015年

2
测量以英里为单位的天文距离的另一个缺点:您容易被猫打翻。
Williham Totland 2015年

2
@Jivan好点。这让我想起了理查德·费曼(Richard Feynman)对将一组恒星的温度求和的愚蠢行为。我明白为什么您想要平均值,最小值,最大值,但是总和?那是什么物理意义?
piojo

6
@piojo-在计算平均值时,总和派上用场。
Scott Whitlock

20

当涉及组合运算符时,您甚至不需要宇宙化。桥梁游戏中有2 ^ 95个可能的交易,而这只是复杂性的一小部分。


有人可能想知道这是否算作“物理量”。
Paul Draper 2015年

2
另一方面,涉及化学或数学的组合学将被视为“物理”。
rwong

@PaulDraper,如果您有足够多的纸牌可以在地面上布置所有这些交易,那将是实际的。这样一来,您涉及的卡片将超过2 ^ 95
布拉德

1
@Brad,我认为OP正在要求“存在”的数量(好吧,存在是一个模糊的概念)。不存在满足数学概念的2 ^ 95张卡片(如果满足,则称为吉尼斯)。很难说什么“计数”什么不是。这个答案只是不能满足我对物理量的糊涂观念。
保罗·德雷珀

17

与您的问题最相关的物理量是计算机RAM

Windows Server 2012 支持最多4 TB的物理内存。那是2 42字节。如果RAM容量每年继续增加一倍,那么从现在起的17年内, “ Windows Server 2032”将支持2 62字节的物理内存,这时您low + high将达到2 63-2并亲吻最大带符号的64位整数。

我希望没有安全关键系统会失败,因为假设64位始终足够。

为了稍微通用一点,最相关的物理量是内存地址空间。(拥有比物理内存大得多的地址空间是有用的,例如,在内存中放置许多堆栈,并且所有这些都有增长的空间。)当前的x86-64实现支持48位虚拟地址,因此我们只有14年的时间才能实现这些CPU。 2 62字节的地址空间限制。

然后是分布式共享内存 “其中(物理上分开的)内存可以作为一个(逻辑上共享的)地址空间进行寻址”。


4
+1您的答案几乎是完全正确的,除了今天的某些类型的软件已经遇到了范围在0xFFFFFFFFxxxxxxxx(即上半部分)范围内的内存地址,例如操作系统或设备驱动程序。
rwong

2
@SiqiLin可能不涉及个人计算。但是,分布式共享内存或DGAS(在本文中提到)是真实的。超级计算机已经以这种方式运行了多年,并且有可能成为跨国云计算基础架构的规范。显然,由典型程序员编写的典型软件代码不会在这种环境中运行-异常环境运行异常(即基础设施)软件。但是一小部分P.SE读者可能只是踏上了这样的职业道路。以防万一。
rwong

1
@Joshua:使用目前的技术(32 GB DDR4),光传播需要7m或23 ns,这似乎与现代CAS延迟完全一致。如果将其推向Landauer的极限原理,硅的密度将达到31 nm或10 ^ -16秒的物理极限。这似乎并不疯狂……好吧,也许只是一点点。
2015年

3
@Joshua这是技术极限,而不是物理极限。(例如,问题在于我们不知道如何实际操作,并非某些物理定律禁止这样做。)因此,尽管本周相关,但它随时可能会发生变化,并取得一些新突破。60年前,人们会发表与您的评论非常相似的评论,因为大约50 KB的内存被认为是RAM,理由是手工缠绕的线圈随后被用作存储核心的一部分,不仅体积很小,而且仍然功能,但它们之间需要有空间以避免EM串扰。
Matthew Najmon

2
我记得24位地址空间(16兆字节)比任何人都需要的或负担得起的多。:-)
鲍勃·贾维斯

10

假设任何物理量都可以用64位整数表示而没有上溢或下溢是否合理?

不完全是。有很多数字都大于或小于该数字,这就是为什么我们有浮点数。浮点数需要权衡较低的精度以获得更好的范围。

在您引用的特定示例中,您极不可能需要比该数字更大的数字。64位对应于大约18亿个元素。但是永远不要说永远。


7

您的假设将无法处理只能由浮点数表示的物理量。即使您决定缩放所有数字,例如将所有数字乘以10000(因此值仍是整数,但可以用千分之一表示),对于非常接近零的数字(例如电子质量),此方案仍然会失败(9.1094 * 10×13 1公斤)。

那是非常真实的(而且非常小)的物理量这是您将要遇到的其他一些问题。如果您认为这不是真实的物理量(即使以千克为单位),请考虑:

10 kg (obviously physical quantity)
1 kg (same)
10⎻² kg (1/100 kg, or about 1/3 ounce) (also quite real)

所以你知道我要去哪里。您不能处理的最后一个。

当然,您可以在数字内有一个特殊字段,以通过变量乘数来放大或缩小整数部分;gee现在您刚刚发明了浮点数。


1
但是您可以指定一个最小物理值(IIRC,对于质量,它等于1电子伏特的质量)。例如,您可以使用(IIRC)200位数字的普朗克长度单位来测量Universe长度。您可以在脑海中谈论普朗克长度的1/10,但从物理上讲是没有意义的。
SJuan76

您不是要除以10000吗?乘以10000只会使来自线程打开器的假设更有可能失败。同样,也许我的设备无法正确显示电子质量,但是应该是10 ^ -31
Mike

我的意思是乘以10000。如果要将1.0001作为整数存储,则需要将其乘以10000,然后再将其存储为10001。 。在Firefox中看起来不错。
tcrosley

@ SJuan76有一种叫做面向未来的东西。在1850年,我们可以谈论10 ^ -20米的单位(比原子小很多,但比普朗克长度大很多),但是从物理上讲,这样做是没有意义的。然后人们弄清楚了原子的内部结构。当然,夸克看起来很基本,但是我们只能说(a)它们的行为方式与我们预期基本粒子的行为方式一致,并且(b)我们还没有发现下一个乌龟。在1850年,我们可以对原子说两件事。如果我们确实找到下一只乌龟,那么1/10普朗克的单位将变得非常有用。
Matthew Najmon

一个普遍的误解是,空间或时间是以普朗克单位量化的!您不能用4维数组来表示宇宙,至少在当前理论中不能这样表示。因此,普朗克长度的一部分物理上是有意义的(但是从广义相对论和/或QM得出的结果开始爆炸或彼此矛盾)。
yatima2975

5

首先,我将回答一个问题:可以/应该用整数表示哪些物理值?

整数表示计算机系统中的自然数(以及它们之间的差),因此将其应用于其他任何东西都是错误的。因此,调用距离或属于连续域的其他数量不是论点。对于这样的数量,有实数表示。而且,您始终可以选择任意大的单位,并以给定的精度拟合任何值。

那么什么是自然数的物理值,它们可以溢出64位整数?

我可以想到两个。物理对象(例如原子)的数量,以及量子系统可以处于的能级。这是严格地为整数的两件事。现在,我知道您可以拆分一个原子,但是它仍然会产生整数,并且您不能无限期地拆分它。两者都可以轻松超过64位无符号整数的范围。原子数更高,一个原子可以处于一种以上的能量状态。

信息是否是物理的还是有争议的。我会说不是。因此,我不会说信息量是物理的。因此,RAM的数量或类似的数量也不是。如果允许的话,原子数很容易超过该数目,因为使用当今的技术需要一个以上的原子来存储一位。


自然数的集合N仅包含非负整数。我知道您的意思,但是“自然数”具有特定的数学定义,与您的使用方式不一致。

我不太确定 整数类型确实代表自然数(当然,在给定范围内)。那不是真的吗 我认为您以为我暗示了集合之间的平等。这是不正确的,任何自然数都可以用整数表示。请注意,我也说过它们之间的差异。我觉得没有必要签署/未签署。仅当您处理差异时,才需要单字型。
luk32

尽管存储的信息的物理性值得商,,并且对于哲学家而不是物理学家来说是一个问题,但存储该信息的机制的物理性是相当确定的。因此,尽管对信息位数的适用性存有疑问,但值得价值的RAM芯片位数却没有。
Matthew Najmon

@MatthewNajmon当然,我同意,这就是为什么我留下最后一句话。在相当长的一段时间内,RAM芯片的位数将低于原子数,因此您可以使用后者。换句话说,当您可以使用同一RAM芯片的原子数时,为什么要使用位数?当前,一些信息由物理系统所处的状态来表示,因此每个原子可以存储多个位,但是如今它离应用程序还很远,我仍然不知道它的数量可以超过这种系统的量子态。但是我完全同意你的前提。
luk32

4

除了Jerry101的答案,我还要提供这种非常简单实用的正确性测试:

假设您malloc在64位操作系统中通过分配了一些内存。假设内存分配器决定向您返回一个有效的内存块,该内存块的大小与您请求的大小相同,但是第63位已设置。

换句话说,假设存在一些编程环境,其中0xFFFFFFFFxxxxxxxx的合法内存范围可能是从调用返回的malloc

问题是,您的代码是否仍将按预期工作?

当32位操作系统发生类似情况时,如果某些软件的内存地址位于“上半部分”,则它们将无法正确运行。最初,这样的内存地址被认为仅可用于特权代码(操作系统,设备驱动程序和外围硬件),但是由于32位地址空间不足,OS供应商决定将部分保留的空间提供给需要它的应用程序。

幸运的是,这种情况不太可能在一段时间内发生,至少在十年内不会发生在64位程序上。

当这种情况最终发生时,这意味着到那时128位可寻址处理器和操作系统将成为主流,并且它们将能够提供“ 64位仿真环境”以允许那些“旧版应用程序”运行在类似于当今64位操作系统的假设下。

最后,请注意,此讨论仅针对内存地址。必须更加谨慎地考虑与时间戳类似的问题,因为某些时间戳格式会将很多精度位分配给微秒,因此会留下更少的位来表示将来的时间。这些问题在Wikipedia上有关2038年问题的文章中进行了概述。


4

您需要根据具体情况提出这个问题。您应该使用一般的假设,即64位算术运算不会溢出,因为即使正确的数量将在很小的范围内,恶意数据源也可能最终给您带来不合理的数量而可能发生溢出,因此最好是为这种情况做好准备,而不是被它意外地击中。

在某些情况下,编写依赖于64位数字不溢出的代码是有意义的。我知道的示例的主要类别是计数器,计数器在每次使用时都会递增。即使以每纳秒一个增量的速率(不实际),溢出也需要一个多世纪的时间。

请注意,虽然乍一看依靠“直到故障的时间”来确定系统的正确性在原则上似乎“总是错误的”,但我们始终使用身份验证/登录来执行此操作。如果有足够的时间(用于暴力破解),则任何此类系统(无论是基于密码,私钥,会话令牌等)都将被破坏。


2

物理量是否可能不适合64位?当然。其他人指出,要计算太阳下的原子数或到下一个星系的毫米数。这种情况是否与您的应用程序有关取决于您的应用程序是什么。如果要计算仓库中任何给定垃圾箱中的物品数量,则16位可能就足够了。如果您要汇总有关世界上满足各种条件的人数的统计信息,则需要能够记录数十亿人口,因此您将需要超过32位,这时您大概会达到64位(因为计算机数量很少具有对37位数字的内置支持,等等)。如果这是一种化学应用,它需要计算原子摩尔数,那么64位将不够。

从技术上讲,仅仅因为当今没有计算机具有2 ^ 64字节的内存,并不一定意味着数组索引永远不会超过2 ^ 64。有一个称为“稀疏数组”的概念,其中数组的许多元素都不实际存储在任何地方,并且这些未存储的值被假定为具有一些默认值,例如null或零。但是我想如果您要编写一个函数来搜索某种数组或某种列表,并且用于将索引保存到数组中的字段的大小是最大可能地址的两倍以上,那么在出现以下情况时检查溢出绝对不需要添加两个索引。


关于稀疏数组的要点。此外,即使阵列已完全填充,也仍然完全有可能(尽管相当慢),并且在某些情况下非常有必要使用一个太大而无法一次将整个阵列都放入RAM的阵列。只需将整个内容存储在速度较慢但容量更大的介质(例如HDD)中,然后将当前正在使用的少量元素拉到RAM即可完成。即使是小的硬盘驱动器,其大小也足以容纳比OP假定的大得多的阵列。
Matthew Najmon

0

假设64位整数可以容纳所有数字是不合理的。多个原因:

  1. 最大和最小64位整数是有限数。对于每个有限数,存在一个越来越大的有限数。

  2. 当前在不同地方使用具有128位和256位数字的计算。许多处理器都有对128位整数进行操作的特定指令。

  3. 20年前,一个1 GB的磁盘被认为是“大”磁盘。今天,一个1 TB的磁盘被认为是很小的。20年前,普通台式机的内存约为16 MB。我当前的桌面有16 GB以上的RAM。过去,硬盘空间和RAM呈指数增长,并且预计将来会呈指数增长。除非有人能提出一个很好的理由来说明它应该停止增长,否则认为它会停止增长是没有道理的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.