如果我只有32位机器,那么cpu如何计算双精度数?这个数字是64位宽。 FPU如何处理它?</ p>
更普遍的问题是,如何计算更广泛的东西,然后我的alu。但是我完全理解整数方式。你可以简单地split他们。然而,对于浮点数,您有指数和尾数,应该进行不同的处理。
答案 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进行加法,乘法,除法等。每个算法都有不同的算法。
(也减法)
给出两个带指数和尾数的数字:
m1 * 2 ^ e1
m2 * 2 ^ e2
,第一步是规范化:
m1 * 2 ^ e1
(m2 * 2 ^ (e2 - e1)) * 2 ^ e1
(假设e2> e1)然后可以添加尾数:
(whatever) * 2 ^ e1
然后,应该将结果转换为有效的尾数/指数形式(例如,(任何)部分可能需要在2 ^ 23和2 ^ 24之间)。如果我没有弄错的话,这称为“重整化”。这里还应该检查溢出和下溢。
只需乘以尾数并添加指数即可。然后重新规范乘以的尾数。
在尾数上做一个“长除法”算法,然后减去指数。可能没有必要重新规范化(取决于你如何实现长除法)。
将输入转换为范围[0 ...π/ 2],然后对其运行CORDIC算法。