先說說32
位的 float型乙個
正的浮點數 x,
在計算機中表示為
:x = a *2
e
這裡 e
代表指數
, a
代表尾數
,
在 計算機內部
, 他們都是用二進位制表示的
. 其中
a 用二進位制的科學表示法
表示,
由於科學表示法第一位總是
1 (0
除外) ,
所以第一位略去不計
. e
表示的時候
, 因為要表示出負數
, 所以
e要加上127 ,
實際運算的時候要減去
127.
ieee 規定
, 32
位 float
型被拆開成以下格式
, 左邊為高位
: 二進位制 0
0000 0000
000 0000 0000 0000 0000 0000 位數
共1位共8
位共23位含義
符號位指數字
尾數字 範圍
0正1負
-127到
+127
0到0x . 7f ff ff
float 的範圍是
-3.40282 * e
38~ + 3.40282 * e
38一般在人看來是 十進位制的數,
要轉換成二進位制
. 十進位制轉二進位制
, 大於
1 的部分就是除以
2 取餘
;小於1
的部分乘
2 取整
.比如
8.5
轉換成二進位制就是
1000.1 ,
處理成這一步
, 還要用科學表示法表示
, 就成了
1.0001 * 2
3, 注意
: 由於
1.0001
第乙個1
要去掉,
所以成了
0001
, 3 需要加上
127
就成了
130 ,
二進位制就是
10000010
。則套用上面話就表示為:
010000010
0001
0000000
0000 0000
0000
16 進製 就是
: 0x 41 08 00 00 ,
一般來說
, intel
系列的
cpu
都使用的是 小尾存放
, 就是 高位元組放在後面
, 剛好要掉過來就是
: 0x 00 00 08 41 ,
這樣就完成了一次浮點數的表示
. 注意:
浮點數
0.0
在計算機中表示為
0x 00 00 00 00 .
那麼浮點數的精度是怎麼回事情呢?
當我們使用二進位制表示 大於
1 的部分的時候
, 沒有問題
, 除以
2,一直下去
, 最後一位肯定不是
1 就是
0; 那麼小數部分呢
? 舉個例子
, 比如
0.8
表示0.8
* 2
1.6 - 1 = 0.6
* 2
1.2 -1 = 0.2 - 0
.* 2
0.4 - 0
*2
0.8 - 0
這樣就迴圈了 就是說 0.8
的二進位制 就是
0.11000 11000 ......
一直迴圈下去
, 而我們計算機如果表示
0.8只能取
0後面的前幾十位
, 這就說明 如果是
0.800....001 (
迴圈超過
100次
) ,
它表示出來的值其實是和
0.8
一樣,
所以我們比較
float
型的數字 用
a == b
其實是不嚴謹的
(精度問題
), 一般都是 用
abs(a - b) < 0.000001
之類就預設是相等
. 那麼 double
型呢?
咱們可以照
float
型的葫蘆 來畫了
. double 型 只是說 取
64 位, 比
float
型的位 多一倍
ieee 規定
double
型 , 第64
位63-54 53-1
符號位指數字
( -1024 - 1024)
尾數字
所以 double
型的範圍是
-1.79769 * e
308~ +1.79769 * e
308多用了幾位,
表示範圍大了很多
, 其實本質跟
float
型一樣.
float浮動深入理解
1.float的原本作用 為了實現文字環繞 2.float的包裹性和破壞性 包裹性 收縮 堅挺 隔絕。bfc block formatting context 塊級格式化上下文 破壞性 會讓父元素高度塌陷 浮動的破壞性只是單純的為了實現文字的環繞效果而已 具有包裹性的其他小夥伴 dispaly in...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...