作者ayn775437403 (@@@@@@@@@@@@@@@@@@@)
看板Electronics
标题[问题] IEEE 754 浮点数运算观念问题
时间Fri May 29 20:56:10 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是多少来决定要不要进位呢?
目前主要就这两个问题,希望各位可以替我解答一下,感激不尽!
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.160.49.195 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Electronics/M.1590756972.A.FD5.html
1F:→ colinshih: 你怎麽手算,浮点就这麽算,但超出的位数用1-bit表示即可 05/29 21:23
谢谢您的回答
但是超出的BIT似乎没办法只用1BIT表示吧?
如果要表示的话,应该至少也要用GUARD和ROUND两个BIT来表示吧?
2F:→ colinshih: 100-0.0011,100 + 0.0011 那一位要设在那?想想就懂了 05/29 22:02
抱歉,小弟资质较差 想了蛮久的还是没办法了解您在说什麽
我是看到白算盘课本上的范例在移位的时候若有超过范围的话
似乎是保留一个GUARD一个ROUND来运算
跟您说的似乎不太一样才会这样问@@..
※ 编辑: ayn775437403 (118.160.49.195 台湾), 05/29/2020 23:32:50
3F:推 colinshih: ex 100+0.0011->100.0+0.01->100.01 g.rs=0.01 05/30 00:21
4F:→ colinshih: 按rounding method 决定mantissa 05/30 00:21
5F:→ colinshih: sticky = next bit of rounding = or(001) 05/30 00:23
6F:→ colinshih: sticky = next bit of rounding = or(011) 修正 05/30 00:24
7F:→ colinshih: 011 是 被加数在 rounding bit 後的数 05/30 00:26
所以依照您的意思来说
我问题一的答案应该是(三)吧?
就是需要加入g r s来判断对吧
※ 编辑: ayn775437403 (114.43.134.169 台湾), 05/30/2020 16:14:03