1,三個部分
4字節的單精度浮點數32個位分3個部分:
1.1,從左往右第一位是符號位,0正1負;
1.2,緊接的8個位是指數部分,不要糾結是原碼,反碼還是補碼,只是一個不帶符號位的二進制數,都一樣。取值區間是[0,255],0和255有特殊含義;取值在[1,254]的情況下,需要減去127才是真正的指數值,這時指數取值是[-126,127]。
1.3,剩余的23位是尾數部分,用于表示浮點數的小數部分;也是一個不帶符號位的二進制數。
2,指數部分
2.1,當指數部分是0,且尾數部分為全0的情況,這表示浮點數0;加上符號位表示正負0。
2.2,當指數部分是0,且尾數部分不為0的情況,其實際指數是-126,二進制表示的科學計數法的浮點數的整數部分按0解析。
2.3,當指數部分是255,且尾數部分為全0的情況,表示一個無窮數;加上符號位表示正反無窮。
2.4,當指數部分是255,且尾數部分不為0的情況,表示不是一個有效數字,NaN。
2.5,當指數部分取值為[1,254]的情況,需要減去127才是實際指數值,二進制表示的科學計數法的浮點數的整數部分按1解析。
3,浮點書的規約形式與非規約形式
3.1,上述的第二種情況的浮點數稱為非規約浮點數;上述的第五種情況的浮點數稱為規約浮點數。
3.2,最小的規約浮點數是指數部分是1(實際指數是-126),尾數部分為全0的時候,絕對值為1 * 2 ^ -126 ;
次小的規約浮點數是指數部分為1,尾數部分最低位為1其余位為0的時候,絕對值為1.000...1 * 2 ^ -126;
它們之間的絕對差值為(1.000...1 - 1) * 2 ^ -126 = 2 ^ -23 * 2 ^ -126 = 2 ^ -149;
而最小規約數與0的絕對差值是1 * 2 ^ -126 = 2 ^ -126。
在坐標軸的表現是,兩個非0的規范浮點數的間隔很小,而最小規約浮點數與0的間隔很大,差距是23倍。
3.3,引入非規約形式的浮點數,可以使得0與最小規約浮點數的間隔變得均勻起來,并且間隔與兩個相鄰規約浮點數的間隔一致。
兩個非規約浮點數的間隔都是0.000...1 * 2 ^ -126 = 2 ^ -149。
3.4,最大的非規約數是0.111...111 * 2 ^ -126,最小的規約數是1.000..0 * 2 ^ -126;
最大的非規約總是小于最小的規約數,也可以認識近似相等。
4,浮點數舍入
4.1,四舍六入五成雙。
Math.Round()
4.2,向0(截斷)舍入
整型強制轉換
4.3,向負無窮大
Math.Floor()
4.4,向正無窮大
Math.Ceiling()