對於浮點型別的資料採用單精度型別(float,4位元組)和雙精度型別(double,8位元組)來儲存。根據國際標準ieee 754標準規定,無論是單精度還是雙精度在儲存中都分為三個部分:
(1)符號位(sign) : 0代表正,1代表為負
(2)指數字(exponent):用於儲存科學計數法中的指數資料,並且採用移位儲存
(3)尾數部分(mantissa):尾數部分
float和double型別:
(1)float型別(32位,4位元組)有乙個符號位(s),有8個指數字(e),和23個有效數字位(m)
(2)double型別(64位,8位元組)有乙個符號位(s),有11個指數字(e),和52個有效數字位(m)
m公式偏移量單精度浮點
1(第31位)
8(30到23位)
23(22到0位)
(-1)^s*2(e-127)*1.m
127雙精度浮點
1(第63位)
11(62到52位)
52(51到0位)
(-1)^s*2(e-1023)*1.m
1023
浮點數的表示有一定的範圍(受限於float和double大小),超出範圍時會產生溢位(flow),一般稱大於絕對值最大的資料為上溢(overflow),小於絕對值最小的資料為下溢(underflow)。
二進位制十進位制
float
± (2-2^-23) × 2127
~ ± 10^38.53
double
± (2-2^-52) × 21023
~ ± 10^308.25
舉例資料:20.125(d) float型別
進製轉換:10100.001(b)
即:(-1)0×1.0100001×24 (乘24就是左移4位,和科學計數法10n一樣)
這裡可以知道:
s:0e:4+127=131(1000 0011)
m:0100001(去掉最前面的1)
下面將位數補齊到32位:
s(1)
e(8)
m(23)
01000 0011
0100 0010 0000 0000 0000 000
繼續將上述二進位制數轉為16進製制數:
0100 0001 1010 0001 0000 0000 0000 0000
0x41 0xa1 0x00 0x00
編寫**測試:
#include
intmain()
執行結果:
得出結論與運算結果一致。
因為浮點數存在精度的問題,所以兩個浮點數a,b(如3.1415 與 3.1415926)不能直接用 == 來判斷是否相同,而應該是求他們的
差值跟精度相比較這種方法來判斷,如: fabs(a-b) < 0.0001。
**:
#include
#include
intmain()
else
return0;
}
執行結果:
not equal
修改0.00001->0.0001後**:
#include
#include
intmain()
else
return0;
}
執行結果:
equal
因此在浮點數比較中精度的選擇非常重要。
浮點型別的儲存
在c語言中,單精度 float 資料型別為32bits,分三部分 sign 符號位,1 bit,0為正,1為負 exponent bias 指數部分,8 bits,儲存格式為移碼儲存,偏移量為127 mantissa fraction 尾數部分。同理,雙精度 double 佔64位,三部分分別為 1...
浮點型別的儲存方式
1 浮點數是如何儲存的 首先應先了解浮點數的儲存方式。以float為例。float一共佔4個位元組,共32位。分為3部分 符號位 指數字和尾數字。分別佔1位 8位和23位,儲存結構如圖1所示。另外,double型別,8位元組,共64位 符號位1位,指數字11位,尾數字52位 2 如何把十進位制浮點數...
浮點型別深談
1 編寫本文目的 浮點運算已屬常用,但仍有深究必要,以消除其中可能的錯誤使用。2 預期讀者 4 正文 float格式簡談 inter 80386 80387 及以上型號cpu有三種浮點型別,即短實數 長實數和80位臨時實數,分別占用4位元組 8位元組和10位元組,對應著c c 中的float dou...