大规模并行处理器编程实战笔记5

来源:互联网 发布:mysql数据库被攻击 编辑:程序博客网 时间:2024/06/13 19:00
浮点运算

1:浮点格式
浮点数的表示:S(符号位),E(阶码),M(尾数)
S:0/1
M:1<=M<2,规范化以后,只需要存储1.xxx后面的xxx部分,1.部分可以省略
E:使用余码表示,方便直接按照无符号数的方式进行比较大小
n位余码的计算方式:对n位原码求补码,再加上(2^(n-1) - 1)构成,等价于对某个十进制数取余
例子:

按照二进制补码的顺序排序的余3码

二进制补码    十进制值   余码表示
000          0         011
001         1         100
010         2         101
011         3         110
100         保留模式   111
101         -3        000
110         -2        001
111         -1        010


按照余码的顺序排序余3码

二进制补码    十进制值   余码表示
100          保留模式   111
101         -3        000
110         -2        001
111         -1        010
000         0         011
001         1         100
010         2         101
011         3         110

故如果使用余码表示,则其二进制的大小排序与十进制的一致,方便运算

故如果是十进制的0.5,使用六位二进制表示(S一位,E三位,M两位)表示成:001000
其中:S = 0,E = 010,M =(1.)00

2:能表示的数
非零数:
可以表示的数间隔取决于阶码(2位表示3个间隔);每个间隔中能表示的数取决于尾数(2位表示4个);这种格式中0没有办法表示;越靠近0的数间隔越小;0附近能表示的数会出现空白;
下溢出:
能够容纳0的一种方法是下溢出,将0附近的8个能表示的数(4个整数,4个负数)都设置为0,但是,0附近的数间隔变大了
非规格化:
IEEE中采用的非规格化的表示方法,在E=0时,不再要求M表示1.xx,而是表示0.xx,阶码表示的间隔不变,即此方法将最后一个间隔内能表示的4个数拉开(本来都在0.5-1之间,现在平均到0-1之间),弥补了0之间的空白区域。

3:特殊的位模式与精度

无穷:阶码所有位为1,尾数为0
NaN(Not a Number):阶码所有位为1,尾数非0

Signaling NaN:将尾数中Most Significant位置0来表示,常用于标记所有没有初始化的数据

quite NaN:将尾数中MostSignificant位置1来表示,常用于用户可以预先知道程序的运行结果,并在通过不同的输入可以得到更为有效的结果时,决定是否要重新运行程序(CUDA应用程序中输出结果时,quietNaN以NaN行四海输出,检测数据损坏的方法)

4:算术运算的准确度和舍入
阶码决定了表示范围,尾数决定了精确度

当操作产生的结果不能表示的时候,就要进行舍入(一般替代为最近的一个可以表示的数)

舍入的情况:浮点算术运算中需要进行预移位,两个操作数的阶码不同的时候,阶码较小的那个操作数的尾数通常需要右移,直到两者的阶码相等为止,而当操作数进行右移的时候,可能从可以表示的范围进入不可表示的放范围,这样就会将其替换称为最近的一个可以表示的数(进行舍入操作),导致准确度受损

5:算法的优化
由于大操作数在运算的时候将会“吃掉”小操作数,所以,在并行数值算法中,常常使用排序,将大小接近的数据放在同一组中进行运算,减少精度的损失
原创粉丝点击