轉:C語言中關於float、double、long double精度及數值範圍理解html
http://blog.sina.com.cn/s/blog_6ebd49350101gdgo.htmlspa
C語言中關於float、double、long double精度及數值範圍理解
(2013-09-27 10:29:23)
IEEE754浮點數的表示方法。C語言裏對float類型數據的表示範圍爲-3.4*10^38~+3.4*10^38。double爲-1.7*10^-308~1.7*10^308,long double爲-1.2*10^-4932~1.2*10^4932.htm
類型blog |
比特(位)數內存 |
有效數字ci |
數值範圍io |
floattable |
32float |
6~7方法 |
-3.4*10^38~+3.4*10^38 |
double |
64 |
15~16 |
-1.7*10^-308~1.7*10^308 |
long double |
128/ |
18~19 |
-1.2*10^-4932~1.2*10^4932 |
究竟如何計算該範圍,分析以下:
對於單精度浮點數(float)來講,符號位一位,指數位8位,尾數23位。指數可以表示的指數範圍爲-128~127。尾數爲23位。
float和double的精度是由尾數的位數來決定的。浮點數在內存中是按科學計數法來存儲的,其整數部分始終是一個隱含着的「1」,因爲它是不變的,故不能對精度形成影響。float:2^23 = 8388608,一共七位,這意味着最多能有7位有效數字,但絕對能保證的爲6位,也即float的精度爲6~7位有效數字;double:2^52 = 4503599627370496,一共16位,同理,double的精度爲15~16位。
其中負指數決定了浮點數所能表達的絕對值最小的非零數;而正指數決定了浮點數所能表達的絕對值最大的數,也即決定了浮點數的取值範圍。float的範圍爲-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的範圍爲-2^1024 ~ +2^1024,也即-1.79E+308 ~+1.79E+308。
以float爲例,以下表
符號 |
尾數 |
指數 |
1 |
23 |
8 |
數符(+-) |
小數部分(決定精度) |
-127~128 指數(決定範圍) |
例如:+1.1111111111111111111111*2^127(小數點後面23個1,因爲尾數的範圍1~2,其最高位總爲1,故只需存取小數部分,因此小數爲是23位1),約等於2*2^127=3.4*10^38。爲3.4*10^38負數亦然。 Double的計算與此相似,double的符號位爲63位,指數爲62~52位,共11位。表示的範圍爲-1024~1023。尾數爲51~0。表示的範圍爲+1.1111111111111111..11111*2^1023(小數點後面52個1)爲1.7*10^308。負數亦然。