二进制、浮点数和现代计算机

Posted

技术标签:

【中文标题】二进制、浮点数和现代计算机【英文标题】:Binary, Floats, and Modern Computers 【发布时间】:2012-06-10 13:55:54 【问题描述】:

我已经阅读了很多关于浮点数和计算机处理的浮点运算的内容。我在阅读它们时看到的最大问题是为什么它们如此不准确?我理解这是因为二进制不能准确地表示所有实数,所以这些数字被四舍五入到“最佳”近似值。

我的问题是,知道了这一点,为什么我们仍然使用二进制作为计算机操作的基础?使用大于 2 的基数肯定会以指数方式提高浮点运算的准确性,不是吗?

相对于其他基数,计算机使用二进制数系统有什么优势,是否曾尝试过其他基数?还是有可能?

【问题讨论】:

因为一个开关只能打开或关闭,而一台计算机是一堆非常小的开关。 这个其实已经研究过了,有一定的理论优势。例如,您可能想查找“多值逻辑电路”。 十进制也不准确 - 例如,您不能将 1/3 表示为十进制。 实际上,没有浮点基数可以让所有数字都具有有限表示。 Base-10 有诸如 1/3、1/7 等(有理数)和 epi(非有理数)之类的东西,它们没有有限的表示要么。更好的问题是您的特定问题需要多少精度 - 您可以使用浮点数,还是需要双精度数(对于那些支持它们的编译器,甚至是长双精度数)? @twalberg 正是。所有数字唯一真正准确的符号是对如何获得该数字的描述。在有趣的逻辑扭曲中,这使得符号变得毫无意义! 【参考方案1】:

首先:即使使用以 100 为底的数字,您也无法表示所有实数。但您已经知道这一点。无论如何,这意味着:由于“无法表示所有实数”,总会出现不准确。

现在让我们谈谈在做数学时高基数可以给你带来什么?”:高基数正好能带来'nothing'精度方面。为什么?

如果您想使用以 4 为基数,则 16 位以 4 为基数的数字正好提供 416 个不同的值。

但是您可以从 32 位以 2 为底的数字中获得相同数量的不同值 (232 = 416)。

正如另一个答案已经说过的:晶体管可以打开或关闭。因此,您新设计的以 4 为基数的寄存器需要是(以 2 为基数)开/关“位”的抽象。这意味着: 使用两个“位”来表示以 4 为基数的数字。但是您仍然会通过花费 N 个“位”(或 N/2 个以 4 为基数的数字)准确地获得 2N 个级别。 您只能通过花费更多位而不是通过增加基数来获得更好的准确性。你“想象/抽象”你的数字在哪个基数(例如printf 可以如何以基数 10 打印这些基数为 2 的数字)实际上只是抽象问题,而不是精度问题。

【讨论】:

【参考方案2】:

计算机建立在晶体管之上,晶体管具有“开启”状态和“关闭”状态。这对应于高电压和低电压。几乎所有的数字集成电路都以这种二进制方式工作。

忽略晶体管只是简单地以这种方式工作的事实,使用不同的基极(例如基极 3)将需要这些电路在中间电压状态(或多个)以及 0V 及其最高工作电压下工作。这更复杂,并且可能导致高频问题 - 您如何判断信号是在 2V 和 0V 之间转换,还是实际上在 1V?

当我们进入浮点级别时,我们(正如 nhahtdh 在他们的回答中提到的那样)将无限的数字空间映射到有限的存储空间。这是绝对保证我们会失去一些精度。不过,IEEE 浮点数的一个优点是精度与值的大小有关。

更新:您还应该查看Tunguska,一个三元计算机模拟器。它使用 base-3 而不是 base-2,这产生了一些有趣(尽管令人费解)的概念。

【讨论】:

可能,但它会带来一系列电气工程问题。数字信号本质上是交流电压源,会受到来自物理本地线路的电磁干扰的影响。板上所有有高频数字信号通过的铜线本质上是一个贴片天线。拥有多个电压电平会使失真和尖峰更加难以处理。 我们已经很难在多 GHz 系统中检测 1 和 0 之间的差异(这就是您必须对超频处理器进行超压的原因),因此使差异不那么明显会放大问题。未来,基于量子和光子的计算机可能让我们摆脱这些问题,但目前我们将坚持使用传统的二进制晶体管。 @PRNDLDevelopmentStudios:使用电压电平表示数字是模拟计算机的一个方面。这些过去(50 年前)比现在普遍得多。 这是正确的,但没有解决真正的问题,即增加基数对表示的准确性没有影响。您只能通过增加分配的存储空间来提高精度(即更多位、'trits'、十六进制数字、以 100 为底的“美分”等) 每个尝试 729 个状态?呃……每字节 256 个状态是一个完美的整数。谁还想要别的? :)【参考方案3】:

我们本质上是将有限空间映射到无限实数集。所以无论如何,这甚至不是基地的问题。

选择 Base 2,就像 Polynomial 所说的那样,出于实现原因,因为它更容易区分 2 个能量级别。

我们要么投入更多空间来表示更多数字/提高精度,要么限制我们想要编码的范围,或者混合使用它们。

【讨论】:

【参考方案4】:

归根结底是充分利用可用芯片面积。

如果您使用开/关开关来表示数字,则每个开关的精度都不会比使用 base-2 表示更准确。这仅仅是因为无论您选择什么值,N 个开关都可以表示 2^N 个数量。早期的机器使用 16 位浮点数,但每一个都需要 4 个二进制位,因此每位的整体精度与 2 位相同(实际上由于边缘情况而略低)。

如果您选择的基数不是 2 的幂,那么精度显然会丢失。例如,您需要 4 位来表示一位十进制数字,但从不使用这 4 位的可用值中的 6 个。这个系统被称为二进制编码的十进制,它仍然偶尔使用,通常在用钱进行计算时。

多级逻辑可以有效地实现其他基础,但至少以目前的芯片技术,实现超过 2 级的成本非常昂贵。甚至量子计算机也在设计中假设两个量子级别:量子比特或量子比特。

世界和数学的本质使浮点情况变得无望。实数有一个层次结构整数 -> 有理数 -> 代数 -> 超越数。有一个很棒的数学证明,康托尔对角化,大多数数字,即比其他集合“更大的无穷大”,是超越的。然而,无论您选择哪种浮点系统,仍然会有没有完美表示的低有理数数(即以 10 为底的 1/3)。这是我们的宇宙。再多聪明的硬件设计也无法改变它。

软件可以并且确实使用有理表示,将分子和分母存储为整数。然而,有了这些,你的程序员就束手无策了。例如,平方根不是“封闭的”。 Sqrt(2) 没有有理表示。

已经对代数数表示和任意实数的“惰性”表示进行了研究,可以根据需要产生更多数字。这种类型的大部分工作似乎都属于计算几何。

【讨论】:

【参考方案5】:

你的第一段是有道理的,但第二段是不合情理的。较大的基数不会对精度产生影响。

数字的精度取决于用于它的存储量 - 例如,16 位二进制数与 2 x 256 基数具有相同的精度 - 两者占用的信息量相同。

有关更多详细信息,请参阅Usual floating point reference. - 它适用于所有基础。

是的,计算机是使用其他基数构建的 - 我知道使用基数 10(十进制)的计算机,参见 wikipaedia

【讨论】:

【参考方案6】:

是的,有/曾经有使用二进制以外的计算机(即,除了 base 2 表示和算术): Decimal computers.

计算系统的设计者已经研究了许多替代方案。但是很难找到一个模型,它比使用两个离散状态的模型更容易在物理设备中实现。因此,从一个二进制电路开始,该电路非常容易构建,并且可以用于具有复杂操作的计算机。简而言之,这就是二进制的历史。

【讨论】:

【参考方案7】:

我不是 EE,所以我在下面说的所有内容都可能完全错误。但是……

二进制的优势在于它可以非常清晰地映射以区分实际电路中的开/关(或更准确地说,高/低电压)状态。我认为,试图区分多个电压会带来更多挑战。

如果量子计算机走出实验室,这可能会完全消失。

【讨论】:

【参考方案8】:

使用二进制浮点数表示数学实数会产生 2 个问题 - 嗯,可能还有很多问题,但暂时 2 个就足够了。

    所有计算机编号都是有限的,因此任何需要 无限个数字不能准确地表示在一个 计算机,无论选择什么基数。这样处理 pi, e, 以及大多数其他实数。 无论选择什么基数都将难以代表(有限地)某些分数。底数 2 只能逼近分母中因子为 3 的任何分数,但底数 5 或底数 7 也可以。

多年来,计算机的电路基于具有 2 种以上状态的设备。旧苏联开发了一系列具有 3 态设备的计算机,并且至少有一家美国计算机制造商曾提供使用 10 态设备进行算术运算的计算机。

我怀疑二进制表示已经胜出(到目前为止),因为它很简单,既可以推理也可以用当前的电子设备实现。

【讨论】:

【参考方案9】:

我投票赞成我们迁移到有理数系统存储。将评估为 p/q 的两个 32 位整数。乘法和除法将是非常便宜的运算。是的,会有多余的评估数字(1/2 = 2/4),但无论如何,谁真正使用了 64 位双精度的完整动态范围。

【讨论】:

这将如何加速乘法?每个乘法变成两个乘法(现在分子和分母都必须相乘,尽管是独立的;所以它们可以并行完成)。每个除法也变成两个乘法(我承认,这通常比一个除法好一些)。此外,每次乘法或除法时,都需要检查溢出和调整。例如如果我做了 ((((1 / 2) * 2) / 2) * 2) .. 等等,几次,最终,分子和分母都会溢出。常规的二进制浮点数不会有这个问题,因为 1/2 可以精确表示。 加法/减法变成了一场噩梦。您不仅需要在添加分子之前使分母相等,还需要注意符号。 不过,这是一个有趣的想法! 我知道这是我的第四条评论。但是你的想法让我想起了他们在计算机算术课上教我们的一个奇怪的小数字系统。它被称为"residue number system" (RNS),它旨在使加法和乘法变得便宜。我希望它会进入一些 ASIC。 另一个好处是它可以分解为所有整数数学。因此,如果由于某种原因您的系统的浮点性能非常差,这可能会更好。【参考方案10】:

我既不是电气工程师也不是数学家,所以在我做以下陈述时要考虑到这一点:

所有浮点数都可以表示为整数。

【讨论】:

而后者是一个无限整数,即使你在宇宙中的每个粒子上编码一个数字,也不可能以最完整的精度存储。 如果您无限期地链接每个精度级别,例如:在数据库中,您应该能够提高精度,不是吗? 没有。 Pi 是一个无理数。 Pi 唯一真正准确的表示是对如何计算它的描述。以任何基本编码表示它都需要无限的精度,因此需要无限的存储空间。 @ArjunShankar:要点。再想想,答案中的陈述没有错,因为浮点数的空间是有限的。但无论如何,该语句也没有任何价值。 浮点数可以表示为两个整数。无论是在理论意义上(FP 和 INT 都可以具有无限长度)还是在计算机意义上(两者都具有固定长度)。这两个分量称为指数和尾数。

以上是关于二进制、浮点数和现代计算机的主要内容,如果未能解决你的问题,请参考以下文章

浮点数

计算机组成原理——浮点数表示方法

js浮点数精度误差问题,解决方法

Java之浮点数运算

计算机2进制小数点表示法

IEEE754表示浮点数