Revision 51463 of "嵌入式系统/浮点运算单元和定点运算单元" on zhwikibooks

==浮点数==

{{wikipedia|浮点数}}

浮点数是计算机数制的基本概念之一。浮点数(float),是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体来说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。

浮点计算是指浮点数参与的运算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。

一个浮点数a由两个数m和e来表示:a = m × be。在任意一个这样的系统中,我们选择一个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±d.ddd...ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作正规化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。e是指数。

这种设计可以在某个固定长度的存储空间内表示定点数,但无法表示的更大范围的数。

例如,一个指数范围为±4的4位十进制浮点数可以用来表示43210,4.321或0.0004321,但是没有足够的精度来表示432.123和43212.3(必须近似为432.1和43210)。当然,实际使用的位数通常远大于4。

此外,浮点数表示法通常还包括一些特别的数值:+∞和−∞(正负无穷大)以及NaN('Not a Number')。无穷大用于数太大而无法表示的时候,NaN则指示非法操作或者无法定义的结果。

大部份计算机采用二进制(b=2)的表示方法。位(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度和双精度。有一些计算机提供更大的浮点数,例如英特尔公司的浮点运算单元Intel8087协处理器(以及其被集成进x86处理器中的后代产品)提供80位长的浮点数,用于存储浮点运算的中间结果。还有一些系统提供128位的浮点数(通常用软件实现)。

在计算机使用的浮点数被电气电子工程师协会(IEEE)规范化为IEEE 754。

==浮点运算单元==

{{wikipedia|FPU}}

又称浮点运算器(floating point unit,缩写FPU)是执行浮点运算的结构。一般是用电路来实现,应用在计算机芯片中。是整数运算器之后的一大发展,因为在浮点运算器发明之前,计算机中的浮点运算是都是用整数运算来模拟的,效率十分低下。

在一些现代的通用计算机架构中,中央处理器内建的FPU里,浮点运算功能会与SIMD(单指令流多数据流)计算整合在一起。一个主要的例子就是在 Intel 与 AMD 新的 x86 与 x64 处理器里,SSE 指令集取代了 x87 指令集。

而嵌入式计算机则不一定集成了浮点运算单元。因此需要根据微处理器,决定使用浮点运算还是整数运算。

嵌入式系统中,浮点运算受到很多限制。
* 内存(RAM)限制。浮点数运算时需要大量内存,如果内存不足,则可以减少浮点数长度,减少不必要的浮点数,及时回收内存。
* 运算能力限制。双精度浮点数运算耗时长,因此需要尽可能使用单精度表示。对一些算法,需要限制内部循环次数,虽然要损失一部分精度。
* 存储(ROM)限制。根据数值大小,合理分配字节长度、数据类型,能够有效减少程序的体积。

[[en:Embedded Systems/Floating Point Unit]]