27

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

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

与其他基数相比,对计算机使用二进制数系统有什么优势,是否曾尝试过其他基数?或者甚至有可能吗?

4

10 回答 10

37

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

现在让我们谈谈“在做数学时,高基数能给你带来什么?”:基数在精度方面完全“没有”。为什么?

如果要使用以 4 为基数,则 16 位以 4 为基数的数字恰好提供 4 16 个不同的值。

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

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

于 2012-06-06T14:37:58.310 回答
23

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

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

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

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

于 2012-06-06T14:24:36.647 回答
12

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

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

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

于 2012-06-06T14:25:29.713 回答
6

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

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

请参阅通常的浮点参考。有关更多详细信息 - 它适用于所有基础。

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

于 2012-06-06T14:31:21.080 回答
6

它归结为从可用芯片面积中获得最大收益。

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

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

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

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

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

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

于 2012-06-06T15:29:37.950 回答
3

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

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

于 2012-06-06T14:28:57.987 回答
1

我不是 EE,所以我在下面所说的一切都可能完全错误。但...

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

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

于 2012-06-06T14:25:28.173 回答
1

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

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

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

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

于 2012-06-06T14:31:19.137 回答
0

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

于 2012-06-06T15:08:19.610 回答
-2

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

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

于 2012-06-06T14:37:45.117 回答