浮點型別儲存

2021-10-18 16:37:09 字數 1952 閱讀 4757

對於浮點型別的資料採用單精度型別(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...