2. 浮點型

C標準規定的浮點型有floatdoublelong double,和整型一樣,既沒有規定每種類型占多少位元組,也沒有規定採用哪種表示形式。浮點數的實現在各種平台上差異很大,有的處理器有浮點運算單元(FPU,Floating Point Unit),稱為硬浮點(Hard-float)實現;有的處理器沒有浮點運算單元,只能做整數運算,需要用整數運算來模擬浮點運算,稱為軟浮點(Soft-float)實現。大部分平台的浮點數實現遵循IEEE 754,float型通常是32位,double型通常是64位。

long double型通常是比double型精度更高的類型,但各平台的實現有較大差異。在x86平台上,大多數編譯器實現的long double型是80位,因為x86的浮點運算單元具有80位精度,gcc實現的long double型是12位元組(96位),這是為了對齊到4位元組邊界(在第 4 節 “結構體和聯合體”詳細討論對齊的問題),也有些編譯器實現的long double型和double型精度相同,沒有充分利用x86浮點運算單元的精度。其它體繫結構的浮點運算單元的精度不同,編譯器實現也會不同,例如PowerPC上的long double型通常是128位。

以前我們只用到最簡單的浮點數常量,例如3.14,現在看看浮點數常量還有哪些寫法。由於浮點數在計算機中的表示是基于科學計數法的,所以浮點數常量也可以寫成科學計數法的形式,尾數和指數之間用e或E隔開,例如314e-2表示314×10-2,注意這種表示形式基數是10[27],如果尾數的小數點左邊或右邊沒有數字則表示這一部分為零,例如3.e-1,.987等等。浮點數也可以加一個尾碼,例如3.14f、.01L,浮點數的尾碼和類型之間的對應關係比較簡單,沒有尾碼的浮點數常量是double型的,有尾碼f或F的浮點數常量是float型的,有尾碼l或L的浮點數常量是long double型的。



[27] C99引入一種新的十六進制浮點數表示,基數是2,本書不做詳細介紹。