正文 第10章 數據類型、運算符和表達式3(2 / 2)

實型常量可以分為單精度實型和雙精度實型兩類。

單精度實型:在一般微機版本的C語言編譯係統中,一個單精度實型常量占4個字節(32位)的內存單元,單精度實數的有效數字為6~7位,數值範圍是10-38~1038。在一個實型常量後麵加上字母f或F,則認為是單精度實型常量,如200908f。

雙精度實型:一個雙精度實型常量占8個字節(64位)的內存單元,雙精度實數的有效數字為15~16位,數值範圍是10-308~10308。為了保證計算結果的精度,C語言將實型常量作為雙精度來處理,如200908、-200908都默認采用雙精度(64位)存儲並參與運算,如果要使用單精度實型,必須在後麵加上字母f或F。

實型數據在內存中的存放形式

一個實型數據一般在內存中占4個字節(32位)。實型數據是按照指數形式存儲的,將實型數據分成尾數和指數兩部分分別存放。

小數部分占的位數越多,實數的有效數字越多,精度越高。指數部分占的位數越多,能表示的數值範圍越大。

實型變量分為單精度、雙精度和長雙精度三類。表32列出了各類實型變量的特征參數。

單精度實數:類型說明符為float,在內存中占4個字節(32位),取值範圍是34E-38~34E+38,能提供的有效數字位數為6~7位。

雙精度實數:類型說明符為double,在內存中占8個字節(64位),取值範圍是17E-308~17E+308,能提供的有效數字位數為15~16位。

長雙精度實數:類型說明符為longdouble,在內存中占16個字節(128位),能提供的有效數字位數為18~19位。

由於實型變量是用有限的存儲單元存儲的,其能提供的有效數字是有限的,在有效位以外的數字將被舍去,因此可能會產生一些誤差。

[例34]實型數據的舍入誤差。

voidmain()

floata,b;

a=123456789e5;

b=a+20;

printf("a=%f\n",a);

printf("b=%f\n",b);

運行結果:

a=12345678848000000

b=12345678848000000

程序分析:

程序中表明b值比a值大20,但其結果相同。其原因是一個實型變量隻能保證7位有效數字,後麵的數字是無意義的,所以運行後得到兩個相同的結果12345678848000000。同樣可以理解10/3*3的結果並不等於1。

[例35]

voidmain()

floata;

doubleb;

a=3333333333;

b=3333333333333333333;

printf("a=%f\nb=%f\n",a,b);

運行結果:

a=33333332031

b=33333333333

程序分析:

由於a是單精度實型,有效位數隻有7位。整數部分已占5位,故小數2位之後均為無效數字。b是雙精度實型,有效位數為16位,但輸出時小數部分隻保留6位,其餘部分四舍五入。