定點法存儲
1. 倉庫儲存三大原則
三大原則1,先進先出.2不合格品決不入庫.3,帳,卡,物,三相符.
2. 關於定點與浮點
一.double類型的存儲表示
Java的浮點類型表示完全按照IEEE754標准(Standards of IEEE 754 floating point numbers),有興趣可以上IEEE標准網站(www.ieee.org)查閱.該標準的內容基本上描述了浮點類型的存儲格式(Storage Layout),下面我從中總結幾段,來概括該標准,詳細信息請查閱標准原文.
1.什麼是浮點數.
計算機上表達實數有兩中方法:定點表示(fixed-point)和浮點表示(floating-point).定點表示法就是在現有的數字中間的某個位置固定小數點,整數部分和小數部分的表示和一個普通整數的表示法沒什麼兩樣.例如,我們的數字長度為4,小數點位於中間,那麼你可以表示10.28,也可以表示00.01,與這種方法性質類似的定點表示還有使用分數的形式.定點數的固定窗口形式使得他既不能夠表示非常大的數又不能表示非常小的數.並且當除法發生時,大量 的精度丟失.
浮點數採用科學計數法的形式來表示實數.例如123.456可以表示成1.23456×102.相對於定點數的固定窗口(fixed Window)的限制,它採用的是浮動窗口(sliding window),因此可以表示較大精度范圍的一個實數.
2.存儲布局(Storage Layout)
所謂的存儲布局就是一個浮點數在內存中如何表示.我們知道浮點數有float和double,前者是4個位元組也就是32位,後者是8個位元組也就是64位.布局分別為:
符號 指數 小數部分 偏移附加(bias)
單精度 1[31] 8[30-23] 23[22-00] 127
雙精度 1[63] 11[62-52] 52[51-00] 1023
中括弧內為位的編號范圍,外面為該部分所佔有的位的數量.偏移附加不屬於位表示的內容,是一個常量,稍後解釋.
符號只有一位:0-表示正數 1-表示負數
指數部分:用指數部分的值(8位/11位,unsigned)的值 減去 偏移附加 得到該數實際的指數 例如值為200,實際指數為73=200-127.對於雙精度的double來說常量bias=1023
尾數:尾數是什麼?對於一個科學計數法來講,形式象這樣的 L.M×BE,那麼這個L.M就是所謂的尾數(mantisa).它由一個起始位和一個小數部分組成.舉個例子,5可以用科學計數法表示成不同形式:
5*100
0.5*101
50*10-1
那麼我們引進一個概念,規范化形式(normalized form)和非規范化形式(denormalized form).我們定義規范化形式為小數點位於第一個不為0的數字後面的表達形式為規范化形式,因此上面的第一種形式為規范化形式,其他的為非規范化形式,Java中的浮點表示完全按照這個標准,只有兩種形式規范化形式:1.f 和 非規范化形式 0.f .
那麼,對於我們的位布局來說,選用底數為2的話,只有一個數字是非零的,那就是1.所以我們的隱含起始數字可以不用佔用一個位,因為除了0就只能是1,具體的隱含規則,稍後展示.
3.表示的意義.
對應於上面的表格,每一個區域對應的值的范圍所表示的浮點數的意義:
符號位s 指數位e 小數位f 所表示的意義v
0 00..00 00..00 +0
0 00..00 00..01
:
11..11 正的非規范實數,計算方法v=0.f × 2(-b+1)
0 00..01
:
11..10 XX..XX 正的規范化實數,計算方法v=1.f × 2(e-b)
0 11..11 00..00 正的無窮大
0 11..11 00..01
:
01..11 無意義的非數字SNAN
0 11..11 10..00
:
11..11 無意義的非數字QNAN
其中b=127(float)/b=1023(double),SNAN表示無效運算結果,QNAN表示不確定的運算結果,都是無意義的.
如果把符號位s改成1,那麼就全部都是負數的含義,其他意義和這相同.
另外我們看到,對於無意義的數字是指數部分為全1時,也就是說這里有很多種組合都是無意義的非數字,而我們的Java中,判斷一個數字是否是NAN的做法相當簡單
static public boolean isNaN(double v) {
return (v != v);
}
從這里可以看出來,虛擬機對於double類型的數據比較時,肯定是先做了指數值的判定,發現不是全1時才作內存的逐位比較.當然這是我得推測,真像不知道是否如此.
再另外,我們''現在十分清楚,double類型所能表示的最小值就是它的值之間的距離,也就是我們所說的精度,數字按這種精度向整數"1階梯式的累加時,正好不能和1完全匹配,換句話說,1不是最小值(精度/距離)的整數倍.因此如果你設置變數 double d = 0.1;而結果不會是0.1,因為無法表示0.1;
二.怎麼查看double類型的存儲結構?
我們很清楚Java的Double類型提供一個函數叫做doubleToLongBits函數,這個函數的其實很簡單,我們知道,long類型和double類型都是64位的,他們的內存大小一樣,這個函數的做法就是把double對應的內存結構復制到同樣大小的long類型變數的內存結構中.返回這個long值.因為Java不支持對double類型做位運算,因此:
1.該函數不可能用Java語言完成,所以他是JNI實現
2.我們利用對long類型的位運算可以把該內存結構列印出來查看.
/**
* 測試
*/
public static void main(String[] args){
myTest t = new myTest();
double d = 0.1d;
long l = Double.doubleToLongBits(d);
System.out.println(t.getLongBits(l));
}
/**
* 得到常整數的bit位表示字元串
* @param a
* @return
*/
public String getLongBits(long a){
//8個位元組的位元組數組,讀出來
byte[] b = new byte[8];
for(int i=7;i>=0;i--){
b[i] = (byte)(a&0x000000FF);
a = a>>8;
}
return this.byte2hex(b); //調用下面一個函數
}
/**
* 位元組數組轉換成字元串
* @param b
* @return
*/
public static String byte2hex(byte[] b){
StringBuffer sb=new StringBuffer();
String stmp="";
for(int n=0;nstmp=(Integer.toHexString(b[n]&0XFF));
if(stmp.length()==1){
//不足兩位的末尾補零
sb.append("0"+stmp);
} else{
sb.append(stmp);
}
if(n//":"作為分割符
sb.append(":");
}
}
return sb.toString().toUpperCase();
}
0.1列印出來的內存結果是:
3F:B9:99:99:99:99:99:9A
我們恢復一下和第一節的表示意義對照表對照一下:
0 01111111011 1001.....1010
有興趣的話,可以那科學計算器按照第一節的規則計算一下它的值,哦,正好就是我們通過System.out.println(d)列印的結果.
3. 計算機是怎麼區別定點小數和定點整數的
計算機在定點數的存儲中,小數點是隱含的,即不表示出來。
區別定點小數和定點整數的存儲時,計算機會將定點小數先規范化(如利用IEEE754規范方式)
再存儲,定點整數則是直接存儲的,這樣就能夠區分了。
4. 默認情況下所有CPU定點運算器中採用的定點數的存儲表示方法是
默認情況下所有CPU定點運算器中採用的定點數的存儲表示方法是?
計算機 CPU
5. 定點和浮點的區別
定點和浮點的區別:
1、定義區別:
(1)定點運算中,程序員必須時刻關注溢出的發生,為了防止溢出,要麼不斷進行移位定標,要麼做截尾。定點表示具體的數。
(2)前者耗費大量時間和空間,後者則帶來精度的損失。相反,浮點運算dsp擴大了動態范圍,提高了精度,節省了運算時間和存儲空間,因為大大減少了定標,移位和溢出檢查。浮點無法精確表達需要取捨。
2、應用區別:
(1)硬體:浮點dsp處理器具有浮點/整數乘法器,整數/浮點算術邏輯運算單元ALU,適合存放擴展精度的浮點結果的寄存器等。
(2)軟體:主要有浮點dsp編程的特點以及注意事項;定點dsp進行浮點運算時的定標,移位,檢測溢出操作。即使比較兩個相同的數,還是可能有微小的舍入差別。
浮點數的溢出處理:
1、浮點數的溢出是以其階碼溢出表現出來的。在加或減運算過程中要檢查是否產生了溢出,若階碼正常,加(減)運算正常結束;若階碼溢出,則要進行相應處理。另外對尾數的溢出也需要處理。
2、階碼上溢,超過了階碼可能表示的最大值的正指數值,一般將其認為是+∞和-∞。
3、階碼下溢,超過了階碼可能表示的最小值的負指數值,一般將其認為是0。
4、尾數上溢,兩個同符號尾數相加產生了最高位向上的進位,將尾數右移,階碼增1來重新對齊。
5、尾數下溢,在將尾數右移時,尾數的最低有效位從尾數域右端流出,要進行舍入處理。
以上內容參考:網路-定點數
以上內容參考:網路-浮點數
6. 計算機中的定點與浮點
定點數是說小數點的位置固定不變.比方說整數,長整數和位元組變數.他們的小數點都默認為在最後一位數的右方.它們和般都表示整數.在存儲器中直接存儲.
而浮點數和雙精度數他們的存儲方式為底數+尾數的格式,其實就是所說的科學記數法,小數點在底數的最左面,尾數表示實際應將小數點向左(尾數為+)或向右(-)移動的位數.用這種方法可以表示很大的數不過會損失一些精度.
7. 在計算機中如何表示(是表示不是輸入)小數點什麼是定點表示法和浮點表示法
計算機內部一般用浮點數表示小數。
定點表示法:因小數點總是固定在指定的某一位置,故名。表示數值,通常將數據表示為純整數或純小數。所允許表示的數值范圍有限,運算精度較低,但對硬體需求較簡單。
點表示法是已知的C/C++編譯器都是按照IEEE(國際電子電器工程師協會)制定的IEEE浮點數表示法來進行運算的。這種結構是一種科學表示法,用符號(+或-)、指數和尾數來表示,底數被確定為2。所以在IEEE浮點數表示法里,一個浮點數為尾數乘以2的指數次方再加上符號。
(7)定點法存儲擴展閱讀
浮點表示法格式
()
其中Ef到E7這部分叫做階碼,用移碼表示,Ef是階符。Mf到M7稱作尾數,用補碼表示,Mf為數符。小數點的位置在Mf後面,對於浮點數的表示,字長是由硬體決定,如字長可以是32位,其中階碼8位,含一位階符,則階碼的表示範圍為-128到127,尾數為23位[2]
例如,原數為-1101.110101000100...0如果用上述32位表示,則為-1101.110101000100...0=-0.1101110101000100...0*2^4。
4=0000100,其移碼=2^7+0000100=10000100。Mf為1,M1後為1101110101000100...,不足23位後的空位置用0補夠。
則其浮點數表示為10000100,1.1101110101000100...0
參考資料來源:網路—浮點表示法
參考資料來源:網路—定點表示法
8. 計算機內部數字儲存形式有定點數和什麼
電腦內部儲存形式有定點數和浮點數。
浮點數是屬於有理數中某特定子集的數的數字表示,在計算機中用以近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是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是指數。
希望我能幫助你解疑釋惑。
9. C語言編程,定點數的存儲方式
定點數是計算機中採用的一種數的表示方法。參與運算的數的小數點位置固定不變。
定點數又分為定點整數和定點小數。
定點整數
小數點位固定在最後一位之後稱為定點整數。若機器字長為n+1位,數值表示為:
X=X0X1X2...Xn,其中Xi={0,1},0≤i≤n 即(-1)^X0 * (X1*2^(n-1) + X2*2^(n-2) + ... + Xn-1*2 + Xn)
數值范圍是 -(2^n-1)≤X≤2^n-1
例如:1111表示-7。
定點小數
小數點固定在最高位之後稱為定點小數。若機器字長為n+1位,數值表示為:
X=X0.X1X2...Xn,其中Xi={0,1},0≤i≤n (這里X0不表示數字,只表示符號,若X0=0,則代表X=0.X1X2...Xn,X0=1,則代表-0.X1X2...Xn)。
即X=X0.X1X2...Xn代表的小數為 (-1)^X0 * ((X1*2^(-1)) + X2*2^(-2) + ... + Xn-1*2^(-n+1) + Xn*2^(-n))
數值范圍是 -(1-2^(-n))≤X≤1-2^(-n)
例如:1111表示-0.875
10. 8086中小數怎麼存儲
微機中有兩種方法,定點浮點。
而8086通常用浮點數表示。
以單精度浮點數來說,一個數總共有32位
符號位 介碼 尾數
0 00000000(8位) 000 0000 0000 0000 0000 0000(23位)
符號位不多說了
浮點數就像是二進制的科學計數法,比如一個二進制數1010101010,你可以寫成
1.010101010乘以2^1001 (1001是二進制的9,即是介碼)
但是注意介碼要加上偏移量127才是浮點數的介碼,這是因為,介碼有可能是負數,介碼還需要表示負數。
尾數是23位的,就是表示成科學計數法之後的小數部分,因為【1.】這個是隱含默認的