C 语言数的表示(二)

C语言数的表示

纯理论记录C语文是如果表示数值的,原理向,仅记录备忘。

十进制与二进制的转换

先记工式,任意一个二进制浮点数V可以表示成下面的形式;

V = (-1)^sM2^E

  1. (-1)^s表示符号位,当s=0时,V为正数,当s=1时,V为负数。

  2. M表示有效数字,大于等于1,小于2。

  3. 2^E表示指数位。

举例说明,十进制的5.0,写成二进制是101.0,相当于-1.01*2^2,那么,s=1,M=1.01,E=2。

32位浮点数,最高1位是符号位S,接着8位是指数E,剩下23位为有效数字M。

64位浮点数,最高1位是符号位S,接着11位是指数E,剩下52位为有效数字M。

IEEE 754对有效数字M和指数E还有一些特别的规定:

对于有效数字M

1<=M<2,也就是说M可以写成1.XXXX的形式,其中XXXX表示小数部分。在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的XXXX部分。比如保存1.01的时候,只存在01,等到读取的时候,再把第一位的1加上去。这样的目的,是节省1位有效数字。以32位浮点数为例留给M只有23位,将第1位舍去以后,等于可以保存24位有效数字。

对于指数E

首先,E为一个无符号数(unsignedint),如果E为8位,它的取值范围为[0,255];如果E为11位,它的取值范围为[0,2047]。但是,我们知道,科学计数法中E是可以出负数的,所以IEEE 754规定,E的真实值必须再减去一个中间数,对于8位的E,这个中间数是127,对于11位的E,这个中间数是1023。

E-中间数得到的值即为指数领衔值(exponent bias),是指浮点数表示法中的指数域的编码值为实际值加上某个固定值,IEEE 754规定该固定值为2^(e-1)-1,其中e为存储指数的比特的长度。

比如2^10的E是10,保存的成32位的浮点数时,必须保存成10+127=137,即10001001。

采用指数的实际值加上固定领衔值的办法表示浮点数的指数,好处是可以用长度为e个比特的无符号数表示所有的指数取值,这使得两个浮点数的指数大小的比较更为容易,实际上可以按照字典充比较两个浮点数的大小,这种移码表示指数部分,中文称为阶码。

以单精度型阶码表示示例如下:

例1

如果我们要表示0,则有0+127=127,二进制表示为:0000 0000+0111 1111=0111 1111;

例2

如果我们要表示1,则有1+127=128,二进制表示为:0000 0001+0111 1111=1000 0000;

例3

如果我们要表示2,则有2+127=129,二进制表示为:0000 0010+0111 1111=1000 0001;

例4

如果我们要表示128,则有128+127=255,二进制表示为:1000 0000+0111 1111=1111 1111;

移码128即为8位二进制移位存储表示的最大正数。

我们再来看一下负数:

例5

如果我们要表示-1,则有-1+127=126,二进制表示为

然后,指数E还分三种情况:

  1. E不全为0或不全为1时,浮点数就彩上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再奖有效数字M前加上第一位的1。

  2. E全为0时,浮点数的指数E等于1-127(1-1023),有效数字M不再加上第一位的1,而是还为0.XXXX的小数,这样作是为了表示±0,以及接近0的很小的数值。

  3. E全为1时,如果有效数字M全为0,表示±无穷大(正负取决于符号s);如果有效数字M不全为0,表示这个数不是一个数(NaN)。


C 语言数的表示(二)
https://ywmy.xyz/2019/03/04/C-语言数的表示(二)/
作者
ian
发布于
2019年3月4日
许可协议