如果我只有32位机器,那么cpu如何计算双精度数字?这个数字是64位宽。 FPU如何处理它?32位机器如何计算双精度数字
更一般的问题是,如何计算更广泛的东西,然后我的alu。但我完全理解整数的方式。你可以简单地split他们。然而,对于浮点数,你有指数和尾数,这应该被不同地处理。
如果我只有32位机器,那么cpu如何计算双精度数字?这个数字是64位宽。 FPU如何处理它?32位机器如何计算双精度数字
更一般的问题是,如何计算更广泛的东西,然后我的alu。但我完全理解整数的方式。你可以简单地split他们。然而,对于浮点数,你有指数和尾数,这应该被不同地处理。
甚至8位计算机通过编写代码来执行扩展精度(80位)浮点运算。
现代32位计算机(x86,ARM,较旧的PowerPC等)具有32位整数和64或80位浮点硬件。
如果32位计算机只有32位浮点硬件会怎样?然后怎样呢? (多数民众赞成在有趣的部分:) – hr0m
让我们先看看整数算术,因为它更简单。在你的32位ALU内部,有32个单独的逻辑单元带有进位位,会溢出链条。 1 + 1 - > 10,进位但转到第二个逻辑单元。整个ALU也会有一个进位位输出,你可以用它来做任意长度的数学运算。宽度的唯一真正限制是您可以在一个周期内处理多少位。要做64位数学运算,需要2个或更多的周期,并且需要自己完成进位逻辑。
似乎这个问题只是“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。
等等没问题,可以用硬件完成,即使在32位计算机上也可以。我理解数学概念。我明白它是如何在软件中完成的。不过谢谢你的总结 – hr0m
有在计算机体系结构,可以在比特来测量的几个不同的概念,但它们都没有防止在处理64位浮点数。虽然这些概念可能是相互关联的,但对于这个问题,这是值得考虑的。
通常,“32位”意味着地址是32位。这将每个进程的虚拟内存限制为2^32个地址。这是对程序最直接的区别,因为它会影响指针的大小和内存数据的最大大小。这与处理浮点数完全无关。
另一个可能的含义是在内存和CPU之间传输数据的路径的宽度。这不是对数据结构大小的硬性限制 - 一个数据项可能需要多次传输。例如,Java语言规范不要求原子加载和double
或long
的存储。见17.7. Non-Atomic Treatment of double and long。 A double
可以使用两个独立的32位传输在内存和处理器之间移动。
第三个含义是通用寄存器大小。许多架构使用单独的寄存器来实现浮点。即使通用寄存器只有32位,浮点寄存器也可以更宽,或者可以将两个32位浮点寄存器配对为一个64位数。
这些概念之间的典型关系是具有64位存储器地址的计算机通常具有64位通用寄存器,因此指针可以放入一个通用寄存器中。
它只是*复杂*比int64,但可以处理2个32位数据。 – Jarod42