精华内容
下载资源
问答
  • 浮点数表示

    万次阅读 多人点赞 2016-12-22 15:00:17
    浮点数表示 浮点数的规格化表示 浮点数的表示范围 浮点数的表示精度 参考资料 之前的一些工作当中碰到了很多有关浮点数的问题,比如浮点数的表达范围、表达精度、浮点数的存储方式、浮点数的强制类型转换...

    之前的一些工作当中碰到了很多有关浮点数的问题,比如浮点数的表达范围、表达精度、浮点数的存储方式、浮点数的强制类型转换等等,因此感觉有必要系统了解一下有关浮点数的问题。

    —————————— 浮点数表示 ——————————

    浮点数是一种 公式化 的表达方式,用来近似表示实数,并且可以在表达范围和表示精度之间进行权衡(因此被称为浮点数)。

    浮点数通常被表示为:

    \(N = M\times R^E\)

    比如: \(12.345 = 1.2345\times 10^1\)

    其中,M(Mantissa)被称为浮点数的 尾数 ,R(Radix)被称为阶码的 基数 ,E(Exponent)被称为阶的 阶码 。计算机中一般规定R为2、8或16,是一个确定的常数,不需要在浮点数中明确表示出来。

    因此,在已知标准下,要表示浮点数,

    一是要给出尾数M的值,通常用定点小数形式表示,它决定了浮点数的表示精度,即可以给出的有效数字的位数。

    二是要给出阶码,通常用定点整数形式表示,它指出的是小数点在数据中的位置,决定了浮点数的表示范围。因此,在计算机中,浮点数通常被表示成如下格式:(假定为32位浮点数,基为2,其中最高位为符号位)

    浮点数

    —————————— 浮点数的规格化表示 ——————————

    按照上面的指数表示方法,一个浮点数会有不同的表示:

    \(0.3\times10^0\);\(0.03\times10^1\);\(0.003\times10^2\);\(0.0003\times10^3\);

    为了提高数据的表示精度同时保证数据表示的唯一性,需要对浮点数做规格化处理。

    在计算机内,对非0值的浮点数,要求尾数的绝对值必须大于基数的倒数,即\(|M|\ge \frac{1}{R}\)。

    即要求尾数域的最高有效位应为1,称满足这种表示要求的浮点数为规格化表示:把不满足这一表示要求的尾数,变成满足这一要求的尾数的操作过程,叫作浮点数的规格化处理,通过尾数移位和修改阶码实现。

    比如,二进制原码的规格化数的表现形式:(0正1负)

    正数 0.1xxxxxx

    负数 1.1xxxxxx

    注意,尾数的最高位始终是1,因此我们完全可以省略掉该位。

    至此,我们引入IEEE754 标准,该标准约束了浮点数的大部分使用设置:(尾数用原码;阶码用“移码”;基为2)

    (1) 尾数用原码,且隐藏尾数最高位。

    原码非0值浮点数的尾数数值最高位必定为 1,因此可以忽略掉该位,这样用同样多的位数就能多存一位二进制数,有利于提高数据表示精度,称这种处理方案使用了隐藏位技术。当然,在取回这样的浮点数到运算器执行运算时,必须先恢复该隐藏位。

    (2) 阶码使用“移码”,基固定为2

    如下图的32bit浮点数和64bit浮点数,从最高位依次是符号位、阶码和尾数
    float

    于是,

    一个规格化的32位浮点数x的真值为:

    \(x = (-1)^s\times(1.M)\times2^{E-127}\)

    一个规格化的64位浮点数x的真值为:

    \(x = (-1)^s\times(1.M)\times2^{E-1023}\)

    下面举一个32位单精度浮点数-3.75表示的例子帮助理解:

    (1) 首先转化为2进制表示

    \(-3.75 = -(2+1+1/2+1/4) = -1.111\times2^1\)

    (2) 整理符号位并进行规格化表示

    \(-1.111\times2^1 = (-1)^{(1)}\times(1+0.1110\ 0000\ 0000\ 0000\ 0000\ 000)\times2^1\)

    (3) 进行阶码的移码处理
    \((-1)^{(1)}\times(1+0.1110\ 0000\ 0000\ 0000\ 0000\ 000)\times2^1\)
    \(=(-1)^{(1)}\times(1+0.1110\ 0000\ 0000\ 0000\ 0000\ 000)\times2^{128-127}\)

    于是,符号位S=1,尾数M为\(1110\ 0000\ 0000\ 0000\ 0000\ 000\)阶码E为\(128_{10}=1000\ 0000_2\),则最终的32位单精度浮点数为

    \(1\ 1110\ 0000\ 0000\ 0000\ 0000\ 000\ 1000\ 0000\)

    —————————— 浮点数的表示范围 ——————————

    通过上面的规格化表示,我们可以很容易确定浮点数的表示范围:

    float range

    既然有表示范围,那肯定也有不能表示的数值:
    首先来说明溢出值,如下图:
    float overflow

    (1)无穷值:

    如果指数\(E=11111111_2=255_{10}\)且尾数\(M=0\),则根据符号位S分别表示\(+\infty\)和\(-\infty\)。因此,一个有效的32位浮点数其指数最大只能为254。

    此外,无穷具有传递性,比如

    (+∞) + (+7) = (+∞)

    (+∞) × (−2) = (−∞)

    (+∞) × 0 = NaN

    (2)零值:

    如果指数\(E=0\)且尾数\(M=0\)时,表示机器0.需要注意的是,这里的0也是有符号的,在数值比较的时候 \(+0=-0\); 但在一些特殊操作下,二者并不显相等,比如\(\log(x)\), \(\frac{1}{+0} \neq \frac{1}{-0}\)。

    此外,处于负下溢出和负上溢出之间的数值会被直接归为0。

    (3)NAN:

    如果\(E=0\)且尾数\(M\neq 0\),则表示这个值不是一个真正的值(Not A Number)。NAN又分成两类:QNAN(Quiet NAN)和SNAN(Singaling NAN)。QNAN与SNAN的不同之处在于,QNAN的尾数部分最高位定义为1,SNAN最高位定义为0;QNAN一般表示未定义的算术运算结果,如\(\frac{0}{0}\), \(\infty \times 0\), \(sqrt(-1)\);SNAN一般被用于标记未初始化的值,以此来捕获异常。

    —————————— 浮点数的表示精度 ——————

    一般提到浮点数的精度(有效位数)的时候,总是会出现 float的有效位为6~7位, double的有效位为15~16位

    下面以float为例,解释一下有效位数是怎样来的。

    有效位数只和规格化浮点数的尾数部分有关,而尾数部分的位数是23位,因此我们首先列出下表

    float overflow

    由上面的表格可以看出:

    \(2^{-23}\) 和 \(2^{-22}\) 之间是存在间隔的,即0.0000001和0.0000002之间的小数我们是没有办法描述的,因此23位尾数最多只能描述到小数点后第7位;此外,我们通过四舍五入可以很容易发现\(0.0000003 = 0.0000004 = 2^{-23}+2^{-22}\), 这表明第7位有效数字只是部分准确。而第6位及之前的都是可以准确描述的,因此我们说float的有效位为6~7位。

    —————————— 参考资料 ——————————

    (1) WIKI 词条 “Floating Point”: https://en.wikipedia.org/wiki/Floating_point

    (2) WIKI 词条 “IEEE floating point”: https://en.wikipedia.org/wiki/IEEE_floating_point

    (2) 浮点异常值:NAN,QNAN,SNAN:
    http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html

    展开全文
  • 计算机组成原理浮点数表示及运算PPT课件.pptx
  • 浮点数表示方法

    万次阅读 多人点赞 2018-12-11 21:01:06
    浮点数表示  浮点数是一种 公式化 的表达方式,用来近似表示实数,并且可以在表达范围和表示精度之间进行权衡(因此被称为浮点数)。 浮点数通常被表示为: N=M×R^E 比如: 12.345=1.2345×10^1 其中,...

    之前的一些工作当中碰到了很多有关浮点数的问题,比如浮点数的表达范围、表达精度、浮点数的存储方式、浮点数的强制类型转换等等,因此感觉有必要系统了解一下有关浮点数的问题。

    浮点数表示 

    浮点数是一种 公式化 的表达方式,用来近似表示实数,并且可以在表达范围和表示精度之间进行权衡(因此被称为浮点数)。

    浮点数通常被表示为:

    N=M×R^E

    比如: 12.345=1.2345×10^1

    其中,M(Mantissa)被称为浮点数的 尾数 ,R(Radix)被称为阶码的 基数 ,E(Exponent)被称为阶的 阶码 。计算机中一般规定R为2、8或16,是一个确定的常数,不需要在浮点数中明确表示出来。

    因此,在已知标准下,要表示浮点数,

    一是要给出尾数M的值,通常用定点小数形式表示,它决定了浮点数的表示精度,即可以给出的有效数字的位数。

    二是要给出阶码,通常用定点整数形式表示,它指出的是小数点在数据中的位置,决定了浮点数的表示范围。因此,在计算机中,浮点数通常被表示成如下格式:(假定为32位浮点数,基为2,其中最高位为符号位)

    浮点数

    浮点数的规格化表示 

    按照上面的指数表示方法,一个浮点数会有不同的表示:

    0.3×10^0;0.03×10^1;0.003×10^2;0.0003×10^3;

    为了提高数据的表示精度同时保证数据表示的唯一性,需要对浮点数做规格化处理。

    在计算机内,对非0值的浮点数,要求尾数的绝对值必须大于基数的倒数,即|M|≥1/R。

    即要求尾数域的最高有效位应为1,称满足这种表示要求的浮点数为规格化表示:把不满足这一表示要求的尾数,变成满足这一要求的尾数的操作过程,叫作浮点数的规格化处理,通过尾数移位和修改阶码实现。

    比如,二进制原码的规格化数的表现形式:(0正1负)

    正数 0.1xxxxxx

    负数 1.1xxxxxx

    注意,尾数的最高位始终是1,因此我们完全可以省略掉该位。

    至此,我们引入IEEE754 标准,该标准约束了浮点数的大部分使用设置:(尾数用原码;阶码用“移码”;基为2)

    (1) 尾数用原码,且隐藏尾数最高位。

    原码非0值浮点数的尾数数值最高位必定为 1,因此可以忽略掉该位,这样用同样多的位数就能多存一位二进制数,有利于提高数据表示精度,称这种处理方案使用了隐藏位技术。当然,在取回这样的浮点数到运算器执行运算时,必须先恢复该隐藏位。

    (2) 阶码使用“移码”,基固定为2

    如下图的32bit浮点数和64bit浮点数,从最高位依次是符号位、阶码和尾数 

    float
    于是,

    一个规格化的32位浮点数x的真值为:

    x=(−1)^s×(1.M)×2E^−127

    一个规格化的64位浮点数x的真值为:

    x=(−1)^s×(1.M)×2E^−1023

    下面举一个32位单精度浮点数-3.75表示的例子帮助理解:

    (1) 首先转化为2进制表示

    −3.75=−(2+1+1/2+1/4)=−1.111×2^1

    (2) 整理符号位并进行规格化表示

    −1.111×2^1=(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1

    (3) 进行阶码的移码处理 
    (−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^1
     
    =(−1)^(1)×(1+0.1110 0000 0000 0000 0000 000)×2^(128−127)

    于是,符号位S=1,尾数M为1110 0000 0000 0000 0000 000
    阶码E为12810=1000 00002
    ,则最终的32位单精度浮点数为

    1 1110 0000 0000 0000 0000 000 1000 0000

    浮点数的表示范围 

    通过上面的规格化表示,我们可以很容易确定浮点数的表示范围:

    float range

    既然有表示范围,那肯定也有不能表示的数值: 
    首先来说明溢出值,如下图: 

    float overflow


    (1)无穷值:

    如果指数E=11111111(2)=255(10)
    且尾数M=0
    ,则根据符号位S分别表示+∞
    和−∞
    。因此,一个有效的32位浮点数其指数最大只能为254。

    此外,无穷具有传递性,比如

    (+∞) + (+7) = (+∞)

    (+∞) × (−2) = (−∞)

    (+∞) × 0 = NaN

    (2)零值:

    如果指数E=0
    且尾数M=0
    时,表示机器0.需要注意的是,这里的0也是有符号的,在数值比较的时候 +0=−0
    ; 但在一些特殊操作下,二者并不显相等,比如log(x), 1/+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一般表示未定义的算术运算结果,如0/0, ∞×0, sqrt(−1);SNAN一般被用于标记未初始化的值,以此来捕获异常。

    浮点数的表示精度

    一般提到浮点数的精度(有效位数)的时候,总是会出现 float的有效位为6~7位, double的有效位为15~16位 。

    下面以float为例,解释一下有效位数是怎样来的。

    有效位数只和规格化浮点数的尾数部分有关,而尾数部分的位数是23位,因此我们首先列出下表

    float overflow

    由上面的表格可以看出:

    2^−23 和 2^−22 之间是存在间隔的,即0.0000001和0.0000002之间的小数我们是没有办法描述的,因此23位尾数最多只能描述到小数点后第7位;此外,我们通过四舍五入可以很容易发现0.0000003=0.0000004=2^−23+2^−22
    , 这表明第7位有效数字只是部分准确。而第6位及之前的都是可以准确描述的,因此我们说float的有效位为6~7位。

     参考资料 

    (1) WIKI 词条 “Floating Point”: https://en.wikipedia.org/wiki/Floating_point

    (2) WIKI 词条 “IEEE floating point”: https://en.wikipedia.org/wiki/IEEE_floating_point

    (2) 浮点异常值:NAN,QNAN,SNAN: 
    http://www.cnblogs.com/konlil/archive/2011/07/06/2099646.html
    --------------------- 
    作者:shuzfan 
    来源:CSDN 
    原文:https://blog.csdn.net/shuzfan/article/details/53814424 

    展开全文
  • 浮点数表示总结

    千次阅读 2018-09-18 18:32:26
    这种表示法类似于十进制中的科学计数法——它的优点是数的数量级、精确度以及数值都非常准确,浮点数表示其基数为 22,因此一个浮点数 aa 由两个数 mm 和 ee来表示:a=m×bea=m×be,其中 bb 表示基数,...

    浮点数

    早期的计算机使用定点数来表示实数,由于定点数的小数点位置固定,而计算机字长有限,定点数无法表示很大和很小的实数,因此而在计算机科学中有了对于实数近似值数值的表示法——浮点数。这种表示法类似于十进制中的科学计数法——它的优点是数的数量级、精确度以及数值都非常准确,浮点数表示其基数为 22,因此一个浮点数 aa 由两个数 mm 和 ee来表示:a=m×bea=m×be,其中 bb 表示基数,mm 称为尾数。下面对浮点数在计算机中的表示详细介绍。

    1.1 浮点数在计算机中的表示

    浮点数可以这样表示[1]:Value=sign×exponent×fractionValue=sign×exponent×fraction

    也就是说浮点数的实际值等于,符号值乘以指数偏移值,再乘以分数值。

    我们知道当前绝大多数计算机(据说有过三进制计算机[7])的数据都是二进制编码(0 和 1),在计算机中,二进制的浮点数按照以上公式在一定字长内(单精度浮点数32位,双精度浮点数64位)分别存储“符号位(sign bit)”,“指数部分”——次高有效的 e 个比特,以及“有效数(significand)”的小数部分——非规约数(稍后介绍)整数部分为 0,其他整数部分一律为 1。存储形式如下图所示: 
     
    (图片引用自[1]

    1.1.1 指数偏移值

    这里着重介绍关于“指数部分”的偏移量,IEEE754 中规定,单精度浮点数的指数域是 8 个比特,因此它的指数偏移值为 28−1−1=12728−1−1=127,64 位双精度浮点数的值数域是 11 个比特,它的指数偏移值为 211−1−1=1023211−1−1=1023。

    为什么要指数编码时需要加上一个偏移值?

    我们知道,在 10 进制的科学计数法中,指数可以是负数,而计算机存储浮点数的“指数部分”又是一个无符号的整数,因此,在 IEEE754 标准规定,exponent 必须减去一个偏移值而得到真实的“指数值”。

    为什么单精度浮点数指数偏移值是 127,双精度浮点数指数偏移值是 1023 呢?

     IEEE754 标准规定了几个特殊值[1]:

    • 如果指数是 0 并且尾数的小数部分是 0,这个数是 ±0(和符号位有关)。
    • 如果指数 =2e−1=2e−1 并且尾数的小数部分是 0,这个数是 ±∞(同样和符号位有关)。
    • 如果指数 =2e−1=2e−1 并且尾数的小数部分非 0,这个数表示为不是一个数 NaN。 

    (注意,这里所说的指数是指编码后的指数值(即阶码),而非指数真值,务必了解清楚。)

    [8]这就意味着,单精度浮点数的 8 位阶码(即移码表示的指数部分)除特殊值外所表示范围为 (1,254)(1,254),我们知道 8 位有符号数的补码取值范围是 (−128,+127),(−128,+127),假设偏移值是 +128,在表示真值 +127 时阶码为 1111 1111,显然,根据 IEEE754 标准,255 是保留数值,偏移值是 +128 表达 +127时产生了上溢。与此同时,偏移值为 +127,在表达 -127 时,阶码为 0000 0000,同样依据 IEEE754 标准,0 也是保留数值,于是产生了下溢(更无法表达 -128 真值),因此阶码真值去掉 -127 和 -128,其取值范围为 (−126,+127)(−126,+127)。

    此外,关于偏移量取值为 127 而不是 128 有另一种说法:为了使浮点数上下(正负)取值范围相对对称[9],相对而言,更倾向上文的说法。

    为什么计算机存储浮点数的“指数部分”要用移码表示?

    有符号数的原码、反码和补码一个共同特点是将符号作为最高位,与数值部分一起编码,正好是 “0”,负号是 “1”。这样在比较不同符号数据时比较麻烦,机器认为 “1” 比 “0” 大,因此,正负数比较时可能得到的结果是负数比较大,这显然不合理,而移码和补码的区别是符号位刚好相反,这样,便可以直接使用移码对不同符号数据进行比较了。

    1.1.2 规约浮点数[1]

    规约——指用唯一确定的浮点形式表示一个值。 wiki 中对规约浮点数做了说明:如果指数编码值在区间 0<exponent<2e−20<exponent<2e−2 之间(例如,单精度浮点数,其指数编码值区间为 0<e<2550<e<255),且在科学计数法表示下,其分数的最高有效位为 是 1。(注意一点,规约浮点数尾数的最高有效位 1 是隐藏的。)

    1.1.3 非规约浮点数

    如果浮点数指数部分编码值是 0,分数部分非 0,那么这样的浮点数称为非规约浮点数。IEEE754 标准规定,非规约浮点数指数偏移值比规约浮点数指数偏移值小 1,例如,单精度规约浮点数其指数偏移值是 127,其非规约浮点数指数偏移值就是 126,这也就意味着,非规约浮点数的指数真值是 -126,这也其指数编码值刚好是 0。

    非规约浮点数有两个作用一是提供了表示数值 0 的方法,因为规约浮点数规定了尾数 ≥1≥1,因此规约浮点数不能表示数值 0,当阶码字段全为 0 时(这表明该浮点数是一个非规约浮点数),尾数有效位也是 0 时,该浮点数绝对值是 0,再结合符号位,我们可以得到 ±0±0。

    非规约数第二个作用是可以表示接近 0 的数值,它比最小规约浮点数更趋近 0,IEEE754-1985 标准使用非规约浮点数填补最小规约数与 0 的距离,非规约浮点数提供了一种属性称为“逐渐式下溢出(gradual underflow)”,所有可能的数值均分分布的接近 0,否则会发生“突然式下溢出(abrupt underflow)”,对于单精度浮点数,我们知道最小规约浮点数的绝对值是 1.0×2−1261.0×2−126(尾数真值是 1.0,指数真值是 1),次小的最小规约浮点数是 1.0×2−126×2−231.0×2−126×2−23,会发现最小规约浮点数 与 0 的距离是与相邻次小规约浮点数距离的 223223 倍,非常突然的下溢出到 0,这会造成一种情况,两个小浮点数 XX 和 YY (在区间 [−1.0×2−126,1.0×2−126][−1.0×2−126,1.0×2−126] 内)相减的结果为 0,显然这不合理,非规约浮点数可以解决该问题,依据非规约浮点数的定义(注意非规约浮点数指数编码值是 0,其实际值是 -126),它的最大和最小绝对值表示分别为: (1.0−2−23)×2−126(1.0−2−23)×2−126 和 2−23×2−1262−23×2−126,这些数值相邻距离是 2−1492−149,最小非规约浮点数绝对值和 0 的距离也是 2−1492−149,因此,非规约浮点数扩大了 0 附近的浮点数表示范围。

    为什么非规约浮点数这样设置指数偏移值(Bias−1Bias−1,这里注意下,在有些教程中偏移值是负值1−Bias1−Bias)?

    这种方式提供了一种从非规格化数值平滑转换到规格化数值的方法。《深入理解计算机系统》第三章 81 页以 8 位浮点数举例,假设其阶码占 4 位,小数位占 3 位,计算出来最大的非规约浮点数为 75127512,最小的规约浮点数为 85128512,从非规约浮点数到规约浮点数的平滑转变归功于将指数 EE 定义为 1−Bias1−Bias(Bias−1Bias−1),而不是 −Bias−Bias(BiasBias),这样可以补偿非规约浮点数尾数没有隐含的开头 1。最大非规约浮点数和最小规约浮点数的阶码相同,并且其尾数刚好相差 2−n2−n(尾数占位是 n,以上文 8 位浮点数举例,小数占 3 位,则最大非规约浮点数尾数为 0.111,最小规约浮点数尾数为 1.000,两者之差刚好是 2−32−3),这样正好可以完成非规约浮点数到规约浮点数的平滑过渡。 

    1.2 单精度和双精度浮点数

    C/C++ 中 float 和 double 分别表示单精度类型浮点数和双精度类型浮点数,float 是 32 位 4 个字节,double 是 64 位 8 个字节,在 IEEE754[1] 标准规范中它们的“符号位”,“指数部分”以及“尾数”(即小数部分)占位如下: 
     
    (图片引用自[1]) 
     
    (图片引用自[1]

    1.3 浮点数转二进制

    假设我们有一个 10 进制浮点数 x=12.34x=12.34,xx 的整数部分可以表示为 1×101+2×1001×101+2×100,小数部分可以表示为 3×10−1+4×10−23×10−1+4×10−2,类似推广到其他进制表示,例如我们有一个二进制数 110.011110.011,其整数部分可以表示为 1×22+1×21+0×201×22+1×21+0×20,小数部分表示为 0×2−1+1×2−2+1×2−30×2−1+1×2−2+1×2−3。其他进制表示同理。(注意,我们通常习惯的运算是基于 10 进制的,以上进制的运算表达式所得数值也是 10进制。) 
     
    (图片引用自[10]) 
    28 的三进制表示即为 1001 (通常高位在左,低位在右),三进制 1001 可表示为: 1×33+0×32+0×31+1×301×33+0×32+0×31+1×30,可以看出以上短除法运算过程其实是三进制整数转换为 10 进制数的逆过程。

    对于小数部分,如何从 10 进制转换为二进制表示?回顾上文,采用乘 2 取整法,即将小数部分乘以 2,取结果的整数部分,剩下的小数部分继续乘以 2,再取整数部分,一直循环,知道小数部分为 0,如果小数部分一直不能为 0,就需要按照保留位数,对保留位之外的数值原则上舍 0 入 1。最后对全部所取整数从第一个到最后一个依次排列,这一点与短除法转换 10 进制整数刚好相反。

    1.3.1 无小数浮点数转二进制表示

    依据 IEEE754 标准,我们知道浮点数有几个特殊值,比如数值 0,单精度浮点数的表示为:

    s0|e00000000|f00000000000000000000000.sef0|00000000|00000000000000000000000.

    其他浮点数特殊值都有其对应二进制表示。

    那么对于一个普通的无小数浮点数,例如 12.012.0,如何将其转换成二进制表示呢?该浮点数整数部分是 1212,小数部分是 00,首先将它们分别转换为二进制表示。

    利用短除法,10 进制数 1212 可以表示为:11001100,因为无小数,12.012.0 二进制表示为 1100.01100.0,根据 IEEE754 标准,规约浮点数尾数有一个隐含的高位 1,所以小数点向左移动三位,12.012.0 就表示为 1.100×231.100×23,以单精度浮点数为例,尾数 23 位,指数偏移值是127,尾数 M=.100M=.100 后面补 0 直到总共有 23 位,指数编码值 e=3+127=130e=3+127=130,最后我们得到:

    0|10000010|10000000000000000000000.0|10000010|10000000000000000000000.

    1.3.2 含小数浮点数转二进制表示

    对于含小数的浮点数,需要将整数部分和小数部分分开处理,上文也分别介绍过两者转换二进制表示的方法,这里不再赘述。整数和小数部分都成功表示为二进制之后,依据 IEEE754 标准,规约化浮点数,最后可得到浮点数在计算机中的存储。

    1.4 浮点数的精度

    前文我们曾以单精度浮点数举例,相邻规约浮点数间的距离是 2−232−23,显然,浮点数不能表示所有的实数。我们知道,如果浮点数的小数部分能够在有限位内转换为二进制数,则浮点数在计算机中是精确表示的。然而,实际上不是所有的小数都可以在有限位内转换为二进制数,前文介绍过保留位之外取得的数值原则上舍 0 取 1,这样截断必然会造成精度的缺失。如果想要得到更精确的浮点数表示,只能依靠不断增加小数有效位,这也就是双精度浮点数比单精度浮点数更精确的原因。

    例如,10 进制小数 0.1,我们使用乘 2 取整的方法,发现小数部分永远无法乘尽,最后会得到无限循环的 (0011)(0011)。

    1.5 浮点数运算

    首先我们明确浮点数的精度问题浮点数运算不遵循结合律和分配律,例如两个浮点数运算由于精度限制可能会产生“舍入”行为,另外我们经常说浮点运算比整数运算要慢,可是慢在哪里却不了解。下面将针对性介绍浮点运算的规则。

    1.5.1 浮点加减运算

    通过前文我们了解到计算机中浮点数阶码直接反应了实际尾数有效值小数点的位置,因此,当两个阶码不同的浮点数加减时,尾数不能直接进行加减运算,浮点加减运算必须按照以下几步进行[13]:

    • 对阶,目的是使两个浮点数小数点位置对其,即使两个浮点数阶码相等。 
      阶码对齐的原则是小阶向大阶看齐,所以,尾数每向右移 1 位,其对应阶码加 1。
    • 尾数求和,尾数求和依照定点运算[13](第 6 章“定点运算”)方式进行加减运算。
    • 规格化(规约化),尾数求和后我们需要依照 IEEE754 标准对求和结果规约化。 
      左规:尾数左移一位,阶码减 1。 
      右规:尾数右移一位,阶码加1。
    • 舍入,要考虑尾数右移丢失的数值,在有限位字长内保证浮点数的精度,前文介绍过,保留位之后的数值原则上“舍 0 取 1”。
    • 溢出判断,判断加减结果是否溢出。 
      补码定点加减运算的溢出判断通常有两种方式:一、使用一个符号位时,溢出只可能发生在正正相加,负负相加,以及正负相减的情形,通常以最高有效位产生的进位和符号位产生的进位异或操作,若结果为 1 表示溢出,结果为 0 表示无溢出;二、使用双符号位,双符号位高位符号发生进位时,自然丢掉,且高位符号位是真正的符号位,当两个符号位不同时则表示发生了溢出。 
      浮点数的溢出判断是根据阶码来判断是否溢出的。形如 01.xxxxxx...01.xxxxxx... 和 10.xxxxxxx...10.xxxxxxx... 的尾数并不表示溢出,只需要右规完成规格化,再根据阶码来判断浮点数是否溢出。一般来说,浮点数下溢指的是数值接近 0,一般将其作为机器零处理,浮点数真正的溢出指的是上溢。

    1.5.2 浮点乘除运算

    和浮点加减法一样,浮点乘除运算分别对阶码进行加减运算和对尾数进行乘除运算。

    • 阶码运算。 
      从上文我们知道阶码中计算机中使用移码存储,如果我们用双符号位表示阶码,即在原移码最高位前加一个符号位,该位恒为 0,如果运算之后,最高符号位变成了 1,则表示溢出,这时低位符号位为 0 表示上溢;低位符号位为 1 表示下溢。若最高符号位是 0,则表示没有溢出,这时低位符号位为 1 表示结果为正;低位符号位为 0 表示结果为负。
    • 尾数运算。 
      尾数运算可参考定点小数乘除法。运算结果可能要进行左规,左规后还可能涉及到尾数舍入的问题,这时有两种处理方式,一是直接丢弃有效尾数位之外的数值,这种方式影响精度;二是采用浮点加减运算中介绍的舍入规则。

    1.6 规约浮点数和非规约浮点数运算效率[12]

    引文中举出了一段比较规约浮点数和非规约浮点书运算效率的代码。

    Reference

    [1]. IEEE754-wiki 
    [2]. 浮点数-wiki 
    [3]. 科学计数法-wiki 
    [4]. 定点数运算 
    [5]. 关于2的补码 
    [6]. 原码、补码、反码 
    [7]. 三进制计算机 
    [8]. 阶码偏移量为什么是127/1023 
    [9]. 阶码偏移量是 127 而不是 128 的另一种说法 
    [10]. 有趣的二进制 
    [11]. 你应该知道的浮点数基础知识 
    [12]. 除法-短除法(Wiki) 
    [13]. 计算机组成原理-唐朔飞

    转载于:https://blog.csdn.net/jvandc/article/details/81176294

    展开全文
  • 2.5.1 浮点数表示法 2.5.1.1 浮点数的表示方式 M称为浮点数的尾数,是一个纯小数 ; E称为浮点数的阶码,是一个整数; R称为基数,对于二进制表示的浮点数,R=2;十 进制表示的浮点数,R=10。 例如,数据3.1415...

    2.5.1 浮点数表示法

    2.5.1.1 浮点数的表示方式

            

            M称为浮点数的尾数,是一个纯小数 ; E称为浮点数的阶码,是一个整数; R称为基数,对于二进制表示的浮点数,R=2;十 进制表示的浮点数,R=10。

            例如,数据3.1415既可以表示成0.31415×10^1,也可以表示成31.415×10^-1,这里R=10,表示为十进制数。

    2.5.1.2 浮点数规格化

            浮点数的尾数一般用补码表示,在规格化小数中,符号位和最高数据位为相反数。即补码表示时,规格化小数的尾数一定形如1.0……或0.1……的形式。

            例1:补码小数01.1010×2³,规范化后为00.1101×2⁴

            此过程称为向右规范化,即尾数向右移动,使尾数符合规范化要求,简称右规。对应操作:尾数右移n位,阶码加上n。

            例2:小数0.00100×2³,规范化后应为0.10000×2¹       

            此过程称为向左规范化,即尾数向左移动,使尾数符合规范化要求,简称左规。 此题中,需要左规2次。对应操作:尾数左移n位,阶码减去n。

            总结,规范化符号位不变,使尾数移位成1.0……或0.1……的形式。

    单选题:浮点数加法运算过程中,经对阶操作后,E补=0011;
    经尾数相加后[Mx+My]补=11101001(带下划线的数字表示符号位),
    讨论尾数是否需要进行规范化处理,则
    
    A左规,阶码减2
    B右规,阶码乘2
    C不需要规格化
    D右规,阶码加2
    
    
    
    答案:A
    

    展开全文
  • c++ 浮点数表示

    千次阅读 2019-09-28 16:58:51
    对于一个浮点数来说,其通常可以科学计数法来表示,而对于一个浮点数来说,由于次方可变,故小数点可以左右移动。 eg:-36.5 ,及可以表示为:,也可以表示为,故称为浮点数。 2.十进制浮点数以及规范化 在十...
  • 机器中的浮点数表示

    千次阅读 2018-10-09 20:45:07
    在初学C语言时,一直体会不到所谓的浮点数容易造成误差,最近看到一篇关于浮点数的文章,加上现在的学习,对浮点数的内部存储方式有了更加深入的理解,于是也渐渐理解了浮点数的误差。  相比int等整型,float等...
  • java中浮点数表示方式

    千次阅读 2020-12-27 15:38:29
    float的32位分成三个部分来表示一个浮点数: 浮点数的取值计算公式为: 解析: 1) 当符号位s的取值为0时,sflag为1, 当s为1时,sflag为-1. 所以有: 2)e 为指数位,用 8 位表示 3) m 为尾数值,占用空间为...
  • 关于IEEE浮点数表示

    2020-09-25 11:49:50
    计算机表示整数是精确的,这得益于任何一个整数都可以转换为若干个2的幂次方相加 关于整数其主要包含两大类: 无符号整数:以unsigned int 32位无符号整型为例: 其表示的值是所有相应二进制位中为1的位对应2的...
  • 浮点数表示和运算

    2020-12-23 20:57:17
    浮点数表示和运算标题浮点数表示浮点数的加法和减法运算 通过学习了计算机系统的相关知识,我对浮点数表示和算法部分格外关注,总结了一点知识点在这里。 标题浮点数表示 在现代计算机中,为了便于软件移植...
  • 计组——浮点数表示

    2021-03-17 20:43:58
    文章目录一、偏移值二、浮点数Ⅰ、表示原理Ⅱ、实际的浮点表示二、规格化数字和非规格化数字Ⅰ、规格化数字(Normal)Ⅱ、非规格化数字(Subnormal/Denormalized) 一、偏移值 将一个数字加上偏移值M,结果称为关于M...
  • IEEE浮点数表示

    2018-09-29 20:12:46
    IEEE浮点数表示 符号 尾数 阶码 单精度浮点数:1为符号位,8位阶码字段,23位小数字段,共32位; 双精度浮点数:1位符号位,11位阶码字段,52位小数字段,共64位; 被编码的值分三种情况: 偏置:bias 情况1:...
  • 这种浮点数是用科学记数法来表示的,即:浮点数=符号位.尾数×2^阶码。 根据IEEE 754国际标准,常用的浮点数有三种格式: (1) 单精度浮点数(32位),阶码8位,尾数24位(内含1位符号位)。 (2) 双精度浮点数(64位...
  • 浮点数表示方式 注意:定点数并不是仅仅只能表示整数,定点数也可以表示小数。 浮点数同样可以表示小数和整数;定点数和浮点数只是计算机表示数据的两种不同方式而已。 二、定点数 定点数的意思是:小数点的...
  • JS浮点数表示

    千次阅读 2019-03-04 09:55:41
    遗憾的是,我们常用的分数都是十进制分数1/10,1/100等,二进制浮点数表示法并不能精确的表示类似0.1这样的简单的数字。所以js浮点数运算会不精准。  例如: js加法:9.3+0.3;//结果为9.600000000000001 js加法...
  • 初步了解机器中浮点数表示方法

    千次阅读 2019-04-13 19:16:59
    浮点数是小数点位置变化的数,能表示的范围比定点数大很多。 比如二进制数11.11可以表示为111.1×2-1或1.111×21等,我们由此规律能得到二进制数更一般形式N=2E×F,E称为阶码,F称为尾数。这个数在机器里怎么存呢,...
  • 比如整数6的二进制表示就是压栈顺序为0、1、1,倒序弹出所得110(2)就是6的二进制表示。 小数部分与此相反,0.1*2=0.2取出整数部分0压栈,小数部分0.2继续0.2*2=0.4取出整数部分0压栈,小数部分0.4继续0.4*2=0.8取出...
  • 1.2.2 浮点数表示 1 符号位 2价码位 1.2.3 加减运算 1.2.4 浮点数的使用 1.2浮点数 浮点数是采用科学计数法来表示的,由符号位、有效数字、指数三部分组成。使用浮点数存储和计算的场景无处不在,若使 用...
  • 本文实例讲述了C#实现将浮点数表示的货币数量以汉字大写形式输出的方法。分享给大家供大家参考。具体如下: 1.函数代码 注:本段代码中能转化的最大的数为(1亿亿-0.01),如果要转化更大的浮点数,则需要做适当修改...
  • 32位单精度浮点数表示

    万次阅读 2017-12-19 16:28:58
    32位单精度浮点数表示
  • 定点数与浮点数表示

    千次阅读 2020-02-26 19:36:52
    定点数与浮点数据表示 IEEE754 与十进制转换
  • 汇编学习笔记整理之浮点数表示 鉴于之前学习代码的时候总是因为没有在课后整理笔记并且重新复习而导致知识点掌握不熟练的后果,现在将每次学习的笔记整理至csdn博客中。以便更好的督促自己学习 ```bash 在这里...
  • 32位浮点数 表示范围

    千次阅读 2019-09-23 15:50:36
    32位浮点数 表示范围 计算机组成原理 enter description here 转载于:https://www.cnblogs.com/Howbin/p/10610603.html
  • 浮点数表示与运算

    2019-07-20 16:13:20
    浮点数表示也就是运用了科学记数法的表示方法,如下:其中,r是浮点数的底(一般都默认为2),E是阶码,M是尾数。可见浮点数的存储除去默认的底数后就仅由阶码和尾数构成。阶码E反映浮点数的表...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 247,193
精华内容 98,877
关键字:

浮点数表示