1. 程式人生 > >C語言關鍵字淺析-double

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