『壹』 請問浮點型數據在計算機是怎麼存儲的
對於浮點類型的數據採用單精度類型(float)和雙精度類型(double)來存儲,float數據佔用32bit,double數據佔用64bit。
無論是單精度還是雙精度在存儲中都分為三個部分:
1、符號位(Sign) : 0代表正,1代表為負。
2、指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲。
3、尾數部分(Mantissa):尾數部分。
(1)浮點數非精確存儲擴展閱讀
實型變數分為兩類:單精度型和雙精度型,
其類型說明符為float 單精度說明符,double
雙精度說明符。在Turbo
C中單精度型佔4個位元組(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。
雙精度型佔8
個位元組(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
實型變數說明的格式和書寫規則與整型相同。
例如: float x,y; (x,y為單精度實型量)
double a,b,c; (a,b,c為雙精度實型量)
實型常數不分單、雙精度,都按雙精度double型處理。
『貳』 C語言中浮點數為什麼不能准確存儲
浮點數,即雙精度double型或單精度float型,拿雙精度的double來說,定義一個double型的變數,如
double
a;那麼a在內存中開辟了一個32位的空間來存儲變數a,但是你要存儲變數a,計算機要將浮點數a用一個定點整數和一個定點小數表述,在對階碼的時候,由於各個計算機CPU的字長不一樣,可能造成對階時產生小數部分丟失,這樣造成了存儲不準確。建議看看組成原理。
『叄』 浮點數在計算機中的存儲方式
應該是: 在一個為32bit的存儲空間中存儲浮點數,bit0~bit22存儲有效數字部分;bit23~bit30存儲指數部分;bit31存儲符號位。 在一個為64bit的存儲空間中存儲浮點數,bit0~bit51存儲有效數字部分;bit52~bit62存儲指數部分;bit63存儲符號位。 還一種 在一個為80bit的存儲空間中存儲浮點數,bit0~bit62存儲有效數字部分;bit63~bit78存儲指數部分;bit79存儲符號位。 只有這三種了,其他都不支持的 未來可能還有128位浮點數
『肆』 為什麼說有的浮點數無法精確的表示
因為二進制只能表示2的n次方的數,n可以取負值,3.3無法用2的n次方的數組合計算出來,所以無法精確表示:3.3=1*2+1*1+0*1/2+1*1/4+0*1/8+0*1/16+1*1/32+...
其中分式的分母只能是2的倍數(二進制所限),3.3的二進製表示是11.01001.....
有些數比如1/3就無法精確計算,只能無限逼近
『伍』 java 浮點數為什麼精度會丟失
並不是java的浮點數精度會丟失,而是所有用二進制存儲中的浮點數都可能會精度丟失(部分特殊的小數數值可以精確表示),所以計算機中存儲的浮點數都存在精度丟失的風險,不過一邊這個丟失的精度對我們正常的使用不會構成影響。
小數在轉換為二進制時並不一定能用一個精確的二進製表示,大多數時候都是取的一個近似值,這就造成了精度的丟失。如果再用這個二進制進行計算,明顯計算結果的精度會進一步丟失。
舉個簡單的例子把0.1用二進製表示(小數與二進制轉換方法)
(1)0.1x2=0.2取整數位0得0.0
(2)0.2x2=0.4取整數位0得0.00
(3)0.4x2=0.8取整數位0得0.000
(4)0.8x2=1.6取整數位1得0.0001
(5)0.6x2=0.2取整數位1得0.00011
(6)0.2x2=0.4取整數位0得0.000110
(7)0.4x2=0.8取整數位0得0.0001100
(8)0.8x2=1.6取整數位1得0.00011001
(9)0.6x2=1.2取整數位1得0.000110011
(n)...
得到一個無限循環的二進制小數 0.000110011…,沒辦法用一個精確的二進製表示0.1。而且計算機中存儲一個浮點數所用的位數也是有限的,所以只能選擇在某一個精度進行保存。
當然也有特殊的小數,比如0.25的二進制為0.01
附:代碼之謎(五)- 浮點數(誰偷了你的精度?)
『陸』 為什麼說浮點數缺乏精確性
浮點運算的精確度應該與你的需求有關
使用浮點數進行比較,你應該設置一個目標精確度:比如小數點後3位,也就是精確度是:0.001,那麼你在比較兩個數時比較它們查的絕對值小於0.001就可以了
浮點數本來就是不精確的
『柒』 浮點數的解釋
浮點數是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學記數法。
浮點計算是指浮點數參與的運算,這種運算通常伴隨著因為無法精確表示而進行的近似或舍入。
一個浮點數a由兩個數m和e來表示:a = m × b^e。在任意一個這樣的系統中,我們選擇一個基數b(記數系統的基)和精度p(即使用多少位來存儲)。m(即尾數)是形如±d.ddd...ddd的p位數(每一位是一個介於0到b-1之間的整數,包括0和b-1)。如果m的第一位是非0整數,m稱作規格化的。有一些描述使用一個單獨的符號位(s 代表+或者-)來表示正負,這樣m必須是正的。e是指數。
這種設計可以在某個固定長度的存儲空間內表示定點數無法表示的更大范圍的數。
例如,一個指數范圍為±4的4位十進制浮點數可以用來表示43210,4.321或0.0004321,但是沒有足夠的精度來表示432.123和43212.3(必須近似為432.1和43210)。當然,實際使用的位數通常遠大於4。
此外,浮點數表示法通常還包括一些特別的數值:+∞和�6�1∞(正負無窮大)以及NaN('Not a Number')。無窮大用於數太大而無法表示的時候,NaN則指示非法操作或者無法定義的結果。
眾所周知,計算機中的所有數據都是以二進製表示的,浮點數也不例外。然而浮點數的二進製表示法卻不像定點數那麼簡單了。
先澄清一個概念,浮點數並不一定等於小數,定點數也並不一定就是整數。所謂浮點數就是小數點在邏輯上是不固定的,而定點數只能表示小數點固定的數值,具用浮點數或定點數表示某哪一種數要看用戶賦予了這個數的意義是什麼。
階符是當一個數用科學計數法表示時,它的指數的符號,指數是正還是負,正負號就是階符。 計算機機內數,當用科學計數法表示時,分尾數,指數,階符3部分,階符佔1位,負為1,正為0。
C語言用e格式寫數時
3.456e-03
就是 3.456 乘 10的負3次方,
e後面的-號,就是階符
正階符,不寫東西,或寫+號。
3.456e03 就是 3.456 乘 10的正3次方,
浮點數的階碼可用補碼或增碼(移碼)表示,數的表示範圍是,在浮點表示方法中是隱含的
尾數是定點整數來的,尾數符號叫尾符
『捌』 浮點型數據在內存中實際的存放形式(儲存形式)
浮點型數據在內存中存儲不是按補碼形式,是按階碼的方式存儲,所以雖然int和float都是佔用了4個位元組,如果開始存的是int型數據,比如是個25,那麼用浮點的方式輸出就不是25.0,也許就變的面目全非。
你可以用共用體的方式驗證一下。在公用體中定義一個整形成員變數和一個浮點型成員變數,給整形賦值25,輸出浮點成員變數,你就知道了。
『玖』 mysql的浮點型在什麼情況下會損失精度,求大神詳解、、
談談個人理解,請帶著懷疑和鑒別的角度去看待。
1 先理解下定點數
--定義:
指規定小數點位置固定不變。
--存儲:
* 在資料庫或計算機中存儲時,整數部分和小數部分分別使用一定的位元組來存儲(理解為分別用兩部分位元組來存儲兩個整數),小數點是作為存儲屬性存儲的(如作為列類型時,小數點位置存儲在表的定義部分),而不佔用數據的存儲位元組。
* 定點數使用多少位元組來存放數據,依賴於該數指定的精度(精度即為該數的總數字位數),總數字位數為小於2則使用1位元組,為5-9位時用4位元組,為19-38位時使用16位元組(大部分資料庫支持的最大就是38位數字);
--舉例:
numeric(2,1),精度為2,使用1個位元組來存放,存放數據范圍為[-9.9, 9.9];如存儲2.3時,在資料庫存儲為00100011,而小數位置固定在第四位前,這是由定義列時指明的;
--說明:
定點數存儲精確的數字,numeric(2,1)就只能[-9.9, 9.9]之間的數,存的不是近似數(因為兩部分都作為整數存儲);當你在numeric(2,1)中存儲2.33時,實際發生了隱式轉換,實際存儲為9.3(注意這並不是近似);
2 再來理解浮點數
--定義:
指採用浮點數表達方式來表示數據,這種表達方式利用科學計數法來表達實數,即用一個尾數(Mantissa ),一個基數(Base),一個指數(Exponent)以及一個表示正負的符號來表達數據,比如 123.45 用十進制科學計數法可以表達為 1.2345 × 10^2,其中 1.2345 為尾數,10 為基數,2 為指數。稱其為浮點數就是因為利用指數達到了浮動小數點的效果。
--存儲:
浮點數一般是使用IEEE規定的方式,即 對於單精度浮點數用1bit來存儲符號位(正負號),8bit來存儲指數,23bit來存儲尾數;而且要求尾數的整數部分為1(注意,指二進位格式的,如1.01001),而且是使用二進位來保存,即基數為2;
在大多數資料庫或計算機中存儲時,單精度使用4位元組,雙精度使用8位元組保存;
--舉例:
二進制的 1001.101(對應於十進制的 9.625)可以表達為 1.001101 × 2^3,存儲時符號位+存儲為0,指數3存儲為00000011,尾數1.001101存儲為0011010000..(總共23位,去掉了小數點前的1,IEEE就是這樣要求的);
--近似的產生:
因為我們使用的是十進制數,而計算機要轉換為對應的二進制形式,由於有限的2進制位數表示的小數值不能和十進制一一對應(換句話說,十進制小數轉為二進制可能變為無限小數而導致不精確 ),如2^-1對應0.5,2^-2對應0.25,2^-3對應0.125,因此對於像十進制的0.4(小數的末尾一位數不為5的)則不能精確存儲;
--因近似引起的問題:
create table t (a float, b float); insert into t values(0.11, 0.04), (0.04, 0.11);
select * from t; 查詢時顯示正常,實際底層存儲時發生了近似(十進制轉換為二進制),而顯示時又發生了近似(二進制轉換為十進制);
select sum(a) from t; 查詢顯示 0.14999999850988388 ,為什麼不是0.15的原因也就不言而喻了。
這也就是浮點數在損失精度、計算和比較要格外注意的事項;
3 總結
定點數,能存儲精確數字,但保存的數據范圍受了嚴格限制,格式也比較僵硬(這既是好處,也是壞處);
浮點數,不能存儲精確數字,在小數的末尾一位數不是5(一直乘2不能圓整)的情況下會發生存儲的近似處理;但可存儲的數據范圍更大;
『拾』 什麼是浮點數啊
浮點數是表示小數的一種方法。所謂浮點就是小數點的位置不固定,與此相反有定點數,即小數點的位置固定浮點數的實現在各種平台上差異很大,有的處理器有浮點運算單元(FPU,FloatingPointUnit),稱為硬浮點(Hardfloat)實現。
整數可以看做是一種特殊的定點數,即小數點在末尾。8086/8088中沒有浮點數處理指令,不過從486起,CPU內置了浮點數處理器,可以執行浮點運算。
一般的浮點數有點象科學計數法,包括符號位、指數部分和尾數部分。 有的處理器沒有浮點運算單元,只能做整數運算,需要用整數運算來模擬浮點運算,稱為軟浮點(Softfloat)實現。
擴展推薦:
編程學習過程中可以看得書推薦。《代碼大全(第二版)》出自著名IT暢銷書作者史蒂夫·邁克康奈爾之手,曾被《軟體開發》雜志授予優異產品震撼大獎。
《每個程序員都應該知道的97件事情》( 97 things every programmer should know )對於編程初學者來說這本書都可以算上一個優質的入門書籍。本書提供了豐富的編程實踐及理念,提供了大量的實例,並且書的排版格式閱讀起來十分簡潔方便
《計算機程序設計藝術 (第一卷)》由著名的計算機科學家教授Donald Knuth編著,並得到行業內眾多頂尖程序員的一致好評。甚至連比爾蓋茨也對這本書贊譽有加。