计算机中的定点二进制 浮点数二进制

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dingpf1209/article/details/84821139

    在计算机中二进制定点表示方法有原码、反码、补码。
    所谓原码就是二进制定点表示法,即最高位为符号位,“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

猜你喜欢

转载自blog.csdn.net/dingpf1209/article/details/84821139