定点法存储
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.】这个是隐含默认的