32位计算机如何计算双精度数?
How does a 32-bit machine compute a double precision number
如果我只有32位机器,cpu如何计算双精度数字?这个数字是64位宽的。FPU是如何处理的?
更普遍的问题是,如何计算比我的alu更宽的东西。然而,我完全理解整数的方式。你可以简单地把它们分开。然而,对于浮点数,您有指数和尾数,这应该以不同的方式处理。
并非"32位计算机"中的所有内容都必须是32位的。x87风格的FPU从一开始就不是"32位"的,这是在AMD64创建之前很长一段时间。它总是能够在80位扩展双精度上进行数学运算,而且它曾经是一个单独的芯片,所以根本没有机会使用主ALU。
它比ALU宽,是的,但它不经过ALU,浮点单元使用它们自己的电路,这些电路的宽度与它们需要的一样宽。这些电路也比整数电路复杂得多,并且它们在其组件中并不真正与整数alu重叠
在计算机体系结构中有几个不同的概念可以用位来衡量,但它们都不能阻止处理64位浮点数。尽管这些概念可能是相关的,但为了解决这个问题,还是值得把它们分开考虑。
通常,"32位"表示地址是32位的。这将每个进程的虚拟内存限制为2^32个地址。这是对程序产生最直接影响的度量,因为它影响指针的大小和内存中数据的最大大小。它与浮点数的处理完全无关。
另一个可能的含义是在内存和CPU之间传输数据的路径的宽度。这并不是对数据结构大小的硬性限制——一个数据项可能需要多次传输。例如,Java语言规范不需要double
或long
的原子加载和存储。见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算法。 <标题>等。 标题>标题>标题>标题>标题>- Fmod 函数清楚地输出一个预期的双精度值,但 if(fmod == 预期的双精度值)的计算结果不是 true
- 为什么 2 个双精度值之间的差值计算错误?
- 如何使用 2 个迭代器进行求和函数计算映射<字符串、双精度>
- 通过更改代码格式来计算结构向量中包含的双精度变量的平均值的不同结果?
- C++ [链接器错误] 未定义对"执行计算(字符,双精度)"的引用
- 小数点后的数字,用于双精度变量/C++计算
- 如何计算双精度/浮点C++中的位数
- 涉及双精度数的计算
- c++ 如何计算涉及双精度数据类型模数的数学表达式
- 用C++计算小双精度数时出错
- 为什么我所有的双精度计算都在循环中给出相同的结果
- 用双精度计算 pow 会给出错误的结果
- c++ linux x86_64中如何控制双精度计算以避免舍入误差
- 在不切割变量的情况下计算双精度
- 在计算双精度值期间,错误计数增加
- 计算双精度数组中所有元素的和
- 按降序计算双精度
- 使用EXPECT_EQ计算双精度或浮点数的和时出错
- 浮点计算给出的结果与使用双精度计算的结果不同
- C++计算比双精度或长双精度更精确