计算机中的定点二进制 浮点数二进制
在计算机中二进制定点表示方法有原码、反码、补码。
所谓原码就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对正数逐位取反,符号位保持为1.
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1
详情可参考:反码 https://baike.baidu.com/item/反码/769985?fr=aladdin
IEEE浮点表示
IEEE,是一个国际性的电子技术与信息科学工程师的协会,是目前全球最大的非营利性专业技术学会,IEEE 754 标准是IEEE二进位浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号。
IEEE 浮点标准表示: V = (-1)s * M * 2E 。
①、s 是符号位,为0时表示正,为1时表示负。
②、M为尾数,是一个二进制小数,它的范围是0至1-ε,或者1至2-ε(ε的值一般是2-k次方,其中设k > 0)
③、E为阶码,可正可负,作用是给尾数加权。
我们将浮点数的位划分为三个阶段,分别对这些值进行编码。
一、一个单独的符号位 s 直接编码符号 s
二、k 位的阶码字段 exp =ek-1ek-2…e1e0 编码阶码E
三、n 位小数字段 frac = fn-1fn-2…f1f0 编码尾数 M,但是编码出来的值也依赖于阶码字段的值是否等于0.
一般来说,现在的编译器都支持两种浮点格式,一种是单精度,一种是双精度。单双精度分别对应于编程语言当中的float和double类型。其中float是单精度的,采用32位二进制表示,其中1位符号位,8位阶码以及23位尾数。double是双精度的,采用64位二进制表示,其中1位符号位,11位阶码以及52位尾数。
阶码E 的位模式exp既不全为0(数值0),也不全为1(单精度8位1,数值为255,双精度11位,数值为2047)。
这种情况下,阶码字段被解释为以偏置形式表示的有符号整数。”偏置”的含义就是在原有的值的基础上加上一个偏移量,对于阶码位数为k的情况来说,偏移量Bias = 2k-1-1。假设e是阶码的无符号数值,那么真实的阶码E = e - Bias。
单精度阶码位数为8,则Bias = 127。由于8位阶码下的规格化的浮点数的阶码范围是1至254,因此真实阶码的范围则为-126至127。
—————————— 浮点数的表示范围 ——————————
通过上面的规格化表示,我们可以很容易确定浮点数的表示范围:
既然有表示范围,那肯定也有不能表示的数值:
首先来说明溢出值,如下图:
(1)无穷值:
如果指数E=111111112=25510E=111111112=25510且尾数M=0M=0,则根据符号位S分别表示+∞+∞和−∞−∞。因此,一个有效的32位浮点数其指数最大只能为254。
此外,无穷具有传递性,比如
(+∞) + (+7) = (+∞)
(+∞) × (−2) = (−∞)
(+∞) × 0 = NaN
(2)零值:
如果指数E=0E=0且尾数M=0M=0时,表示机器0.需要注意的是,这里的0也是有符号的,在数值比较的时候 +0=−0+0=−0; 但在一些特殊操作下,二者并不显相等,比如log(x)log(x), 1+0≠1−01+0≠1−0。
此外,处于负下溢出和负上溢出之间的数值会被直接归为0。
(3)NAN:
如果E=0且尾数M≠0,则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,如0000, ∞×0∞×0, sqrt(−1)sqrt(−1);SNAN一般被用于标记未初始化的值,以此来捕获异常。
十进制浮点数转二进制
十进制小数的二进制表示:
整数部分:除以2,取出余数,商继续除以2,直到得到0为止,将取出的余数逆序
小数部分:乘以2,然后取出整数部分,将剩下的小数部分继续乘以2,然后再取整数部分,一直取到小数部分为零为止。如果永远不为零,则按要求保留足够位数的小数,最后一位做0舍1入。将取出的整数顺序排列。
举例:22.8125 转二进制的计算过程:
整数部分:除以2,商继续除以2,得到0为止,将余数逆序排列。
22 / 2 11 余0
11/2 5 余 1
5 /2 2 余 1
2 /2 1 余 0
1 /2 0 余 1
得到22的二进制是10110
小数部分:乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
0.8125x2=1.625 取整1,小数部分是0.625
0.625x2=1.25 取整1,小数部分是0.25
0.25x2=0.5 取整0,小数部分是0.5
0.5x2=1.0 取整1,小数部分是0,
得到0.8125的二进制是0.1101
结果:十进制22.8125等于二进制00010110.1101