请问:浮点数在计算机中是如何表示的?!最好说明能够详细明白点儿 …… 呵呵

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/29 20:53:05
请问:浮点数在计算机中是如何表示的?!最好说明能够详细明白点儿 …… 呵呵

请问:浮点数在计算机中是如何表示的?!最好说明能够详细明白点儿 …… 呵呵
请问:浮点数在计算机中是如何表示的?!
最好说明能够详细明白点儿 …… 呵呵

请问:浮点数在计算机中是如何表示的?!最好说明能够详细明白点儿 …… 呵呵
众所周知,计算机中的所有数据都是以二进制表示的,浮点数也不例外.然而浮点数的二进制表示法却不像定点数那么简单了.
先澄清一个概念,浮点数并不一定等于小数,定点数也并不一定就是整数.所谓浮点数就是小数点在逻辑上是不固定的,而定点数只能表示小数点固定的数值,具用浮点数或定点数表示某哪一种数要看用户赋予了这个数的意义是什么.
C++中的浮点数有6种,分别是:
float:单精度,32位
unsigned float:单精度无符号,32位
double:双精度,64位
unsigned double:双精度无符号,64位
long double:高双精度,80位
unsigned long double:高双精度无符号,80位(嚯,应该是C++中最长的内置类型了吧!)
然而不同的编译器对它们的支持也略有不同,据我所知,很多编译器都没有按照IEEE规定的标准80位支持后两种浮点数的,大多数编译器将它们视为double,或许还有极个别的编译器将它们视为128位?!对于128位的long double我也仅是听说过,没有求证,哪位高人知道这一细节烦劳告知.
下面我仅以float(带符号,单精度,32位)类型的浮点数说明C++中的浮点数是如何在内存中表示的.先讲一下基础知识,纯小数的二进制表示.(纯小数就是没有整数部分的小数,讲给小学没好好学的人)
纯小数要想用二进制表示,必须先进行规格化,即化为 1.xxxxx * ( 2 ^ n ) 的形式(“^”代表乘方,2 ^ n表示2的n次方).对于一个纯小数D,求n的公式如下:
n = 1 + log2(D);// 纯小数求得的n必为负数
再用 D / ( 2 ^ n ) 就可以得到规格化后的小数了.接下来就是十进制到二进制的转化问题,为了更好的理解,先来看一下10进制的纯小数是怎么表示的,假设有纯小数D,它小数点后的每一位数字按顺序形成一个集合:
{k1,k2,k3,...,kn}
那么D又可以这样表示:
D = k1 / (10 ^ 1 ) + k2 / (10 ^ 2 ) + k3 / (10 ^ 3 ) + ...+ kn / (10 ^ n )
推广到二进制中,纯小数的表示法即为:
D = b1 / (2 ^ 1 ) + b2 / (2 ^ 2 ) + b3 / (2 ^ 3 ) + ...+ bn / (2 ^ n )
现在问题就是怎样求得b1,b2,b3,……,bn.算法描述起来比较复杂,还是用数字来说话吧.声明一下,1 / ( 2 ^ n )这个数比较特殊,我称之为位阶值.
例如0.456,第1位,0.456小于位阶值0.5故为0;第2位,0.456大于位阶值0.25,该位为1,并将0.45减去0.25得0.206进下一位;第3位,0.206大于位阶值0.125,该位为1,并将0.206减去0.125得0.081进下一位;第4位,0.081大于0.0625,为1,并将0.081减去0.0625得0.0185进下一位;第5位0.0185小于0.03125……
最后把计算得到的足够多的1和0按位顺序组合起来,就得到了一个比较精确的用二进制表示的纯小数了,同时精度问题也就由此产生,许多数都是无法在有限的n内完全精确的表示出来的,我们只能利用更大的n值来更精确的表示这个数,这就是为什么在许多领域,程序员都更喜欢用double而不是float.
float的内存结构,我用一个带位域的结构体描述如下:
struct MYFLOAT
{
bool bSign :1; // 符号,表示正负,1位
char cExponent :8; // 指数,8位
unsigned long ulMantissa :23; // 尾数,23位
};
符号就不用多说了,1表示负,0表示正
指数是以2为底的,范围是 -128 到 127,实际数据中的指数是原始指数加上127得到的,如果超过了127,则从-128开始计,其行为和X86架构的CPU处理加减法的溢出是一样的.比如:127 + 2 = -127;127 - 2 = 127
尾数都省去了第1位的1,所以在还原时要先在第一位加上1.它可能包含整数和纯小数两部分,也可能只包含其中一部分,视数字大小而定.对于带有整数部分的浮点数,其整数的表示法有两种,当整数大于十进制的16777215时使用的是科学计数法,如果小于或等于则直接采用一般的二进制表示法.科学计数法和小数的表示法是一样的.
小数部分则是直接使用科学计数法,但形式不是X * ( 10 ^ n ),而是X * ( 2 ^ n ).拆开来看.
0000000000000000000000000000000
符号位指数位尾数位

请问:浮点数在计算机中是如何表示的?!最好说明能够详细明白点儿 …… 呵呵 在计算机中最适合表示浮点数阶码的数字编码是? 整数型数与浮点型数的比较在计算机中是如何完成的? 为什么浮点数在计算机内表示不是精确的 计算机浮点数表示范围是怎么算出来的? 这两个选项那个正确的求大神们解释:关于定点数与浮点数的叙述中,错误的是——A、整数在计算机中用定点数表示,不能用浮点数表示;B、计算机中实数是用浮点数来表示的 在计算机原理中,关于浮点数表示的问题.在底数为2的尾数是原码的浮点表示中,下列符合规格化要求的是哪个?为什么? 负整数在计算机中是按照补码的形式表示的,那负小数(即负浮点数)在计算机中也是按照补码形式表示的吗请计算机高手回答,不想被随便忽悠 在计算机中如何表示小数点?什么是定位表示法和浮点表示法? -0.123的源码反码和补码分别是多少?小数在计算机中都是用浮点数来表示的吗,那浮点数的反码和补码又是怎么求的呢? 计算机中含有小数点的数据可以表示为浮点数还有什么数? 计算机内部如何表示既有整数部分又有小数部分的浮点数 0.000123该浮点数在计算机内怎样表示? 浮点数在计算机里面的存储一个负数浮点数在计算机内存中怎么组织啊?比如说二进制-0.11 在计算机中,最适合进行数字加减运算的数字编码是__,最适合表示浮点数阶码的数字编码是_.原码?反码?补码?移码? 计算机中,浮点数由两部分组成,它们是? 白中英的计算机组成原理中关于浮点数表示方法的问题:对于规格化浮点数,E 的范围变 为1到254,真正的指数这样在32位浮点数表示中,要除去E 用全0和全1(255)10表示零和无穷大的特殊情况,指数 无理数在计算机中是怎么表示的计算机组成原理里面说计算机里是用二进制来表示数据,那请问有无限长度的无理数在计算机中是如何二进制表示的呢?它可是有无数位啊.