精华内容
下载资源
问答
  • 用一个浮点数相加的例子来演示计算机在计算时所产生的误差。在Python中,用0.2+0.4 会得到0.6000000000000001。浮点数简介浮点数的表示方法:目前流行的浮点数标准是IEEE754。用64个bit来表示精度。首位为符号位s...

    用一个浮点数相加的例子来演示计算机在计算时所产生的误差。

    在Python中,用0.2+0.4 会得到0.6000000000000001。

    浮点数简介

    浮点数的表示方法:目前流行的浮点数标准是IEEE754。用64个bit来表示双精度。

    首位为符号位s,0代表正,1代表负。

    接下来的11位代表指数,将其理解为一个无符号的数字e,例如,00000000011就代表3。定义指数(阶码)M和偏置Bias,其中偏置,定义,容易看出E的范围为-1022到+1023。对于单精度,。

    最后的52位是编码尾数M,第一位的权重是1/2,第二位的权重是1/4…  第52位的权重是。这里有一个隐藏位,在首位之前,代表1.因此M的范围实际上是. 当52位全为0时,M为1 当全为1时,M非常接近2,但还差了一个

    浮点数. M在1到2之间,E在到,这两者配合无论是精度还是范围都足够大了。

    浮点数加法(以0.2+0.4为例)

    浮点数加法的计算步骤:浮点数有自己的一套计算方法,以下借助例子详细阐述,总之核心思想就是保持阶码一致,当需要移位的时候,就抛弃掉尾数的最后一位,因为这一位的权重最小,但就是抛弃尾数的最后几位导致了误差。

    对阶&移位-->有效数求和-->规格化-->舍入处理-->溢出判断.

    以0.2+0.4为例逐步分析。

    首先,利用http://www.binaryconvert.com  将0.2和0.4转换为二进制表示,之后从二进制到十进制的逆转换同样是由这个网站完成的。

    0.2:0 01111111100 1001100110011001100110011001100110011001100110011010

    0.4:0 01111111101 1001100110011001100110011001100110011001100110011010

    为了下面阐述方便,直接将隐藏位也一起写出来。

    0.2:0 01111111100 11001100110011001100110011001100110011001100110011010

    0.4:0 01111111101 11001100110011001100110011001100110011001100110011010

    简单check一下,可以看出0.2的阶码E=-3,也就是1/8,乘上M后可以得到0.2;同理0.4的阶码E=-2.

    1.对阶&移位

    对阶:先求阶差,明显0.2的阶码比0.4的阶码小1.

    移位:小码向大码看齐,即将0.2的阶码变成-2,同时将尾数右移一位。这个操作其实就是让阶码+1,导致原数V扩大两倍,同时尾数右移一位,导致原数V缩小两倍。二者相互抵消。要注意在移动尾数时要连隐藏位一起移动,同时抛弃末位。这样一来0.2变为:

    0.2:0 01111111101 01100110011001100110011001100110011001100110011001101

    2.有效数求和

    将0.2和0.4的尾数求和,包含隐藏位

    0.2:01100110011001100110011001100110011001100110011001101

    0.4:11001100110011001100110011001100110011001100110011010

    同样利用一个小网站http://www.99cankao.com  来实现这一计算,计算结果已经过手动check,为:

    100110011001100110011001100110011001100110011001100111

    有5位。

    3.规格化

    双精度数字只允许尾数为52位,所以上述求和的数字要进行规格化,即将原来的大阶码(-2)加一,变成-1,即01111111110

    同时将尾数和右移,与前面移位中类似,阶码+1让V乘以2,尾数右移让V除以2。但要注意此时右移是不包括隐藏位的,简单分析一下原因:

    如果不进行规格化,相当于:

    100110011001100110011001100110011001100110011001100111

    中,10的权重为1,也即换位十进制为1*2+0+1=2,再加上后面的小数,我们这里假设为0.4(数字随便取的,只为了说明方便)。那么此时尾数M=2.4. 为了使其回到原本的浮点数表示,我们将阶码加一,那么相应的尾数就要除以2,变成1.2。在浮点数表示中,隐藏位始中给出一个1,就需要尾数给出0.2,这样才能得到1.2。那么自然地,100110011001100110011001100110011001100110011001100111中,黑色部分给出0.4,将其右移一位,抛弃末位,就可以得到0.2。

    综上所述,规格化时尾数的移位不包括隐藏位,但是第一步移位的时候要带上隐藏位,原因是相似的,这里就不展开了。

    4.舍入处理

    在对0.2规格化时,100110011001100110011001100110011001100110011001100111,末位是1,IEEE754的策略是0舍1入,因此去掉隐藏位,初位前加0,抛弃末位,并加一后变为:

    0011001100110011001100110011001100110011001100110100

    5.溢出处理

    整合得到最后的结果为

    0 01111111110 0011001100110011001100110011001100110011001100110100

    这就是我们最后得到的0.2+0.4得二进制表示,将其转换为十进制看一下结果:

    0011111111100011001100110011001100110011001100110011001100110100

    可以看出最后的结果6.00000000000000088817841970013E-1,略大于0.6,在Python中将其处理为0.6000000000000001也就很自然了。

    总结

    通过这个例子我们可以看出,计算机表示数字具有天然的误差,不管你采用多高的精度,多少个bit,最后至少都会产生一个的误差。

    展开全文
  • 用一个浮点数相加的例子来演示计算机在计算时所产生的误差。在Python中,用0.2+0.4 会得到0.6000000000000001。浮点数简介浮点数的表示方法:目前流行的浮点数标准是IEEE754。用64个bit来表示精度。首位为符号位s...

    感觉跟专栏主题不是很搭... 不过这是这学期计算物理的作业,还是放上来吧,也算勉强沾边了吧。

    用一个浮点数相加的例子来演示计算机在计算时所产生的误差。

    在Python中,用0.2+0.4 会得到0.6000000000000001。

    浮点数简介

    浮点数的表示方法:目前流行的浮点数标准是IEEE754。用64个bit来表示双精度。

    首位为符号位s,0代表正,1代表负。

    接下来的11位代表指数,将其理解为一个无符号的数字e,例如,00000000011就代表3。定义指数(阶码)M和偏置Bias,其中偏置,定义,容易看出E的范围为-1022到+1023。对于单精度,。

    最后的52位是编码尾数M,第一位的权重是1/2,第二位的权重是1/4… 第52位的权重是。这里有一个隐藏位,在首位之前,代表1.因此M的范围实际上是. 当52位全为0时,M为1 当全为1时,M非常接近2,但还差了一个

    浮点数. M在1到2之间,E在到,这两者配合无论是精度还是范围都足够大了。

    浮点数加法(以0.2+0.4为例)

    浮点数加法的计算步骤:浮点数有自己的一套计算方法,以下借助例子详细阐述,总之核心思想就是保持阶码一致,当需要移位的时候,就抛弃掉尾数的最后一位,因为这一位的权重最小,但就是抛弃尾数的最后几位导致了误差。

    对阶&移位-->有效数求和-->规格化-->舍入处理-->溢出判断.

    以0.2+0.4为例逐步分析。

    首先,利用http://www.binaryconvert.com 将0.2和0.4转换为二进制表示,之后从二进制到十进制的逆转换同样是由这个网站完成的。

    0.2:0 01111111100 1001100110011001100110011001100110011001100110011010

    0.4:0 01111111101 1001100110011001100110011001100110011001100110011010

    为了下面阐述方便,直接将隐藏位也一起写出来。

    0.2:0 01111111100 11001100110011001100110011001100110011001100110011010

    0.4:0 01111111101 11001100110011001100110011001100110011001100110011010

    简单check一下,可以看出0.2的阶码E=-3,也就是1/8,乘上M后可以得到0.2;同理0.4的阶码E=-2.

    1. 对阶&移位

    对阶:先求阶差,明显0.2的阶码比0.4的阶码小1.

    移位:小码向大码看齐,即将0.2的阶码变成-2,同时将尾数右移一位。这个操作其实就是让阶码+1,导致原数V扩大两倍,同时尾数右移一位,导致原数V缩小两倍。二者相互抵消。要注意在移动尾数时要连隐藏位一起移动,同时抛弃末位。这样一来0.2变为:

    0.2:0 01111111101 01100110011001100110011001100110011001100110011001101

    2. 有效数求和

    将0.2和0.4的尾数求和,包含隐藏位

    0.2:01100110011001100110011001100110011001100110011001101

    0.4:11001100110011001100110011001100110011001100110011010

    同样利用一个小网站http://www.99cankao.com 来实现这一计算,计算结果已经过手动check,为:

    100110011001100110011001100110011001100110011001100111

    有5位。

    3. 规格化

    双精度数字只允许尾数为52位,所以上述求和的数字要进行规格化,即将原来的大阶码(-2)加一,变成-1,即01111111110

    同时将尾数和右移,与前面移位中类似,阶码+1让V乘以2,尾数右移让V除以2。但要注意此时右移是不包括隐藏位的,简单分析一下原因:

    如果不进行规格化,相当于:

    100110011001100110011001100110011001100110011001100111

    中,10的权重为1,也即换位十进制为1*2+0+1=2,再加上后面的小数,我们这里假设为0.4(数字随便取的,只为了说明方便)。那么此时尾数M=2.4. 为了使其回到原本的浮点数表示,我们将阶码加一,那么相应的尾数就要除以2,变成1.2。在浮点数表示中,隐藏位始中给出一个1,就需要尾数给出0.2,这样才能得到1.2。那么自然地,100110011001100110011001100110011001100110011001100111中,黑色部分给出0.4,将其右移一位,抛弃末位,就可以得到0.2。

    综上所述,规格化时尾数的移位不包括隐藏位,但是第一步移位的时候要带上隐藏位,原因是相似的,这里就不展开了。

    4. 舍入处理

    在对0.2规格化时,100110011001100110011001100110011001100110011001100111,末位是1,IEEE754的策略是0舍1入,因此去掉隐藏位,初位前加0,抛弃末位,并加一后变为:

    0011001100110011001100110011001100110011001100110100

    5. 溢出处理

    整合得到最后的结果为

    0 01111111110 0011001100110011001100110011001100110011001100110100

    这就是我们最后得到的0.2+0.4得二进制表示,将其转换为十进制看一下结果:

    0011111111100011001100110011001100110011001100110011001100110100

    可以看出最后的结果6.00000000000000088817841970013E-1,略大于0.6,在Python中将其处理为0.6000000000000001也就很自然了。

    总结

    通过这个例子我们可以看出,计算机表示数字具有天然的误差,不管你采用多高的精度,多少个bit,最后至少都会产生一个的误差。

    展开全文
  • 计算机组成原理专题之浮点数运算

    千次阅读 多人点赞 2020-03-08 14:29:15
    计算机组成原理专题之浮点数运算 我们组原老师也甚是神奇。ppt一发,博客链接一发。大家自己看ppt,看ppt有困难的同学看博客链接。。。我一脸懵。。。 真的,例题我看不懂。。。不是假话。。然后我就一个概念一个...

    计算机组成原理专题之浮点数运算

    我们组原老师也甚是神奇。ppt一发,博客链接一发。大家自己看ppt,看ppt有困难的同学看博客链接。。。我一脸懵。。。
    真的,例题我看不懂。。。不是假话。。然后我就一个概念一个概念的处理了。。

    进行浮点加减法运算时,需要完成0操作数检查,对阶,尾数求和,结果规格化,舍入处理,溢出处理等步骤。
    这里介绍几个概念:
    双符号位:是检查计算机运算溢出的。是采用双符号位。00表示正号,11表示负号。
    如果最高位进位讲导致符号位不一致。
    结果的符号位有两种01和10.
    结果的符号位为01时:为上溢
    结果符号位为10时:为下溢
    什么是上溢什么是下溢:
    百度解释的很官方。。
    上溢:是当一个超长的数据进入到缓冲区时,超出部分被写入上级缓冲区,上级缓冲区存放的可能是数据、上一条指令的指针,或者是其他程序的输出内容,这些内容都被覆盖或者破坏掉。可见一小部分数据或者一套指令的溢出就可能导致一个程序或者操作系统崩溃。
    下溢:是当一个超长的数据进入到缓冲区时,超出部分被写入下级缓冲区,下级缓冲区存放的是下一条指令的指针,或者是其他程序的输出内容。
    这么官方的解释让我一个学计科的都很懵。。。(可能是我学艺不精)
    简单点:
    产生下溢的时候是接近0的时候被四舍五入为0的时候
    产生上溢的时候是很大的数字被近似为正无穷或者负无穷。

    比如这个例子:
    例如设X = + 1000001,Y = + 1000011,采用双符号位表示X=00 1000001,Y=00 1000011,[X + Y]补=01 0000100,01运算结果产生了正溢出。
    那么什么时候会产生溢出呢?
    当两个同符号的数相加(或者是相异符号数相减)时,运算结果有可能产生溢出。常用的溢出检测机制主要有进位判决法和双符号位判决法。
    再比如相异符号数相减时:
    设x=0.1101,y=-0.0111,符号位为双符号位 ,用补码求x-y
    [x-y]补=[x]补+[-y]补=00 1101+00 0111=01 0100 结果错误,正溢出

    浮点数的常用表示方法:
    N = R^E * M
    N为浮点数,R为基底,E为阶码,M为尾数。
    比如:1
    2为R,基底,010为E,阶码,0.11011011为M,尾数

    浮点数加减法运算的时候均用补码形式。因为计算机内部都是采用补码形式。
    变形补码。因为原码看不出来正数负数。
    补码可以识别正数和负数。
    这里采用的都是符号位两位,阶码双符号位,尾数双符号位。(上面说的)

    1.对阶
    就是把阶码小的转换为阶码大的。小阶向大阶看齐。
    如1.1 * 2 ^ 3 和 1.2 * 2 ^ 4
    就是把1.1*2^3,把尾数右移一位。阶码加1。
    比如:
    1
    2
    这里采用补码表示:
    阶码双符号位表示:
    [X]浮 = 00 010
    [Y]浮 = 00 100
    尾数双符号位表示:
    [X]浮 = 00.11011011
    Y的原码:11.10101100
    Y的反码:11.01010011
    Y的补码:11.01010100
    [Y]浮 = 11.01010100

    Y的阶码:
    这里相减相当于加上负数
    [-Y]原 = 11 100
    [-Y]反 = 11 011
    [-Y]补 = 11 100
    我们把阶码对阶。就是E = Ex - Ey = 00010 + 11 100 = 11 110
    把这个补码转换为原码得:11 010
    即为-2
    那么是X的阶码小,将X的尾数右移两位,X的阶码加2
    所以[X]浮 = 00100,00.00110110(11)

    2.尾数求和
    3
    如果是相减的化,相当于加上减数的相反数。就是把减数转化为对应的相反数的补码相加即可

    3.规格化
    分为右规和左规
    两个符号位不同的时候右规。就是我上面说的情况除了00或者11其余是符号位不相同的情况。
    即01 …和 10 …
    以上两种情况将其右移。
    即01…右移一位是001…
    即10…右移一位是110…
    然后阶码加1

    两个符号位相同但是最高位的数值与符号位相同就是左规
    两种情况就是111…和000…
    111…左移1位的结果为11…0
    000…左移1位的结果为00…0
    然后阶码需要减去移动次数。

    上述式子需要左规
    4
    左移1位阶码减1
    变为:
    1.00010101(10)
    阶码减1

    4.舍入
    舍入有0舍1入法,恒舍法,置1法

    比如上式采用0舍1入法
    因为
    5
    最高位为1
    需要入1
    为:

    6
    如果需要被舍去的最高位为0,那么直接舍去就可以了

    5.判断溢出
    阶码的符号位为00或者01则不溢出
    只需要判断阶码是否溢出即可,尾数不需要判断溢出。只是当前不是规格化数而已
    判断阶码溢出方式上面已经提到
    01为上溢。置溢出标致
    10为下溢。置运算结果为0,阶码和尾数均为0

    好啦~
    这就是浮点数的加减法运算啦~
    若有不足和改进望指点呀~

    展开全文
  • 浮点运算的基本概念和问题 浮点数的表示 IEEE 754单精度表示和精度表示 IEEE 754浮点数的编码表示 IEEE 754标准规定的五种异常情况 ...有关浮点数运算的问题 ...

     

     

    浮点运算的基本概念和问题

    浮点数的表示

     

     

    IEEE 754单精度表示和双精度表示

     

    IEEE 754浮点数的编码表示

     

    IEEE 754标准规定的五种异常情况

     

    有关浮点数运算的问题

     

    展开全文
  • 举个例子,假如说我只能使用整数(即只精确到个位,计算机内的浮点数也只有有限精度,以C语言中的精度浮点数double为例,精度为52个二进制位),要表示任意实数(无限精度)的时候我就只能通过舍入(rounding)来近似...
  • 浮点数运算规格化

    千次阅读 多人点赞 2019-12-07 11:14:20
    临近考试,计算机组成原理令人头疼不已,浮点数运算规格化看书依旧是云里雾里,偶然看到一篇博客,写的很清晰明了,分享一下。 正文 在尾数用补码表示时,规格化浮点数应满足尾数最高数位与符号位不同,如...
  • 用一个浮点数相加的例子来演示计算机在计算时所产生的误差。在Python中,用0.2+0.4 会得到0.6000000000000001。浮点数简介浮点数的表示方法:目前流行的浮点数标准是IEEE754。用64个bit来表示精度。首位为符号位s...
  • 举个例子,假如说我只能使用整数(即只精确到个位,计算机内的浮点数也只有有限精度,以C语言中的精度浮点数double为例,精度为52个二进制位),要表示任意实数(无限精度)的时候我就只能通过舍入(rounding)来...
  • 浮点数计算机中的表示

    万次阅读 多人点赞 2018-07-23 22:44:11
    浮点数 1.1 浮点数在计算机中的表示 1.1.1 指数偏移值 1.1.2 规约浮点数[1] 1.1.3 非规约浮点数 1.2 单精度和精度浮点数 1.3 浮点数转二进制 1.3.1 无小数浮点数转二进制...1.6 规约浮点数和非规约浮点数运算...
  • 用一个浮点数相加的例子来演示计算机在计算时所产生的误差。 在Python中,用0.2+0.4 会得到0.6000000000000001。 浮点数简介 浮点数的表示方法:目前流行的浮点数标准是IEEE754。用64个bit来表示精度。 ...
  • 举个例子,假如说我只能使用整数(即只精确到个位,计算机内的浮点数也只有有限精度,以C语言中的精度浮点数double为例,精度为52个二进制位),要表示任意实数(无限精度)的时候我就只能通过舍入(rounding)来...
  • 前言:在实际工作中,谈到有...浮点数计算机用来表示小数的一种数据类型,采用科学计数法。在java中,double是精度,64位,浮点数,默认是0.0d。float是单精度,32位.浮点数,默认是0.0f;在内存中存储 float...
  • python中实现精确的浮点数运算详解为什么说浮点数缺乏精确性?在开始本文之前,让我们先来谈谈浮点数为什么缺乏精确性的问题,其实这不是Python的问题,而是实数的无限精度跟计算机的有限内存之间的矛盾。举个例子,...
  • 前言:在工作中,谈到有小数点的加减乘除都会想到...浮点数计算机用来表示小数的一种数据类型,采用科学计数法。在java中,double是精度,64位,浮点数,默认是0.0d。float是单精度,32位.浮点数,默认是0.0f; ...
  • 浮点数计算机用来表示小数的一种数据类型,采用科学计数法。在java中,double是精度,64位,浮点数,默认是0.0d。float是单精度,32位.浮点数,默认是0.0f; 在内存中存储 float符号位(1bit)指数(8 bit)尾数...
  • 来源:http://h5ip.cn/qmsp前言在工作中,谈到有小数点的加减乘除都会想到用BigDecimal来...浮点数计算机用来表示小数的一种数据类型,采用科学计数法。在java中,double是精度,64位,浮点数,默认是0.0d。flo...
  • 前言:在工作中,谈到有小数点的加减乘除...浮点数计算机用来表示小数的一种数据类型,采用科学计数法。在java中,double是精度,64位,浮点数,默认是0.0d。float是单精度,32位.浮点数,默认是0.0f;在内存...
  • 来源:http://h5ip.cn/qmsp前言在工作中,谈到有小数点的加减乘除都会想到用BigDecimal来...浮点数计算机用来表示小数的一种数据类型,采用科学计数法。在java中,double是精度,64位,浮点数,默认是0.0d。flo...
  • 定点数硬件实现简单,但表示的范围有限,且部分的小数运算IP核只支持浮点数运算,因此这里还需要提到浮点数的相关内容。通过介绍FPGA浮点数的表示方法和用法,进而讲述计算机浮点数的表示规则,这部分涉及数电,微机...
  • 浮点数的加减法对阶尾数求和尾数规格化溢出判断 对阶 对阶的目的是使得两个浮点数阶码一致,使得尾数可以进行运算 浮点数尾数运算简单 ...符号位不一致下需要右移(定点运算的溢出情况) 右移的
  • 在对浮点数进行 +-*/ 计算的时候,有时会...首先我们要知道浮点数的表示(IEEE 754:是IEEE二进位浮点数算数标准的编号),具体内容如下:浮点数,以64位的长度(精度)为例,会采用1位符号位(E), 11指数位(Q...
  • 说来惭愧,作为计算机科班出身的人,计算机基础知识掌握并不扎实,这里的基础指的是计算机体系结构中的内容,诸如数据的表示和处理,如float的表示和运算等。看《CSAPP》方知人家老外把这个东西当成重中之重,大量...
  • 引言最近被数值计算的问题困扰,索性做一个梳理,与君分享,温故而...指数偏移值--阶码规约与非规约以及其它特殊值浮点数的舍入浮点数运算----加法运算浮点数运算----乘法运算什么是IEEE-754?IEEE二进制浮点数...
  • 在C/C++中float是32位的,double是64位的,两者在内存中的存储方式和能够表示的精度均不同,目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。 无论是float还是double,在内存中的存储...
  • IEEE 754 规定的精度浮点数表示(来自中文wikipedia):sign bit(符号): 用来表示正负号exponent(指数): 用来表示次方数mantissa(尾数): 用来表示精确度 摘 要浮点数的表示和存储直接影响计算机的结构和性能,IEEE ...
  • 0.00011001100110011001100110011001100110011001100110011001100python是以精度(64bit)来保存浮点数的,后面多余的会被砍掉,所以在电脑上实际保存的已经小于0.1的值了,后面拿来参与运算就产生了误差。...
  • 运算方法和运算器 3.1 补码 两个补码相加,等于相加取补码(减法相同) 正溢出:两个正数相加—负溢出 溢出的表现 1.数值的最高位和符号位只有一个进位; 2.使用符号位,11表示正,00表示负,变成异号则溢出(10...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 154
精华内容 61
关键字:

双浮点数运算计算机