實型常量可以分為單精度實型和雙精度實型兩類。
單精度實型:在一般微機版本的C語言編譯係統中,一個單精度實型常量占4個字節(32位)的內存單元,單精度實數的有效數字為6~7位,數值範圍是10-38~1038。在一個實型常量後麵加上字母f或F,則認為是單精度實型常量,如200908f。
雙精度實型:一個雙精度實型常量占8個字節(64位)的內存單元,雙精度實數的有效數字為15~16位,數值範圍是10-308~10308。為了保證計算結果的精度,C語言將實型常量作為雙精度來處理,如200908、-200908都默認采用雙精度(64位)存儲並參與運算,如果要使用單精度實型,必須在後麵加上字母f或F。
實型數據在內存中的存放形式
一個實型數據一般在內存中占4個字節(32位)。實型數據是按照指數形式存儲的,將實型數據分成尾數和指數兩部分分別存放。
小數部分占的位數越多,實數的有效數字越多,精度越高。指數部分占的位數越多,能表示的數值範圍越大。
實型變量分為單精度、雙精度和長雙精度三類。表32列出了各類實型變量的特征參數。
單精度實數:類型說明符為float,在內存中占4個字節(32位),取值範圍是34E-38~34E+38,能提供的有效數字位數為6~7位。
雙精度實數:類型說明符為double,在內存中占8個字節(64位),取值範圍是17E-308~17E+308,能提供的有效數字位數為15~16位。
長雙精度實數:類型說明符為longdouble,在內存中占16個字節(128位),能提供的有效數字位數為18~19位。
由於實型變量是用有限的存儲單元存儲的,其能提供的有效數字是有限的,在有效位以外的數字將被舍去,因此可能會產生一些誤差。
[例34]實型數據的舍入誤差。
voidmain()
{
floata,b;
a=123456789e5;
b=a+20;
printf("a=%f\n",a);
printf("b=%f\n",b);
}
運行結果:
a=12345678848000000
b=12345678848000000
程序分析:
程序中表明b值比a值大20,但其結果相同。其原因是一個實型變量隻能保證7位有效數字,後麵的數字是無意義的,所以運行後得到兩個相同的結果12345678848000000。同樣可以理解10/3*3的結果並不等於1。
[例35]
voidmain()
{
floata;
doubleb;
a=3333333333;
b=3333333333333333333;
printf("a=%f\nb=%f\n",a,b);
}
運行結果:
a=33333332031
b=33333333333
程序分析:
由於a是單精度實型,有效位數隻有7位。整數部分已占5位,故小數2位之後均為無效數字。b是雙精度實型,有效位數為16位,但輸出時小數部分隻保留6位,其餘部分四舍五入。