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

时间:2015-08-23 14:47:40

标签: c++ double hardware

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

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

4 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

答案 3 :(得分: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算法。