关于IEEE 754双精度浮点数(double)
關于IEEE 754標準下的浮點數
(全文以64位為例,規定64位中包括1位符號位,11位階碼和52位尾數)
1.符號位
沒什么可說的,一位,分正負罷了。
2.階碼
階碼由于偏移量的存在,其值會被加上1023(在IEEE754中特殊規定的,純粹為了方便計算)。
例如:
如果本來是2的5次方,那么轉換后將會是1028,即(10000000100)2;
如果是2的-1次方,轉換后將會是1022,即(01111111110)2。
那么階碼的取值,在0至2047之間。其中,0和2047是特別的,如果是2047,那么無論尾數是多少,這個數都是無窮大,即溢出。而當階碼是0時,將分開另講。
3.尾數
(1)一般情況,也稱規格化情況
在階碼為1至2046時,尾數前有一位隱藏位,默認置1,小數點默認在尾數第一位之前。
例如:
尾數為0000…000(52個0),那么實際上表示的數是1.000…000(52個0);
尾數為101010000…0(自行湊52位吧),那么實際上表示的是1.101010000…0。
這么做的原因自然是能多一位,更精確。
至此,可以得知:階碼為1至2046(即不是全0或全1時),一個64位浮點數的值是:
(1.尾數)×2(階碼-1023)(記得看符號位分正負)
(2)特殊情況,非規格化
階碼為0的情況
此時尾數前無隱藏位,小數點默認在尾數第一位與第二位之間。
例如:
尾數為100…0(51個0)表示(1.00…0)2(51個0)而不是(1.100…0)2(51個0),不再具有隱藏位。
尾數為00…001(51個0)表示(0.000…0001)2=2-51,小數點后是50個0,而不是(1.00…001)2也不是(0.00…001)2=2-52(不是小數點后51個0)。
至此,可以得知,階碼為全0時,64位浮點數的值是:
(小數點加在一二位之間的尾數)×2-1023
階碼全1的情況
認為此數超出上界,溢出。
4.結論
由上邊的分析可以最終得出:
絕對值最小值:階碼全0,尾數為00…01(51個0)時,對應的值是(0.00…01)2×2-1023(小數點后50個0),即2(-51-1023)=4.94e-324約為5×10-324
絕對值最大值:階碼為11…10,尾數全1時,對應的值是(1.11…1)2×21023(小數點后52個1),即
(2-2-52)×21023=1.7977e+308約為1.8×10308
需要注意的是,若要使用浮點數表示整數,僅能表示到(1.11…1)2×252(小數點后52個1),即
253-1=9007199254740991,約為9×10^15,并不像某些一知半解的人所謂“double根本不能表示任何整數”,也不是任何時候都使用double都可以,不過它至少比int大,但顯然沒有也不應該有long大(畢竟都是64位)。
由于只有尾數擁有精確度,階碼僅能表示數量級,故認為其最小精度為2-52,約為2.22×10-16。(并不是說其表示的數與數之間的間隔是10-16,這太可笑了)個人認為,是在階碼相當的情況下,數與數之間的相對間隔,這種類似的概念。
老生常談:絕對值超出上界上溢,溢出處理報錯;絕對值超出下界下溢,按機器0處理,不報錯。
double擁有0與-0,符號位分別為0和1,其余位全0。編碼上是有區別的,c++中計算1.0/0.0和1.0/-0.0分別得到INFINITY與–INFINITY,或許這就是其根本原因。
參考:
https://www.boatsky.com/blog/26
https://blog.csdn.net/abcdu1/article/details/75095781
(第二篇里推薦的工具很好用,貼過來嘻嘻)
進制轉換工具:
http://tool.oschina.net/hexconvert/
單精度浮點數內存中編碼:
https://www.h-schmidt.net/FloatConverter/IEEE754.html
雙精度浮點數內存中編碼:
http://www.binaryconvert.com/convert_double.html
總結
以上是生活随笔為你收集整理的关于IEEE 754双精度浮点数(double)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: commit翻译中文_commit的意思
- 下一篇: Scons 安装