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

27

我一直在阅读与浮点数和计算机处理浮点数操作有关的内容。阅读这些内容时,我最常见的问题是为什么它们如此不准确?我知道这是因为二进制无法准确地表示所有实数,因此这些数字会被舍入到“最佳”近似值。

我的问题是,既然我们知道这一点,为什么还要将二进制作为计算机操作的基础?使用一个比2更大的基数是否会大幅提高浮点运算的准确性呢?

使用二进制数系统与其他进位制相比,在计算机中有哪些优势?是否尝试过其他进位制?或者这是否可能呢?


12
因为开关只能是开或关,而计算机则是由很多非常小的开关组成。 - CBredlow
这个问题已经被研究过,而且有一些理论上的优势。例如,你可能想查一下“多值逻辑电路”。 - Bart
16
十进制也存在不准确性——例如,你不能将 1/3 表示为十进制数。 - Vladimir
16
实际上,没有一种浮点数进制可以使所有数字都有有限的表示。以10为基数的浮点数包括像1/3、1/7等(有理数)、epi(无理数)等无法有限表示的数字。更好的问题是针对你的特定问题需要多少精度——你是否可以使用float,或者需要double(甚至是那些支持long double的编译器)? - twalberg
4
准确来说,所有数字的唯一真正准确的表示是达到该数字的描述。这种情况下,符号的使用有点无意义,具有一定的逻辑反转趣味! - Polynomial
显示剩余4条评论
10个回答

37
首先:即使使用100进制,也不能表示所有实数。但是您已经知道这一点了。无论如何,这意味着由于“不能表示所有实数”,将始终存在不准确性。
现在让我们谈谈“在数学中高进制可以为您带来什么”:在精度方面,高基数带来的“没有任何”好处。为什么呢?
如果您想使用4进制,则16位4进制数字提供正好4^16个不同的值。
但是您可以从32位2进制数字中获得相同数量的不同值(2^32 = 4^16)。
正如另一个答案所说的那样:晶体管只能处于开或关状态。因此,您新设计的4进制寄存器需要是(2进制)开/关“位”的抽象。这意味着:使用两个“位”来表示一个4进制数字。但是,仍然只需花费N个“位”(或N/2个4进制数字)就可以获得正好2^N个级别。 您只能通过花费更多的位数而不是增加进制来获得更高的精度。您将您的数字“想象/抽象”成哪种进制(例如,就像printf可以打印这些基于2进制的数字为基于10进制的数字一样)实际上只是一个抽象而不是精度问题。

23

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

忽略晶体管只是简单地按照这种方式工作这一事实,使用不同的基数(例如基数3)将要求这些电路在中间电压状态(或多个状态)以及0V和它们最高操作电压下运行。这更加复杂,并且可能在高频率下导致问题——你怎么能确定一个信号只是在2V和0V之间转换,还是确实处于1V的状态?

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

更新:您还应该查看Tunguska,这是一个三进制计算机仿真器。它使用基数3,而不是基数2,这可以产生一些有趣的(虽然有点费解的)概念。


2
潜在的可能性是存在的,但是它会带来一系列的电气工程问题。数字信号本质上是交流电压源,会受到与物理相邻线路的电磁干扰的影响。板上所有传递高频数字信号的铜线本质上都是一个补丁天线。具有多个电压级别会使失真和尖峰处理变得更加困难。 - Polynomial
3
在多GHz系统中,我们已经很难检测1和0之间的差异(这就是为什么你必须超电压超频处理器),因此使区分不那么明显会放大问题。未来基于量子和光子的计算机可能会帮助我们摆脱这些问题,但现在我们将继续使用传统的二进制晶体管。 - Polynomial
4
使用电压水平来表示数字是模拟计算机的一个方面。这些计算机在50年前比现在要普遍得多。 - High Performance Mark
4
翻译:这句话所说的是正确的,但没有涉及到真正的问题——即增加底数对于表达的准确性没有影响。要想提高精度,只能通过增加分配的存储空间来实现(例如更多的比特、三进制位、十六进制数字、基于100的“分”,等等)。 - Jim Garrison
1
每个 tryte 有729个状态?呃...每个字节256个状态是一个完美的圆数。谁还想要其他的呢? :) - Allon Guralnek
显示剩余8条评论

12
我们的实质是将一个有限空间映射到一个无限的实数集合中。因此,这根本不是基数的问题。
选择2进制,就像多项式所说的那样,是基于实现原因,因为它更容易区分两个能量级别。
我们要么增加空间来表示更多的数字/提高精度,要么限制我们想编码的范围,或者两者兼而有之。

6
你的第一段有意义,但第二段则不合逻辑。更大的基数对精度没有影响。
一个数字的精度取决于用于存储它的存储量 - 例如,一个16位二进制数具有与2 x 256进制数相同的精度 - 两者占用相同的信息量。
有关详细信息,请参见通常浮点参考,并且它推广到所有基数。
是的,计算机已经使用其他基数构建 - 我知道有些使用十进制(十进制)的计算机,请参阅wikipaedia

6

这实际上是指从可用芯片面积中获取最大性能。

如果您使用开/关开关来表示数字,则每个开关的精度不能超过基于2的表示方法。这是因为不管您选择的这些值是什么,N个开关可以表示2^N个数量。早期的机器使用了基于16进制浮点数字,但每个数位需要4个二进制位,因此每个位的整体精度与2进制相同(实际上由于边界情况略低)。

如果您选择不是2的幂的基数,则显然会失去精度。例如,您需要4位来表示一个十进制数字,但其中的6个可用值永远不会被使用。这种系统称为二进制编码的十进制(BCD),通常在涉及货币计算时会偶尔使用。

多级逻辑可以有效地实现其他基数,但至少在当前的芯片技术中,实现多于2级的基数非常昂贵。即使量子计算机也是假设两个量子级别:量子位或qubits。

世界和数学的本质使浮点数的情况变得无望。有一个实数的层次结构:整数 -> 有理数 -> 代数数 -> 超越数。有一个很棒的数学证明,Cantor对角线法,大多数数字,即一个“更大的无限集合”,都是超越数。然而,无论您选择哪种浮点系统,仍将存在一些低级的有理数没有完美的表示(例如十进制中的1/3)。这是我们的宇宙。聪明的硬件设计也不能改变它。

软件可以使用有理数表示,将分子和分母存储为整数。但是,使用这些方法会受到限制。例如,平方根不是“闭合的”。Sqrt(2)没有有理表示。

已进行了代数数表示和“懒惰”表示的研究,用于任意实数,这将随需要生成更多数字。大多数此类工作似乎在计算几何中进行。


3
是的,还有/曾经有过使用非二进制(即非基于2进制表示和算术)的计算机: 十进制计算机
计算机系统的设计者研究了许多替代方案。但很难找到一种与使用两个离散状态的物理设备实现同样简单的模型。因此,从一个非常容易和便宜的二进制电路开始,逐步发展出具有复杂操作的计算机。这就是二进制历史的精华。

1

我不是电子工程师,所以我下面说的一切可能都是完全错误的。但是...

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

如果量子计算机走出实验室,这一切可能都将被彻底颠覆。


1

使用二进制浮点数表示数学实数会出现两个问题--当然,可能还有很多其他问题,但暂时只讨论这两个。

  1. 所有计算机数字都是有限的,因此任何需要无限位数的数字都无法在计算机上准确表示,无论选择哪种数字基数。所以这就解决了π、e和大多数其他实数。
  2. 无论选择哪种基数,都会难以(有限地)表示某些分数。基数2只能近似表示分母为3的任何分数,但基数5或基数7也是如此。

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

我认为二进制表示方式之所以胜出(到目前为止),是因为它简单易懂,而且可以用当前的电子设备实现。


0

我建议我们转向有理数系统存储。使用两个32位整数来计算p/q。乘法和除法将成为非常便宜的操作。是的,会有冗余的计算数字(1/2= 2/4),但谁真正使用64位双精度浮点数的完整动态范围呢。


这将如何加速乘法?每个乘法变成两个乘法(现在分子和分母都必须独立地相乘,因此可以并行进行)。每个除法也变成了两个乘法(我承认,这通常比一个除法要好一些)。此外,每次乘法或除法时,都需要检查溢出并进行调整。例如,如果我做 ((((1/2)*2)/2)*2) 等等,几次后,分子和分母都会溢出。普通的二进制浮点数不会有这个问题,因为 1/2 可以被精确表示。 - ArjunShankar
加减法变成了噩梦。你不仅需要在相加分子之前使分母相等,还需要注意符号。 - ArjunShankar
尽管如此,这是一个有趣的想法! - ArjunShankar
我知道这是我的第四条评论。但是你的想法让我想起了计算机算术课上教给我们的一种奇怪的小数字系统。它被称为“剩余数系统”(RNS),旨在使加法和乘法变得便宜。我预计它会用于一些ASIC中。 - ArjunShankar
另一个好处是,这可以转换为所有整数运算。因此,如果您的系统浮点性能非常差,这可能更好。 - richmb

-2

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

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


1
而后者是一个无限整数,即使你在宇宙中的每个粒子上编码一个数字,也不可能以完全精度存储它。 - Polynomial
如果您无限地链接每个精度级别,例如:在数据库中,您应该能够获得精度的增加,对吗? - user1438003
1
不,圆周率是一个无理数。唯一真正准确的圆周率表述是如何计算它。用任何基编码表示它都需要无限精度和因此需要无限的存储空间。 - Polynomial
@ArjunShankar:收到。重新思考后,答案中的陈述没有问题,因为浮点数的空间是有限的。但是这个陈述也没有任何价值。 - nhahtdh
1
浮点数可以表示为两个整数。可以在理论意义上表示(其中FP和INT都可以具有无限长度),也可以在计算机意义上表示(其中两者都具有固定长度)。这两个组件被称为指数和尾数。 - MSalters
根据维基百科的定义,浮点数是实数的一种表示方式。π是一个实数。但即使我们只考虑有理数(可以表示为a/b,其中a和b是整数),在计算机中也无法表示0到1之间的任何有理数。 - Michael

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