简介
浮点处理器是指计算机中用于处理浮点数运算的处理器,在大多数情况下,浮点处理器只是作为辅助处理器,完成中央处理器完成其无法执行或执行效率、效果低下的处理工作。在科学计算中,由于大部分计算都是浮点数运算,这时浮点处理器可以加快运算速度和提高系统执行效率,这时的浮点处理器一般也称作定制处理器。
浮点数定义浮点型简单讲就是实数的意思。浮点数在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法。利用浮点进行运算,称为浮点计算,这种运算通常伴随着因为无法精确表示而进行的近似或舍入。
浮点数用于表示非整数数值。它由3个域组成:符号、指数、尾数。这种表示方法能够极大拓展数值编码的范围,因此浮点数是处理实数的选择。利用处理器中集成的浮点运算单元(FPU),可以加快浮点运算的速度。浮点的一种替代方案是定点,定点的指数域采用固定形式。但是,如果在没有 FPU 的处理器上使用定点,尽管可以获得更快的运算速度,但数值范围和动态范围较小。因此,在使用定点方法时,开发人员必须仔细检查定点算法中的缩放比/饱和问题。C 语言为浮点运算提供 单精度和 双精度两种类型。matlab 或 scilab 等高级建模工具主要使用单精度或双精度浮点生成 C 代码。如果不支持浮点,则必须修改生成的代码,使其适合定点。同时,所有浮点运算代码都需要由程序员手动编写。在代码中使用原生浮点运算时,可有效缩短项目的开发时间。浮点运算是实现任何数学算法有效的方法。
浮点运算单元由于浮点运算适合两个数之间的任何运算,因此它需要非常多的资源。例如,我们需要:
对齐两个数值(使两个数值的指数相同) 执行运算;舍入结果;对结果进行编码。
在没有 FPU 的处理器上,这些运算全部由软件通过 C 编译器库完成,并且对程序员不可见;但这样做性能非常低。在有 FPU 的处理器上,对于大部分指令而言,所有运算都由硬件在单个周期内完成。C 编译器不使用其自身的浮点库,但会直接生成 FPU 原生指令。
在有 FPU 的处理器上执行数学算法时,程序员不必在性能和开发时间之间做出选择。利用FPU,可以通过 matlab 或 scilab 等高级工具直接可靠地使用任何生成的代码,同时确保实现性能。
标准在计算机科学领域,浮点运算已有多年的使用历史。早在上世纪三十年代末,德国的Konrad Zuse 开发 Z 系列计算机时,就已开始使用浮点运算。但是,由于支持浮点运算的硬件实现起来非常复杂,因此数十年来浮点运算一直没有得到广泛应用。上世纪五十年代中期,IBM 公司在其 704 大型机中引入 FPU;到七十年代,尽管已有多种平台支持浮点运算,但这些平台都采用自己的编码技术。1985 年,IEEE 发布了统一浮点运算的 754 标准,定义了支持浮点运算的通用方法。C 语言的浮点数类型 Float 和 Double 采纳了IEEE754 标准中所定义的单精度 32 位浮点数和双精度 64 位浮点数的格式1。
数值格式
所有值均由三个域组成:
符号:s
偏置指数:
— 指数之和 = e
— 常数值 = 偏置值
小数(或尾数):f
可以使用各种长度对值进行编码:
16 位:半精度格式
32 位:单精度格式
64 位:双精度格式
IEEE 定义了五类不同的数:
规格化数:标准浮点数
非规格化数:非规格化数用于表示过小而无法规格化的值(当指数为 0 时)。
零:零值加上符号用于表示饱和运算(正或负)。指数和小数均为空。
无穷大:无穷大值加上符号用于表示 +∞ 或 -∞。溢出或除以 0 时会产生无穷大值。指数设置为其最大
值,尾数为空。
NaN(非数字):NaN 用于表示不明确的运算结果,例如 0/0 或负数的平方根。指数设置为其最大值,尾数不为空。尾数的 MSB 用于判断该值是 QNaN(可通过后续运算传播)还是 SNaN(生成错误)。
舍入模式
该标准定义了以下四种主要舍入模式:
最近舍入
向 +∞ 舍入
向 -∞ 舍入
向 0 舍入
最近舍入是默认的舍入模式(最常用)。如果与两个最近值的距离相等,则选择 LSB 等于 0的值。舍入模式会改变算数运算的结果,因此非常重要。可以通过 FPU 配置寄存器更改舍入模式。
异常和异常处理
该标准支持 5 种异常:
无效运算:运算结果为 NaN
除以零
上溢:根据舍入模式,运算结果为 +/-∞ 或 +/-最大值
下溢:运算结果为非规格化数
结果不准确:由舍入所致
可用两种方式处理异常:
可以生成陷阱。陷阱处理程序会返回要使用的值来替代异常结果。
可以生成中断。中断处理程序不能返回要使用的值来替代异常结果。
协处理器为了提高计算机运算速度,用来弥补微处理器在数值计算方面不足的浮点运算部件2。是微处理器的一种。是一种协助中央处理器完成其无法执行或执行效率、效果低下的处理工作而开发和应用的处理器。这种中央处理器无法执行的工作有很多,比如设备间的信号传输、接入设备的管理等;而执行效率、效果低下的有图形处理、声频处理等。为了进行这些处理,各种辅助处理器就诞生了。整数运算器与浮点运算器已经集成在一起,因此浮点处理器已经不算是辅助处理器。而内建于CPU中的协处理器,同样不算是辅助处理器,除非它是独立存在。