記錄遊戲引擎架構-遊戲軟件工程基礎3.2.1.4的理解
組成元素
一個浮點數由三部分組成:尾數(mantissa),指數(exponent),符號位。
這三部分根據不同的標準可以按不同的方式去安排這三部分在內存中的格式,我們按照最流行的IEEE-754標準來說明
若使用符號位s(1或者-1),尾數m,指數e去表達一個值v,則v=s**(1+m)
- 符號位顯而易見就是控制該值是正數還是負數
- 尾數表示小數點前後相關的數字,
- 指數表示尾數相關數字的小數點位於哪裏,換句話說就是控制尾數位數左移還是右移的
首先說下每部分所佔用的位數和所佔位的位置:
- 符號位佔用1位,位於最高位31位
- 指數佔用8位,位於30~23位
- 尾數佔用23位,位於22~0位
下面再說下每部分的數值如何計算(0b表示後面的數字用二級製表示):
- 符號位的值s,當0b0時,值爲1,表示當前值爲正數;當0b1時,值爲-1,表示當前值負數
- 指數值e,值在0~254(0xEF)之間,255含有特別意義,表示無窮大或者NaN,所以我們的的值在~之間
- 尾數的第一位是隱藏的,默認爲1,並且不佔用內存,以後每一個都代表2的倒數冪,比如0b01000000000000000000000表示1+0*+1*+0*+...+0*其中的1可以理解爲1*,這樣就能理解前面說的隱藏的第一位,且默認爲1
32位浮點數表示如下:
符號位31| 指數位 23| 尾數位 0|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
舉幾個例子說明:
- 1.如下位模式表示
0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
內存由低到高爲 0x3F200000
- 2.最大值表示
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
這裏還涉及一個問題,當v減去,意思是尾數23位後的數字,表示第24位尾數
這個時候v的值是不變的,因爲該位不存在於當前32位中,同樣的道理用於來計算值
的在於需愛浮點值稱爲機器的epsilon值, ,小於的值加不到23尾的尾數上,23位之後的位都被截除了