我一直在阅读与浮点数和计算机处理浮点数操作有关的内容。阅读这些内容时,我最常见的问题是为什么它们如此不准确?我知道这是因为二进制无法准确地表示所有实数,因此这些数字会被舍入到“最佳”近似值。
我的问题是,既然我们知道这一点,为什么还要将二进制作为计算机操作的基础?使用一个比2更大的基数是否会大幅提高浮点运算的准确性呢?
使用二进制数系统与其他进位制相比,在计算机中有哪些优势?是否尝试过其他进位制?或者这是否可能呢?
我一直在阅读与浮点数和计算机处理浮点数操作有关的内容。阅读这些内容时,我最常见的问题是为什么它们如此不准确?我知道这是因为二进制无法准确地表示所有实数,因此这些数字会被舍入到“最佳”近似值。
我的问题是,既然我们知道这一点,为什么还要将二进制作为计算机操作的基础?使用一个比2更大的基数是否会大幅提高浮点运算的准确性呢?
使用二进制数系统与其他进位制相比,在计算机中有哪些优势?是否尝试过其他进位制?或者这是否可能呢?
计算机是建立在晶体管上的,它们有一个“开启”状态和一个“关闭”状态。这对应于高电压和低电压。几乎所有数字集成电路都以这种二进制方式工作。
忽略晶体管只是简单地按照这种方式工作这一事实,使用不同的基数(例如基数3)将要求这些电路在中间电压状态(或多个状态)以及0V和它们最高操作电压下运行。这更加复杂,并且可能在高频率下导致问题——你怎么能确定一个信号只是在2V和0V之间转换,还是确实处于1V的状态?
当我们降到浮点数级别时,我们正在(正如nhahtdh在他们的答案中提到的那样)将一个无限空间的数字映射到有限的存储空间中。这绝对保证我们会失去一些精度。然而,IEEE浮点数的一个优点是精度相对于数值大小而言。
更新:您还应该查看Tunguska,这是一个三进制计算机仿真器。它使用基数3,而不是基数2,这可以产生一些有趣的(虽然有点费解的)概念。
这实际上是指从可用芯片面积中获取最大性能。
如果您使用开/关开关来表示数字,则每个开关的精度不能超过基于2的表示方法。这是因为不管您选择的这些值是什么,N个开关可以表示2^N个数量。早期的机器使用了基于16进制浮点数字,但每个数位需要4个二进制位,因此每个位的整体精度与2进制相同(实际上由于边界情况略低)。
如果您选择不是2的幂的基数,则显然会失去精度。例如,您需要4位来表示一个十进制数字,但其中的6个可用值永远不会被使用。这种系统称为二进制编码的十进制(BCD),通常在涉及货币计算时会偶尔使用。
多级逻辑可以有效地实现其他基数,但至少在当前的芯片技术中,实现多于2级的基数非常昂贵。即使量子计算机也是假设两个量子级别:量子位或qubits。
世界和数学的本质使浮点数的情况变得无望。有一个实数的层次结构:整数 -> 有理数 -> 代数数 -> 超越数。有一个很棒的数学证明,Cantor对角线法,大多数数字,即一个“更大的无限集合”,都是超越数。然而,无论您选择哪种浮点系统,仍将存在一些低级的有理数没有完美的表示(例如十进制中的1/3)。这是我们的宇宙。聪明的硬件设计也不能改变它。
软件可以使用有理数表示,将分子和分母存储为整数。但是,使用这些方法会受到限制。例如,平方根不是“闭合的”。Sqrt(2)没有有理表示。
已进行了代数数表示和“懒惰”表示的研究,用于任意实数,这将随需要生成更多数字。大多数此类工作似乎在计算几何中进行。
我不是电子工程师,所以我下面说的一切可能都是完全错误的。但是...
二进制的优点在于它可以非常清晰地映射到实际电路中的开/关(或者更准确地说是高/低电压)状态。我认为,试图区分多个电压状态可能会更具挑战性。
如果量子计算机走出实验室,这一切可能都将被彻底颠覆。
使用二进制浮点数表示数学实数会出现两个问题--当然,可能还有很多其他问题,但暂时只讨论这两个。
多年来,基于具有超过2个状态的设备的电路的计算机已经被建造出来。旧苏联开发了一系列带有3态设备的计算机,至少有一家美国计算机制造商曾经提供使用10态设备进行算术运算的计算机。
我认为二进制表示方式之所以胜出(到目前为止),是因为它简单易懂,而且可以用当前的电子设备实现。
我建议我们转向有理数系统存储。使用两个32位整数来计算p/q。乘法和除法将成为非常便宜的操作。是的,会有冗余的计算数字(1/2= 2/4),但谁真正使用64位双精度浮点数的完整动态范围呢。
我既不是电气工程师也不是数学家,所以在我做出以下陈述时请考虑这一点:
所有浮点数都可以表示为整数。