2015-08-23 44 views
5

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

更一般的问题是,如何计算更广泛的东西,然后我的alu。但我完全理解整数的方式。你可以简单地split他们。然而,对于浮点数,你有指数和尾数,这应该被不同地处理。

+0

它只是*复杂*比int64,但可以处理2个32位数据。 – Jarod42

回答

9

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

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

+0

好吧,这就是我的想法。要么FPU能够做到这一点,因为它的设计很少额外,或者是由软件完成的,它解决了编译器 – hr0m

1

甚至8位计算机通过编写代码来执行扩展精度(80位)浮点运算。

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

+0

如果32位计算机只有32位浮点硬件会怎样?然后怎样呢? (多数民众赞成在有趣的部分:) – hr0m

1

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

+0

是的,据我所知,正如我已经写过的那样。但是如何处理浮点?那不是那么简单,因为这个数字是内部分解成指数和mantisse的。 – hr0m

+1

@ hr0m你分割它们,然后使用这些任意的精度例程在有效数字上进行数学运算。指数和符号很容易适合正常类型。手动完成所有规范化和舍入等操作有点复杂,但可以完成。基本上,遵循硬件算法,但采用更软件的方式(如迭代和分支)。 – harold

1

似乎这个问题只是“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之间)。如果我没有弄错,这就是所谓的“重整化”。这里还应该检查溢出和下溢。

乘法

只需乘以尾数并加上指数即可。然后重新规格化相乘的尾数。

请在尾数是“长除法”的算法,然后减去的指数。重整化可能不是必要的(取决于你如何实施长分工)。

正弦/余弦

转换输入到范围[0 ...π/ 2],然后在其上运行的算法CORDIC

等等
+1

没问题,可以用硬件完成,即使在32位计算机上也可以。我理解数学概念。我明白它是如何在软件中完成的。不过谢谢你的总结 – hr0m

2

有在计算机体系结构,可以在比特来测量的几个不同的概念,但它们都没有防止在处理64位浮点数。虽然这些概念可能是相互关联的,但对于这个问题,这是值得考虑的。

通常,“32位”意味着地址是32位。这将每个进程的虚拟内存限制为2^32个地址。这是对程序最直接的区别,因为它会影响指针的大小和内存数据的最大大小。这与处理浮点数完全无关。

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

第三个含义是通用寄存器大小。许多架构使用单独的寄存器来实现浮点。即使通用寄存器只有32位,浮点寄存器也可以更宽,或者可以将两个32位浮点寄存器配对为一个64位数。

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