1、单精度浮点数累加和误差研究 摘要:计算机中进行浮点数加法运算时,需要进行对阶和右规格化操作,该操作会进行舍入处理,这种处理过程会产生误差,浮点数累加运算会造成误差的累积,导致计算结果精度不够甚至计算结果错误。通过实验手段研究单精度浮点数累加过程中不同结合顺序对浮点数累加和误差的影响,探索结合顺序导致计算误差的规律,为多核计算、GPU计算、多处理器计算等计算范型和计算结构提供选择结合方法的依据,便于发挥其并行计算的优势。 关键词:单精度浮点数;累加和;误差;结合顺序;右规格化 中图分类号:TP301.6;TP311.11 0引言 浮点数是现代计算机系统表示实数的一种方法,由于计算机中表示浮点数的
2、长度有限,所以不能表示全部的实数,任何计算机采用的浮点数表示方法都只能表示实数的一个子集。而浮点数是现实生活中普遍存在的数据类型,广泛地应用于科学、工程、金融等生活领域中。多数计算机程序设计语言提供了对浮点数据类型的支持,许多计算机从硬件级别就设立了专门的浮点运算器,以提高浮点数的运算性能。 浮点数表示规范有其天然的不足,由于舍入、截断等操作,会造成计算误差,并在计算过程中堆积和扩散。在很多情况下,由于没能很好地控制误差的堆积和扩散,最终造成计算的失败1,所以浮点数计算精度的研究不仅有理论价值,而且有重要的实践意义。 当前的多核计算、GPU计算、多处理机计算、多线程计算等计算范型或计算结构都提
3、供了改变原有串行计算顺序的手段。像浮点数的累加和运算等,需要利用结合律改变原来的顺序累计为并行累加。但浮点数的特点却使得累计顺序的改变导致计算误差的诞生,寻找合适的结合顺序就成了提高并行度而不损失计算精度的一种重要途径。 现在的处理器结构和程序语言基本都支持IEEE7542浮点数规范。该标准有IEEE单精度和IEEE双精度两种基本的浮点规范。单精度浮点数长度短,可表示的数据范围有限,在计算时会产生较大的误差3。在当代计算机体系结构上,32位单精度浮点数操作的性能至少是64位双精度浮点数操作性能的2倍4。本文以单精度浮点数为研究对象,研究不同的结合顺序对浮点数累加和的影响。 在机器中,为保证浮点
4、数表示的唯一性,浮点数在机器中都是以规格化形式存储的。对于IEEE754标准的浮点数来说,尾数必须是1.M的形式。由于两个定点小数的尾数相加运算后,尾数有可能不是1.M形式,为此必须进行规格化操作。规格化操作包括左规和右规两种情况。左规操作是将尾数左移,同时阶码减值,直至尾数成为1.M的形式。右规操作则将尾数右移1位,同时阶码增1。浮点运算在对阶或右规时,尾数需要右移,被右移出去的位会被丢掉,从而造成运算结果精度的损失。为了减少这种精度损失,可以将一定位数的移出位先保留起来,称为保护位,在规格化后用于舍入处理。 IEEE754标准中规定了四种舍入方向:最近舍入(roundtonearest)、
5、向负无穷大舍入(roundtoward-)、向正无穷大舍入(roundtoward+)以及向0舍入(roundtoward0)10。由于最近舍入是默认舍入模式,故只介绍这种模式。这种舍入模式规定当有两个最接近的可表示的值时首选“偶数”值。例如,对于32位单精度浮点数来说,若超出可保存的23位的多余位大于等于10001,则多余位的值超过了最低可表示位值的一半,这种情况下,舍入的方法是在尾数的最低有效位上加1;若多余位小于等于01111,则直接舍去;若多余位为10000,此时再判断尾数的最低有效位的值,若为0则直接舍去,若为1则再加1。最后要进行溢出判断。浮点数的溢出根据运算结果阶码值是否产生溢出进行判断11。若阶码值超出阶码所能表示的最大正数,则为上溢,进一步,若此时浮点数为正数,则为正上溢,记为+,若浮点数为负数,则为负上溢,记为-;若阶码值超出阶码所能表示的最小负数,则为下溢,进一步,若此时浮点数为正数,则为正下溢,若浮点数为负数,则为负下溢。正下溢和负下溢都作为0处理12。第 3 页 共 3 页