c語言浮點數存儲
首先一點就,是DOUBLE類型是不能自動轉成INT類型的,所以結果會出現不知所雲的數.
另外,C的話浮點數一般是用IEEE 754標準定義的單精度浮點數與雙精度浮點數。
這些浮點數都是會損失精度的,在計算中會帶來偏差。
2. C語言中DOUBLE型數據儲存結果
float與double類型的內存分布,精度和范圍
內存分布:
C/c++的浮點數據類型有float和double兩種。
float大小為4位元組,內存中的存儲方式如下:
符號位(1bit)指數(8bit)尾數(23bit)
double大小為8位元組,內存中的存儲方式如下:
符號位(1bit)指數(11bit)尾數(52bit)
符號位決定浮點數的正負,0正1負。指數和尾數均從浮點數的二進制科學計數形式中獲取。
如,十進制浮點數2.5的二進制形式為10.1,轉換為科學計數法形式為(1.01)*(10^1)。
由此可知指數為1,尾數(即科學計數法的小數部分)為01。
根據浮點數的存儲標准,指數用移碼表示。0的float類型移碼為127(0111 1111),0的double類型移碼為1023(011 1111 1111)。運算時,在0 的移碼基礎上加指數,得到的就是內存中指數的表示形式。尾數則直接填入,如果空間多餘則以0補齊,如果空間不夠則0舍1入。
所以float和 double類型分別表示的2.5如下(二進制):
符號位 指數 尾數
0 1000 0000 010 0000 0000 0000 0000 0000
0 100 0000 0000 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
精度:
float和double的精度是由尾數的位數來決定的。
float:2^23 = 8388608,一共七位,這意味著最多能有7位有效數字,但絕對能保證的為6位,也即float的精度為6~7位有效數字; double:2^52 = 4503599627370496,一共16位,同理,double的精度為15~16位。
范圍:
float類的指數是8位移碼,最大為127最小為-127,127用來作2的指數,為2^127,約等於 1.7014*10^38, 而我們知道,floa示數范圍約為- 3.4*10^38-------3.4*10^38, 這是因為尾數都為1時,即1.11..11約為2,因此浮點數的范圍就出來了.double的情況與float完全相似.
3. C語言中反匯編浮點數存儲
糾正一下一個認知,數據的類型並不是固定的,而是看你程序的操作,如果操作的是mul,就認為那裡是整數,如果操作指令是fmul,就認為那裡存的就是小數至於,你問的問題,是因為計算機關於浮點數的存取,大部分是按照IEEE的規定來存取的C語言中的float類型存取時,最高位為符號位,30-23是指數,22-0是尾數0x404947AE //這是一個float類型0 10000000 10010010100011110101110符號 階數 尾數階數,減去偏移量127,得1,表示小數部分偏移1.10010010100011110101110 移動一位 11.0010010100011110101110 大約得十進制 3.144(不曉得,我有沒有算錯(⊙o⊙)…)至於double 的規定就不太清楚了
4. C語言浮點數的儲存方式為何浮點數儲存不準確那個圖片是什麼意思
C語言中,無論是單精度還是雙精度在存儲中都分為三個部分:
1. 符號位(Sign) : 0代表正,1代表為負
2. 指數位(Exponent)(註:也叫階碼):用於存儲科學計數法中的指數數據,並且採用移位存儲(註:移碼編碼表示)
3. 尾數部分(Mantissa):尾數部分
關於不精確是由於十進制小數部分化二進制,常常化不盡。如同無限循環小數,最後有截斷誤差。
圖片中的是float型的變數的存儲上的格式。
5. C語言實型(浮點型)數據在內存中的存放形式
實數分為float型和double型,它們分別對應IEEE 754標准中的單精度浮點數和雙精度浮點數類型,在內存中的存儲形式遵守IEEE 754浮點數標准。以float類型數據為例,3.14159表示成二進制為11.0010010000111111001111......,規格化後表示為1.10010010000111111001111×2^1(小數點後保留23位有效數字,因為IEEE 754標准規定的尾數為23位);指數為1,故階碼為1+127=128=10000000;這是一個正數故符號位為0,因此它在內存中的表示形式是0 10000000 10010010000111111001111,寫成16進制為40490FCF。
6. c語言中double和float它們存儲時分別占據多大的內存空間
double 中文譯為雙精度浮點數,一般稱雙精度數,它在內存中佔用8個位元組(位、bit)的空間;float 中文譯為單精度浮點數,一般就稱為浮點數,它在內存中佔用4個位元組的空間。
7. C語言中浮點數為什麼不能准確存儲
浮點數,即雙精度double型或單精度float型,拿雙精度的double來說,定義一個double型的變數,如 double a;那麼a在內存中開辟了一個32位的空間來存儲變數a,但是你要存儲變數a,計算機要將浮點數a用一個定點整數和一個定點小數表述,在對階碼的時候,由於各個計算機CPU的字長不一樣,可能造成對階時產生小數部分丟失,這樣造成了存儲不準確。建議看看組成原理。
8. C語言浮點型是怎樣存儲的
C語言中的float類型佔用4個位元組長,這4個位元組分為如下3部分:
1位符號位 8位階碼 23位尾數部分
這23位尾數才真正存儲了二進制的有效位,將這23位二進制轉換為十進制也就6到7位有效數字。
9. C語言二進制浮點數儲存方式
float 單精度說明符,在Turbo C中單精度型佔4個位元組(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。
double 雙精度說明符。雙精度型佔8 個位元組(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
其實記起來非常簡單的- -!!
自己編個程序看看~~
void main()
{
float a;
double b;
a=33333.33333;
b=33333.33333333333333;
printf("a=%f\n,b=%f\n",a,b);
}
然後~~~
答案是
a=33333.332131
b=33333.333333
由於a 是單精度浮點型,有效位數只有七位。而整數已佔五位,故小數二位後之後均為無效數字。(就是2131那部分)。
b 是雙精度型,有效位為十六位。應該顯示全部小數,但是!!!!Turbo C 規定小數後最多保留六位,其餘部分四捨五入。所以答案是這個。。
這樣解釋的行嗎?打字太累了~~~
10. 關於浮點數在C語言中的存儲問題
寫c==2.468f就可以。
浮點數常量默認是double型。你直接寫2.468會強轉型。