作者ayn775437403 (@@@@@@@@@@@@@@@@@@@)
看板Grad-ProbAsk
标题[理工] IEEE 754 浮点数运算观念问题
时间Fri May 29 20:22:52 2020
(代PO)
大家好,小弟最近在学浮点数
有几个运算观念卡关,因此来这边求助大家。
这边问题都以IEEE 754 单精度浮点数为例
(即1个sign bit,8个 exponent bit,23个mantissabit)
第一个问题:
两个浮点数在算加减法的时候,exponent小的mantissa要对齐exponent大的mantissa
也就是要看两个浮点数的exponent差距多少来看mantissa要移位多少
那如果exponent小的那个的mantissa在移位过後超过mantissa所能表示的范围
要把超过范围的那几个bit一起算,还是要舍去呢?
举例来说
我要算两个浮点数相减
第一个数:
0 10010011 0000 0000 0000 0000 1111 111
| |------| |--------------------------|
sign exponent mantissa
第二个数:
1 10001110 0000 0000 0000 0111 1111 111
| |------| |--------------------------|
sign exponent mantissa
第一个数的exponent换成十进位是147,第二个数的exponent换成十进位是142
而147-127(bias)=20,142-127=15
所以事实上上面两个数可以变为:
第一个数:
1.0000 0000 0000 0000 1111 111 * 2^20
第二个数:
-1.0000 0000 0000 0111 1111 111 * 2^15
因为第二个数比第一个数的次方少五,所以要右移5个bit
那麽问题来了,移完之後是会变成
(一)所有bit都保留,因此共要28bit表示mantissa
-0.0000 1000 0000 0000 0011 1111 1111 *(2^20)
|----|
这五个bit超过23bit
(二)超过23bit之後直接砍掉,因此满足23bit表示mantissa
-0.0000 1000 0000 0000 0011 111 *(2^20)
(三)加入round,guard,sticky三个bit去考虑,因此用25bit表示mantissa
-0.0000 1000 0000 0000 0011 1111 1 且设S=1(因为砍掉後面三个1)
| |
G R
是上面(一)、(二)、(三)的哪一种呢?
因为这三种不同的移位方式会造成最後答案都不一样,
所以我想IEEE 754应该会有明确的规范。
我个人是比较倾向於第(三)种,
因为如果是第(一)种的话,两个浮点数若exponent差太多
那就要保存一大堆数字,像是两数的exponent如果差了一百
那小的exponent很可能就要保存一百个0外加原本的23个mantissa
等於要保存123个bit,以硬体的角度而言应该是不会这样设计?
第二个问题:
在网路上查到的引入round,guard後的rounding方法大概是这样
若
(一): (G,R) = (0,0)>舍去
(二): (G,R) = (0,1)>舍去
(三): (G,R) = (1,0)>看sticky bit是多少决定要不要舍or进
(四): (G,R) = (1,1)>进位
我对於(一),(二),(四)这三种方式都能接受
但是(三),若(G,R) = (1,0)的话
换成十进位不就是0.5,以四舍五入的角度来说不是就是直接进位吗?
为什麽还要看sticky是多少来决定要不要进位呢?
第三个问题:
如图:
https://imgur.com/a/bqOdrDt
简单来说就是这两个浮点数做减法
并且用2补数的方式来做 中间过程我大概都可以接受
而绿框的部分是最後的结果,因为正规化所以Guard以及Round bit都会往左一位
接着蓝框的部分是要rounding了
我不懂的是
为什麽此时的(G,R)明明是(1,0) 且S=1
应该是要进位的
但是他蓝框的地方却不考虑G,只考虑R
然後就直接舍去了呢?
目前主要就这三个问题,希望各位可以替我解答一下,感激不尽!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.160.49.195 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Grad-ProbAsk/M.1590754974.A.FB1.html
※ 编辑: ayn775437403 (118.160.49.195 台湾), 05/29/2020 21:55:22
1F:→ Handsomeshen: 觉得你GRS没有搞清楚 照那张图 G只有在R==1 s==0 06/01 03:08
2F:→ Handsomeshen: 时才会拿来判断要不要进位 而用G判断的原因是因为 06/01 03:08
3F:→ Handsomeshen: 他=0 =1的机会是一半 公平 很久以前的计组作业 如 06/01 03:08
4F:→ Handsomeshen: 有错误 请多指教 06/01 03:08
5F:推 Handsomeshen: 你第一个问题是3没错 s是被舍弃的部分or起来的 不过 06/01 03:11
6F:→ Handsomeshen: 有R要注意位数 06/01 03:11
7F:推 Handsomeshen: 欧欧欧欧 你的问题应该是GRS位子弄错 都要往前一个B 06/01 03:14
8F:→ Handsomeshen: it 06/01 03:14
你好,感谢你的回覆
针对我第一个问题我有在c_and_cpp版得到解答了
连结在这:
https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1590905575.A.34F.html
所以第一个问题的答案应该是:(一),
也就是运算过程中如果有移位超过mantissa所能表示范围的bit,
仍要保留,并且拿去运算,最後得到的结果再做rounding
不能在运算的过程中就把这些超过的bit给rounding掉
而我有用这个网站验证一下:
http://weitz.de/ieee/
发现如果是用第(三)种方法,答案不是正确的。
不过我现在对GRS的位子有点疑惑。
请问您认为正确的GRS位子会是在哪里呢?
我认为要找GRS,应该是要先做完normalize才能找
我的找法是:G是mantissa最後一个bit的右边第一位,R是G的右边一个bit,
S是R右边所有bit做OR运算
(以IEEE 单精度来举例,mantissa有23bit,
Guard bit就是第24bit,Round bit就是第25bit)
例如:我有一个浮点数加法运算,运算完後得到:
1.1111 0000 1111 0000 1101 1011 0011 1100 * 2^15 (假设已经normalize了)
mantissa多达了32bit,所以要rounding,因此我的G,R会取在:
1.1111 0000 1111 0000 1101 1011 0011 1100 * 2^15
| ||-------|
G R这边做OR得到S=1
G=mantissa的"第24bit",R=mantissa的"第25bit"
所以GR=10,S=1>要进位
=>因此最後答案为1.1111 0000 1111 0000 1101 110 * 2^15
不知道这样理解对不对呢?
谢谢
※ 编辑: ayn775437403 (123.195.195.29 台湾), 06/01/2020 15:28:23
9F:推 Handsomeshen: 不好意思 去年的作业 观念错蛮大的 抱歉造成你的困 06/04 03:58
10F:→ Handsomeshen: 扰 06/04 03:58
12F:→ Handsomeshen: 附上刚刚google的GRS 06/04 03:59
13F:→ Handsomeshen: 祝 考试顺利 06/04 03:59