更新时间:2023-11-26 10:50
浮点表示法是已知的C/C++编译器都是按照IEEE(国际电子电器工程师协会)制定的IEEE浮点数表示法来进行运算的。这种结构是一种科学表示法,用符号(+或-)、指数和尾数来表示,底数被确定为2。所以在IEEE浮点数表示法里,一个浮点数为尾数乘以2的指数次方再加上符号。
float规格float共计32位,4字节由最高到最低位分别是第31、30、29、……、0位,则:31位是符号位,1表示该数为负,0表示为正。30-23位,一共8位是指数位。22-0位,一共23位是尾数位。3、转换例子按照IEEE浮点数表示法,将float型浮点数123456.0f转换为二进制(注:这里的f表示浮点数,为十进制数,不是表示16十六进制)。处理不带小数的浮点数时,直接将整数部转化为二进制表示:11110001001000000也可以这样表示:11110001001000000.0然后将小数点向左移,一直移到离最高位只有1位:1.11100010010000000共左移了16位,所以原数就等于:1.11100010010000000*(2^16)。 可知尾数为1。
移码是一种专门用于浮点数阶码表示的码制采用这种表示方法可以更方便地比较两数阶码的大小
其定义式为([x]为x的移码):
[x]=2^m+x
浮点数格式:先将数写成一种指数形式,
N=±R^E*M
其中N为真值,R^E为比例因子,M是尾数。
(EfE1E2E3E4E5E6E7MfM1M2M3M4M5M6M7)
其中Ef到E7这部分叫做阶码,用移码表示,Ef是阶符,
Mf到M7称作尾数,用补码表示,Mf为数符,
小数点的位置在Mf后面
对于浮点数的表示,字长是由硬件决定,如字长可以是32位,其中阶码8位,含一位阶符,则阶码的表示范围为-128到127,尾数为23位
例如,原数为-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
我们知道需要把十进制数转换为二进制数进行存储表示,整数转换为二进制很简单,也不会有什么误差。那么当我们要表示的是浮点数又是什么样的呢? 在浮点数中,只有少量的数可以用这种方法精确的表示出来,而绝大多数是无法精确表示的。举一个简单的例子:
3.14159 我们直接对它进行转换,则为11.0010010000111111001⋯
用这种方法我们无法把3.14159 精确表示我们可以用这两种方法来表示浮点数:
1 .BCD 代码
2 . 阶码尾数表示法
3 . 我们可以把第二种方法改造一下,就能得到一种更好的方法先把一个浮点数的小数点移到最后,用N=M×RC 表示,R=10,然后再把M 转换为二进制B,再用C 做阶码,B 做尾数用阶码尾数法表示。
例如: 3.14159=314159×10- 5
314159 用二进制表示为1001100101100101111
用这种方法不仅可以精确表示浮点数的值,还可以充分的利用存储空间。
几种方法的比较:
1. 直接将浮点数转换为二进制方法无法精确表示。
2.BCD 码表示方便易懂,但不能充分利用空间。
3. 方法3 既可以精确表示浮点数,又能很好的利用空间。