32位计算机如何计算双精度数?

How does a 32-bit machine compute a double precision number

本文关键字:双精度 计算 计算机 何计算 32位      更新时间:2023-10-16

如果我只有32位机器,cpu如何计算双精度数字?这个数字是64位宽的。FPU是如何处理的?

更普遍的问题是,如何计算比我的alu更宽的东西。然而,我完全理解整数的方式。你可以简单地把它们分开。然而,对于浮点数,您有指数和尾数,这应该以不同的方式处理。

并非"32位计算机"中的所有内容都必须是32位的。x87风格的FPU从一开始就不是"32位"的,这是在AMD64创建之前很长一段时间。它总是能够在80位扩展双精度上进行数学运算,而且它曾经是一个单独的芯片,所以根本没有机会使用主ALU。

它比ALU宽,是的,但它不经过ALU,浮点单元使用它们自己的电路,这些电路的宽度与它们需要的一样宽。这些电路也比整数电路复杂得多,并且它们在其组件中并不真正与整数alu重叠

在计算机体系结构中有几个不同的概念可以用位来衡量,但它们都不能阻止处理64位浮点数。尽管这些概念可能是相关的,但为了解决这个问题,还是值得把它们分开考虑。

通常,"32位"表示地址是32位的。这将每个进程的虚拟内存限制为2^32个地址。这是对程序产生最直接影响的度量,因为它影响指针的大小和内存中数据的最大大小。它与浮点数的处理完全无关。

另一个可能的含义是在内存和CPU之间传输数据的路径的宽度。这并不是对数据结构大小的硬性限制——一个数据项可能需要多次传输。例如,Java语言规范不需要doublelong的原子加载和存储。见17.7。非原子处理双长。double可以在内存和处理器之间移动,使用两个单独的32位传输。

第三个含义是总的寄存器大小。许多体系结构使用单独的浮点寄存器。即使通用寄存器只有32位,浮点寄存器也可以更宽,或者可以将两个32位浮点寄存器配对以表示一个64位数字。

这两个概念之间的典型关系是,具有64位内存地址的计算机通常具有64位通用寄存器,因此指针可以放在一个通用寄存器中。

即使是8位计算机也提供了扩展精度(80位)的浮点运算,通过编写代码来进行计算。

现代32位计算机(x86, ARM,较老的PowerPC等)有32位整数和64位或80位浮点硬件。

让我们先看看整数算术,因为它更简单。在你的32位ALU内部,有32个独立的逻辑单元,它们的进位将溢出整个链。1 + 1 -> 10,进位,但结转到第二个逻辑单元。整个ALU也将有一个进位输出,你可以用它来做任意长度的数学运算。但宽度的唯一真正限制是在一个周期内可以使用多少位。要做64位数学运算,你需要2个或更多的周期,并且需要自己做进位逻辑。

无论比特宽度如何,问题似乎只是"FPU是如何工作的?"。

FPU执行加法、乘法、除法等操作。每一个都有不同的算法。

<标题> 添加

(减法)给定两个带指数和尾数的数字:

  • x1 = m1 * 2 ^ e1
  • x2 = m2 * 2 ^ e2

,第一步是规范化:

  • x1 = m1 * 2 ^ e1
  • x2 = (m2 * 2 ^ (e2 - e1)) * 2 ^ e1(假设e2> e1)

可以加上尾号:

  • x1 + x2 = (whatever) * 2 ^ e1

然后,应该将结果转换为有效的尾数/指数形式(例如,(任何)部分可能需要在2^23和2^24之间)。如果我没记错的话,这叫做"重整化"。这里还应该检查溢出和下溢。

<标题>乘法h1> 需将尾数相乘,然后将指数相加。然后将相乘的尾数重新规范化。 <标题> 分工

对尾数进行"长除法"算法,然后减去指数。可能不需要重新规范化(取决于您如何实现长除法)。

<标题>正弦/余弦h1> 输入转换为[0…]π/2],然后运行CORDIC算法。 <标题>等。