1.編寫本文目的
浮點運算已屬常用,但仍有深究必要,以消除其中可能的錯誤使用。
2.預期讀者
4.正文
㈠ float格式簡談
inter 80386/80387 及以上型號cpu有三種浮點型別,即短實數、長實數和80位臨時實數,分別占用4位元組、8位元組和10位元組,對應著c/c++中的float、double和long double[注1],我以 real4、real8和real0表示之。
每種浮點格式皆應符合ieee標準,稱為規格化數,不符合ieee標準的浮點格式稱為非格式化數(nan),我以最簡單的float格式舉例。
float格式資料長32 bits,最高位為符號位:0為正,1為負;緊接著的8位為階碼:為了便於比較大小,其固定偏移7fh長,即0實際表示-7fh,7fh實際表示0,0ffh實際表示80h;餘下的低23位為尾數(有效數字),為了使有效數字達到最大精度,這23個有效數字隱含著固定位1[注2],比如尾數10000000000000000000001其實就是1.10000000000000000000001,1被省略,而小數點固定在首位。
根據以上規則可以知道float所能表示的絕對值大小範圍是
0 000,0000,0 000,0000,0000,0000,0000,0000 b 至
0 111,1111,1 111,1111,1111,1111,1111,1111 b
即±1.00000000000000000000000b×2(0x00-0x7f) 到±1.11111111111111111111111b×2(0xff-0x7f)
然而事實上並不是這樣,因為從這個範圍可以看出它並不能表示0.0,而0.0為常用數字,所以特別規定±1.00000000000000000000000b×200為零,規定指數為0xff的數字為非法數字,因此float實際的絕對值範圍(除去0以外)是
0 000,0000,0 000,0000,0000,0000,0000,0001 b 至
0 111,1111,0 111,1111,1111,1111,1111,1111 b
即 0 並上 ±1.00000000000000000000001b×2(0x00-0x7f) 到±1.11111111111111111111111b×2(0xfe-0x7f)
可能的格式狀態:
+不支援
+非有效數
-不支援
-非有效數
+規格化
+∞-規格化
-∞+0
+空-0
-空+不能規格化
-不能規格化
可能的異常:
無效操作
上溢下溢
除零不可規格化運算元
精度不足
㈡ 注意事項
a. 可以看出0可以用+0表示,也可以用-0表示,為此,cpu在比較零值時作了特殊處理,結果是±0雖然在儲存器上格式不同,但比較值相同,然而如果是用位元組來比較float型別大小時卻需要注意這一點。
b. 運算上溢的值不是實際值,而是特值 0 111,1111,0 000,0000,0000,0000,0000,0000 b,例如 1.0×2127 + 1.5×2127 不等於 1.5×2128,雖然它有能力表示1.5×2128。
c. ㈢ 在c++中的部分解決方案及遺留問題
5.參考資料
《inter 80x86/80387 彙編指南》
6.附錄
[注1]:m$認為double精度已足夠,故在mvc++5.0及以後取消80位了臨時實數,令long double等同於double,但在本文中的long double還是指80位臨時實數。
[注2]:各種浮點型別格式類似,double指數偏移基數3ffh,long double指數偏移基數3fffh,但long double特殊在無有效數字隱含位。
real04:符號位1,階碼08(固定偏移 7f),尾數23,固定隱含位有;
real08:符號位1,階碼11(固定偏移 3ff),尾數52,固定隱含位有;
real10:符號位1,階碼15(固定偏移3fff),尾數64,固定隱含位無;
深談auto變數
1.c 中有乙個關鍵字auto,c語言也有這麼乙個關鍵字,但是兩者的意義大不相同。2.c 中用auto定義的變數自動匹配賦值號右邊的值的型別,具有自動匹配型別的作用,而c語言中auto只是宣告乙個變數為自動型別,說明這個變數的 塊生存期和分配在棧上,並且不能用來定義變數。3.c 中auto可以起到泛...
浮點列型別
對於浮點列型別,在mysql中單精度值使用4個位元組,雙精度值使用8個位元組。float型別用於表示近似數值資料型別。sql標準允許在關鍵字float後面的括號內選擇用位指定精度 但不能為指數範圍 mysql還支援可選的只用於確定儲存大小的精度規定。0到23的精度對應float列的4位元組單精度。2...
002 浮點型別
浮點型別表示數字包含小數部分。共兩種浮點型別 型別儲存要求 表示範圍 float 4 byte 大約 3.40282347e 38f 有效小數字數6 7位 double 8 byte 大約 1.79769313486231570e 308 有效小數為15位 double的數字的精度是float的兩倍...