C語言關鍵字淺析-double
### C語言關鍵字淺析系列 ###
### ISO/ANSI C 關鍵字 ###
double關鍵字宣告一種稱之為“雙精度”的浮點資料型別
其“雙”之處在於與float浮點資料型別對比,可以表示更長的資料區間
如果需要表示更大的數值區間還可以採用long double型別
double的作用是:
定義雙精度浮點型別。
1、double在系統中的儲存
通常double型別的浮點數在系統中佔用32位,其中8位用於表示指數和符號,24位表示有效數字(尾數)及其符號
這裡所說的兩個符號分別指的是指數的正負號和有效數字的正負號
如1.44E-4這個數,用double型別儲存時,指數為4,指數符號為負,尾數為1.44,尾數符號為正
2、浮點常量
在C語言中,編寫程式時浮點數上的一些預設是看做有效的
(1)正號可以省略
3.0 4e2 -5e8 -2.54e+2 都正確
(2)可以缺少小數點或指數部分,但二者不能同時缺少
31.4e-1 有小數點和指數部分
3.14159 有小數點,沒有指數部分
2e-3 有指數部分,沒有小數點
9 既沒有小數點也沒有指數部分,系統不認為是浮點數型別,定義double的整數常量可寫為9.0即可
(3)在有小數點的情況下,可以缺少純整數部分或者純小數部分,但二者不能同時缺少
3.14159 存在有效的純整數部分和純小數部分
3. 只有純整數部分,等價於3.0(注意3後面有個小數點,可能不清晰)
.14 只有純小數部分,等價於0.14(注意1前面有個小數點,可能不清晰)
只有一個小數點時,等於空,並不等於0
【編寫程式時還需注意,浮點常量中的字元是連續的,無需在字元e前後加空格】
3、編譯器眼中的浮點常量
預設情況下,編譯器將浮點常量預設為double型別
這也是為什麼一些演算法比賽和考試的教材中,極力推薦學生遇到浮點數時儘可能使用double而不是float(當然還有其他因素)
例如,當你這樣做這樣的處理時:
float area; /* 你有個float型別的變數 */
area = 3.14 * 1.0 * 1.0; /* 3.14和1.0卻被認為是double */
結果會正確,因為表示式中的三個預設的double型別浮點數按雙精度計算後
得到的double結果再被截為float型別,精度得以保證
然鵝,代價是會減慢程式執行,對於一些對資料處理速度敏感的程式、裝置可能不可接受
幸運的是,上面我們說的是預設情況下編譯器把浮點常量認為是double,當然也就有自定義型的情況了,比如同樣一個數:3.14
(1)31.4e-1 認為是double型別(預設,尾巴很乾淨)
(2)31.4e-1f或31.4E-1F 認為是float型別(有後綴f/F)
(3)31.4e-1l或31.4E-1L 認為是long double型別(有後綴l/L,建議寫L,字型上容易與1區分)
所以當你並不需要double那麼長的儲存空間,記憶體敏感的情況下只能接受float的長度時
還是有方法讓浮點常量是float型別的(31.4E-1F)
4、浮點數列印格式
float和double在printf()函式中可用%f格式說明符,也可以使用%e格式
區別在於%f是原本的數字形式輸出(670.000000),%e是指數計數法形式輸出(6.7e8)
long double型別用%Lf和%Le格式說明符
(注:在支援C99的十六進位制格式浮點數的系統中,還可以用a/A代替e/E,即%a和%La)
——參考《C Primer Plus第五版》
相關文章:
C語言關鍵字淺析-float